You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

关键修改点说明:

  1. 折线图Y轴位置:在y编码里通过axis=alt.Axis(orient='right')明确指定该轴显示在右侧,同时给两个Y轴分别加标题,用户能一眼区分对应的数据类型。
  2. 比例尺独立:分面后调用resolve_scale(y='independent'),确保柱状图和折线图的Y轴不会被强制统一范围,各自适配自身的数据区间。
  3. 细节优化:给折线图加上point=True,让数据点可视化更清晰,方便读取具体数值。

这样调整后,每个分面都会呈现独立的左、右双Y轴,完美匹配你想要的效果~

备注:内容来源于stack exchange,提问作者catun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 16:19:34