标尺与图例分辨率#

创建复合图表(参见 分层与多视图图表)时,Altair 默认使用共享的图表标尺和图例(例如轴、图例等)。可以使用 Chart.resolve_scale()Chart.resolve_axis()Chart.resolve_legend() 函数调整此默认设置。

例如,假设你想连接两个使用不同颜色标尺的图表;默认行为是为两个颜色编码域的并集创建颜色标尺

import altair as alt
from vega_datasets import data

source = data.cars()

base = alt.Chart(source).mark_point().encode(
    x='Horsepower:Q',
    y='Miles_per_Gallon:Q'
).properties(
    width=200,
    height=200
)

alt.concat(
    base.encode(color='Origin:N'),
    base.encode(color='Cylinders:O')
)

可以通过将颜色的标尺分辨率设置为 "independent"(独立),而不是默认的 "shared"(共享)来更改此默认设置。

alt.concat(
    base.encode(color='Origin:N'),
    base.encode(color='Cylinders:O')
).resolve_scale(
    color='independent'
)

双 Y 轴#

合并包含不同度量的图表时,一种常用技术是使用双 Y 轴。使用 Altair 有两种策略来实现这一结果。第一种是手动指定每个图层的标记颜色和相关的轴标题颜色。

import altair as alt
from vega_datasets import data

source = data.cars()

base = alt.Chart(source).encode(x='year(Year):T')

line_A = base.mark_line(color='#5276A7').encode(
    alt.Y('average(Horsepower):Q').axis(titleColor='#5276A7')
)

line_B = base.mark_line(color='#F18727').encode(
    alt.Y('average(Miles_per_Gallon):Q').axis(titleColor='#F18727')
)

alt.layer(line_A, line_B).resolve_scale(y='independent')

在这种情况下,轴颜色充当伪图例。或者,如果你想要图例,则必须应用 FilterFold。图例仅在 Vega-Lite 中创建以表示编码。

base = alt.Chart(source).mark_line().transform_fold(
    ['Horsepower', 'Miles_per_Gallon'],
    as_=['Measure', 'Value']
).encode(
    alt.Color('Measure:N'),
    alt.X('year(Year):T')
)

line_A = base.transform_filter(
    alt.datum.Measure == 'Horsepower'
).encode(
    alt.Y('average(Value):Q').title('Horsepower')
)

line_B = base.transform_filter(
    alt.datum.Measure == 'Miles_per_Gallon'
).encode(
    alt.Y('average(Value):Q').title('Miles_per_Gallon')
)

alt.layer(line_A, line_B).resolve_scale(y='independent')

请注意,双轴图表可能会误导您理解数据中的关系。关于此主题的更多阅读,请参见 Lisa Charlotte Rost 的《反对双轴图表的论点》