如何使用Altair创建带双轴的分面分层图表?
如何使用Altair创建带双轴的分面分层图表?
我完全懂你的需求——想在分面的Altair图表里,让柱状图用左侧Y轴,折线图用右侧Y轴,之前试了resolve_scale(y='independent')没达到预期对吧?其实问题出在没明确指定折线图的Y轴位置,咱们调整下代码就能实现:
核心思路是给折线图单独配置右侧Y轴,再结合分面的比例尺独立设置,具体修改后的完整代码如下:
import altair as alt import pandas as pd data = { 'Date': ['2023-01-01', '2023-01-02', '2023-01-01', '2023-01-02', '2023-01-01', '2023-01-02', '2023-01-01', '2023-01-02', '2023-01-01', '2023-01-02', '2023-01-01', '2023-01-02', '2023-01-01', '2023-01-02', '2023-01-01', '2023-01-02'], 'Value': [50, 200, 300, 150, 250, 350, 200, 200, 10, 20, 15, 20, 20, 30, 20, 30], 'DESCR': ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'D', 'D', 'D', 'D'], 'Company': ['X', 'X', 'Y', 'Y', 'X', 'X', 'Y', 'Y', 'X', 'X', 'Y', 'Y', 'X', 'X', 'Y', 'Y'], } source = pd.DataFrame(data) # 柱状图:使用左侧默认Y轴,添加标题方便区分 bars = alt.Chart(source).mark_bar().transform_filter( "(datum.DESCR=='A') | (datum.DESCR=='B')" ).encode( x='Date:N', y=alt.Y('Value:Q', title='柱状图数值'), color=alt.Color('DESCR:N', legend=alt.Legend(title=None)) ) # 折线图:关键配置右侧Y轴,同时设置标题 lines = alt.Chart(source).mark_line(point=True).transform_filter( "(datum.DESCR=='C') | (datum.DESCR=='D')" ).encode( x='Date:N', y=alt.Y('Value:Q', title='折线图数值', axis=alt.Axis(orient='right')), # 强制Y轴显示在右侧 stroke=alt.Stroke('DESCR:N', legend=alt.Legend(title=None), scale=alt.Scale(scheme='redblue')) ) # 组合图层+分面,开启Y轴比例尺独立 chart = (bars + lines).facet( column='Company:N' ).resolve_scale( y='independent' # 让两个Y轴各自使用数据的范围计算比例尺 ) chart
关键修改点说明:
- 折线图Y轴位置:在
y编码里通过axis=alt.Axis(orient='right')明确指定该轴显示在右侧,同时给两个Y轴分别加标题,用户能一眼区分对应的数据类型。 - 比例尺独立:分面后调用
resolve_scale(y='independent'),确保柱状图和折线图的Y轴不会被强制统一范围,各自适配自身的数据区间。 - 细节优化:给折线图加上
point=True,让数据点可视化更清晰,方便读取具体数值。
这样调整后,每个分面都会呈现独立的左、右双Y轴,完美匹配你想要的效果~
备注:内容来源于stack exchange,提问作者catun
相关产品推荐
相关产品推荐

