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

如何用Altair将两个堆叠条形图并排绘制?

解决方法

要实现每个月份下两个属性(prediction/label)的堆叠条形图并排展示,核心是将数据转为长格式,让Altair能统一处理两个属性的堆叠逻辑,同时调整编码实现并排效果。以下是修正后的完整代码及说明:

1. 修正数据格式

首先把原宽表转为长表,新增attribute字段区分是prediction还是label,category字段存对应类别值:

import pandas as pd
from datetime import datetime 
from dateutil.relativedelta import relativedelta
import random
import altair as alt

# 模拟数据(保持原逻辑)
df = pd.DataFrame(data={
    "date": [datetime.now()+relativedelta(month=+i) for i in range(5)],
    "label": random.choices(["positive", "negative"], k=5),
    "prediction": random.choices(["likely", "very_likely", "unlikely", "very_unlikely"], k=5),
    "indicator": random.choices(["0", "1"], k=5),
})

# 转为长格式
df_melted = df.melt(
    id_vars=['date', 'indicator'],
    value_vars=['prediction', 'label'],
    var_name='attribute',
    value_name='category'
)

2. 修正绘图代码

利用长表数据,实现同一月份下两个属性的堆叠条并排,同时保留交互选择和计数标注:

# 通用选择器:根据category筛选,绑定图例
selection = alt.selection_multi(fields=['category'], bind='legend')

# 堆叠条形图
bars = alt.Chart(df_melted).mark_bar().encode(
    # x轴:attribute实现并排,count(category)作为堆叠长度
    x=alt.X('attribute:N', title='属性'),
    x2=alt.X2('count(category):Q', stack='zero'),
    # y轴:月份
    y=alt.Y('month(date):N', title=None),
    # 颜色映射category,区分不同类别
    color=alt.Color('category:N', scale=alt.Scale(scheme='tableau10')),
    # 交互透明度
    opacity=alt.condition(selection, alt.value(1), alt.value(0.2)),
    # Tooltip显示详细信息
    tooltip=['attribute:N', 'category:N', 'count(category):Q']
).add_selection(selection)

# 堆叠块内的计数文本标注
text = alt.Chart(df_melted).mark_text(
    dx=-10, dy=3, color='white'
).encode(
    x=alt.X('count(category):Q', stack='zero'),
    y=alt.Y('month(date):N'),
    detail='category:N',
    text=alt.Text('count(category):Q', format='.0f'),
    # 仅在选中时显示文本(可选)
    opacity=alt.condition(selection, alt.value(1), alt.value(0))
)

# 按indicator分栏展示
plot = alt.layer(bars, text).facet(
    column=alt.Column('indicator:N', title='Indicator分组')
).resolve_scale(
    color='independent'  # 让两个属性的图例独立,避免颜色冲突
)

plot.show()

关键修改说明

  • 数据重塑:通过melt将两个属性合并为统一字段,让Altair能同时处理两个属性的堆叠逻辑,避免重复编写图表代码
  • 并排实现:用attribute作为x轴,count(category)作为堆叠的长度,实现同一月份下两个属性的堆叠条并排
  • 交互优化:统一选择器逻辑,绑定所有category的图例,同时通过resolve_scale(color='independent')避免两个属性的颜色冲突
  • 文本标注:修正原代码的拼写错误,正确映射每个堆叠块的计数,可选设置仅在选中时显示文本减少视觉干扰

内容的提问来源于stack exchange,提问作者c.uent

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:25:31