如何用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
相关产品推荐
相关产品推荐

