Altair:将 Log10 轴裁剪到所需的间隔(域)
Altair: Crop Log10 axis to desired interval (domain)
在Python中使用Altair,是否可以在指定值处裁剪Log10轴?
我只想在对数刻度上显示 5 - 50。
下面是我的代码和我得到的图像:
import altair as alt
import pandas as pd
from vega_datasets import data
cars = data.cars()
nice = pd.DataFrame([{'x_min': [0],
'x_max': [240],
'y_min': [5],
'y_max': [10]}])
good = pd.DataFrame([{'x_min': [0],
'x_max': [240],
'y_min': [10],
'y_max': [20]}])
bad = pd.DataFrame([{'x_min': [0],
'x_max': [240],
'y_min': [20],
'y_max': [50]}])
mpg_nice_fill = alt.Chart(nice).mark_rect(color= 'green', opacity=0.2).encode(
x='x_min:Q',
x2='x_max:Q',
y='y_min:Q',
y2='y_max:Q'
)
mpg_good_fill = alt.Chart(good).mark_rect(color= 'yellow', opacity=0.2).encode(
x='x_min:Q',
x2='x_max:Q',
y='y_min:Q',
y2='y_max:Q'
)
mpg_bad_fill = alt.Chart(bad).mark_rect(color= 'red', opacity=0.2).encode(
x='x_min:Q',
x2='x_max:Q',
y='y_min:Q',
y2='y_max:Q'
)
chart = alt.Chart(cars).mark_point().encode(
x='Horsepower',
y= alt.Y('Miles_per_Gallon', scale= alt.Scale(type= 'log')),
color='Origin',
)
alt.layer(chart + mpg_nice_fill + mpg_good_fill + mpg_bad_fill + chart
)
这在科学上可能是正确的,但我认为删除白色区域(< 5 mpg
和 > 50 mpg
域)会让我在美学上更好。但是,alt.Y()
中的 domain = (5, 50)
对我不起作用。
域参数确实适用于对数刻度,但域必须以基数的整数次方开始和结束,其他值将四舍五入到下一个整数次方。
例如,这是一个默认的 base-10 域:
import altair as alt
import pandas as pd
data = pd.DataFrame({'x': [1, 10, 100]})
alt.Chart(data).mark_point().encode(
x=alt.X('x', scale=alt.Scale(type='log'))
)
这是一个 base-2 域,限制设置为 1 和 256:
alt.Chart(data).mark_point().encode(
x=alt.X('x', scale=alt.Scale(type='log', base=2, domain=[1, 256]))
)
不幸的是,Vega-Lite 没有提供任何方法来将对数域设置为基数的非整数幂。
对于上面的图表,8 到 64 之间的以 2 为底的对数刻度可能比较合适:
alt.Chart(cars).mark_point().encode(
x='Horsepower',
y= alt.Y('Miles_per_Gallon', scale= alt.Scale(type= 'log', base=2, domain=[8, 64])),
color='Origin',
)
在Python中使用Altair,是否可以在指定值处裁剪Log10轴? 我只想在对数刻度上显示 5 - 50。
下面是我的代码和我得到的图像:
import altair as alt
import pandas as pd
from vega_datasets import data
cars = data.cars()
nice = pd.DataFrame([{'x_min': [0],
'x_max': [240],
'y_min': [5],
'y_max': [10]}])
good = pd.DataFrame([{'x_min': [0],
'x_max': [240],
'y_min': [10],
'y_max': [20]}])
bad = pd.DataFrame([{'x_min': [0],
'x_max': [240],
'y_min': [20],
'y_max': [50]}])
mpg_nice_fill = alt.Chart(nice).mark_rect(color= 'green', opacity=0.2).encode(
x='x_min:Q',
x2='x_max:Q',
y='y_min:Q',
y2='y_max:Q'
)
mpg_good_fill = alt.Chart(good).mark_rect(color= 'yellow', opacity=0.2).encode(
x='x_min:Q',
x2='x_max:Q',
y='y_min:Q',
y2='y_max:Q'
)
mpg_bad_fill = alt.Chart(bad).mark_rect(color= 'red', opacity=0.2).encode(
x='x_min:Q',
x2='x_max:Q',
y='y_min:Q',
y2='y_max:Q'
)
chart = alt.Chart(cars).mark_point().encode(
x='Horsepower',
y= alt.Y('Miles_per_Gallon', scale= alt.Scale(type= 'log')),
color='Origin',
)
alt.layer(chart + mpg_nice_fill + mpg_good_fill + mpg_bad_fill + chart
)
这在科学上可能是正确的,但我认为删除白色区域(< 5 mpg
和 > 50 mpg
域)会让我在美学上更好。但是,alt.Y()
中的 domain = (5, 50)
对我不起作用。
域参数确实适用于对数刻度,但域必须以基数的整数次方开始和结束,其他值将四舍五入到下一个整数次方。
例如,这是一个默认的 base-10 域:
import altair as alt
import pandas as pd
data = pd.DataFrame({'x': [1, 10, 100]})
alt.Chart(data).mark_point().encode(
x=alt.X('x', scale=alt.Scale(type='log'))
)
这是一个 base-2 域,限制设置为 1 和 256:
alt.Chart(data).mark_point().encode(
x=alt.X('x', scale=alt.Scale(type='log', base=2, domain=[1, 256]))
)
不幸的是,Vega-Lite 没有提供任何方法来将对数域设置为基数的非整数幂。
对于上面的图表,8 到 64 之间的以 2 为底的对数刻度可能比较合适:
alt.Chart(cars).mark_point().encode(
x='Horsepower',
y= alt.Y('Miles_per_Gallon', scale= alt.Scale(type= 'log', base=2, domain=[8, 64])),
color='Origin',
)