Altair 上的双轴 - 过滤源
Dual Axis on Altair - filtering source
Altair 图表在 Python 中非常出色,因为它很容易添加悬停数据注释(与 Seaborn 不同)并且添加额外的 'marks'(线条、条形等)比 Plotly 更清晰,但是一个我挣扎的是双轴。这通常工作正常(类似于文档 https://altair-viz.github.io/gallery/layered_chart_with_dual_axis.html):
import altair as alt
from vega_datasets import data
source = data.seattle_weather()
chart_base = alt.Chart(source.query("weather != 'snow'")).encode(
alt.X('date:T',
axis=alt.Axis(),
scale=alt.Scale(zero=False)
)
).properties(width=800, height=400)
line_prec = chart_base.mark_line(color='blue', size=1).encode(y='mean(precipitation)')
line_temp = chart_base.mark_line(color='red', size=1).encode(y='mean(temp_max)')
alt.layer(line_prec, line_temp).resolve_scale(y='independent')
... 所以我需要做的就是过滤单个标记,类似于 source.query 但假设我们只想在“天气 == 'rain'” 和 temp_max 其中“天气!= 'rain'”(是的,在分析上没有洞察力,只是为了说明双重过滤器的工作示例)。
解决方案可能是 但 DRYer 代码不是双轴的并且更有前途但是多层方法似乎不适用于双轴,因为我们尝试添加时出错(相当绝望) .resolve_scale(y='independent'):
chart_precip = alt.Chart(source.query("weather == 'rain'")).mark_line(color='blue', size=1).encode(
y='mean(precipitation)',
x=('date:T')
).properties(width=500, height=300) #.resolve_scale(y='independent') # can't add resolve_scale
chart_temp = alt.Chart(source.query("weather != 'rain'")).mark_line(color='red', size=1).encode(
y='mean(temp_max)',
x=('date:T')
).properties(width=500, height=300) #.resolve_scale(y='independent') # can't add resolve_scale
chart_precip + chart_temp
能用但是没有标注双轴,不好:
那么...有没有办法简单地单独过滤双轴标记?
您可以通过在分层图表而不是单个图层上设置 resolve_scale(y='independent')
来实现双轴:
(chart_precip + chart_temp).resolve_scale(y='independent')
请注意 chart_precip + chart_temp
只是 alt.layer(chart_precip, chart_temp)
的 shorthand,因此这与您的第一个示例非常相似。
Altair 图表在 Python 中非常出色,因为它很容易添加悬停数据注释(与 Seaborn 不同)并且添加额外的 'marks'(线条、条形等)比 Plotly 更清晰,但是一个我挣扎的是双轴。这通常工作正常(类似于文档 https://altair-viz.github.io/gallery/layered_chart_with_dual_axis.html):
import altair as alt
from vega_datasets import data
source = data.seattle_weather()
chart_base = alt.Chart(source.query("weather != 'snow'")).encode(
alt.X('date:T',
axis=alt.Axis(),
scale=alt.Scale(zero=False)
)
).properties(width=800, height=400)
line_prec = chart_base.mark_line(color='blue', size=1).encode(y='mean(precipitation)')
line_temp = chart_base.mark_line(color='red', size=1).encode(y='mean(temp_max)')
alt.layer(line_prec, line_temp).resolve_scale(y='independent')
... 所以我需要做的就是过滤单个标记,类似于 source.query 但假设我们只想在“天气 == 'rain'” 和 temp_max 其中“天气!= 'rain'”(是的,在分析上没有洞察力,只是为了说明双重过滤器的工作示例)。
解决方案可能是
chart_precip = alt.Chart(source.query("weather == 'rain'")).mark_line(color='blue', size=1).encode(
y='mean(precipitation)',
x=('date:T')
).properties(width=500, height=300) #.resolve_scale(y='independent') # can't add resolve_scale
chart_temp = alt.Chart(source.query("weather != 'rain'")).mark_line(color='red', size=1).encode(
y='mean(temp_max)',
x=('date:T')
).properties(width=500, height=300) #.resolve_scale(y='independent') # can't add resolve_scale
chart_precip + chart_temp
能用但是没有标注双轴,不好:
那么...有没有办法简单地单独过滤双轴标记?
您可以通过在分层图表而不是单个图层上设置 resolve_scale(y='independent')
来实现双轴:
(chart_precip + chart_temp).resolve_scale(y='independent')
请注意 chart_precip + chart_temp
只是 alt.layer(chart_precip, chart_temp)
的 shorthand,因此这与您的第一个示例非常相似。