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',
)