如何用Altair在同一水平条形图中绘制同数据框的两个变量
如何使用Altair在同一水平条形图中绘制同一数据框中的两个变量?
问题背景
你现有如下Pandas DataFrame:
# initialize list of lists data = [['AAA','71.15','FOUSA06C1Y'], ['AA','2.93','FOUSA06C1Y'], ['A','11.9','FOUSA06C1Y'], ['BBB','14.04','FOUSA06C1Y'], ['BB','0.0','FOUSA06C1Y'], ['B','0.0','FOUSA06C1Y'], ['Below B','0.0','FOUSA06C1Y'], ['Not Rated','-0.02','FOUSA06C1Y'], ['AAA','34.81744518','1404'], ['AA','47.24845367','1404'], ['A','16.66257244','1404'], ['BBB','1.271528716','1404'], ['BB / B','0.0','1404'], ['Below B','0.0','1404'], ['Short Term Rated','0.0','1404'], ['Not Rated','0.0','1404'], ['Nan','0.0','1404']] # Create the pandas DataFrame df = pd.DataFrame(data, columns=['index', 'value','fund']) df['value'] = df['value'].astype(float)
当前你用以下代码绘制的是分开展示的两个图表,希望将同一index对应的不同fund条形放在同一水平图中,形成分组展示效果:
gp_chart = alt.Chart(df).mark_bar().encode( alt.X('value'), alt.Y('index', axis=alt.Axis(grid=True)), alt.Color('fund'), alt.Row('fund') ) gp_chart
解决方案
要实现分组水平条形图,只需移除alt.Row('fund'),并添加偏移或启用dodge参数让同一index下的条形并排:
方法1:使用XOffset实现分组
import altair as alt gp_chart = alt.Chart(df).mark_bar().encode( alt.X('value', title='数值'), alt.Y('index', axis=alt.Axis(grid=True), title='评级'), alt.Color('fund', title='基金'), # 通过XOffset让同一index下不同fund的条形偏移并排 alt.XOffset('fund') ).properties( width=600, height=400 ) gp_chart
方法2:使用mark_bar的dodge参数
import altair as alt gp_chart = alt.Chart(df).mark_bar(dodge=True).encode( alt.X('value', title='数值'), alt.Y('index', axis=alt.Axis(grid=True), title='评级'), alt.Color('fund', title='基金') ).properties( width=600, height=400 ) gp_chart
关键改动说明
- 移除
alt.Row('fund'):避免图表被拆分为独立的子图 - 添加
XOffset('fund')或设置dodge=True:让同一index类别下的不同fund条形沿X轴并排,形成分组效果 - 可选:添加
title参数优化坐标轴和图例的可读性,通过properties调整图表尺寸
注:由于两个fund的评级类别不完全一致(如第一个fund有BB、B,第二个有BB / B),图表会自动忽略缺失的类别对应位置,不会显示无效条形。
内容的提问来源于stack exchange,提问作者FFLS
相关产品推荐
相关产品推荐

