如何使用Python的Altair绘制基于Pandas DataFrame的分组对比图表?
用Altair实现分组对比条形图
实现步骤
要生成目标样式的分组对比图表,首先需要将原始宽格式数据转换为Altair更易处理的长格式,再通过配置条形图的分组、颜色与分面来完成效果。
完整代码
import pandas as pd import altair as alt # 构建原始数据 data = pd.DataFrame({ 'student': ['A', 'A', 'B', 'B', 'C', 'C'], 'subject': ['Math', 'English', 'Math', 'English', 'Math', 'English'], 'current': [98, 88, 68, 72, 92, 92], 'previous': [92, 94, 71, 71, 88, 84] }) # 宽表转长表:将current/previous转为统一的类别列 long_data = data.melt( id_vars=['student', 'subject'], value_vars=['current', 'previous'], var_name='score_type', value_name='score' ) # 绘制分组对比条形图 chart = alt.Chart(long_data).mark_bar(size=30).encode( x=alt.X('subject:N', title='科目'), y=alt.Y('score:Q', title='分数'), color=alt.Color('score_type:N', title='分数类型', scale=alt.Scale(domain=['current', 'previous'], range=['#1f77b4', '#ff7f0e'])), column=alt.Column('student:N', title='学生'), xOffset='score_type:N' # 实现同一科目下两个分数柱子并列 ).configure_view( stroke=None # 移除分面边框 ).configure_title( fontSize=14 ).configure_axis( labelFontSize=12, titleFontSize=12 ) chart.show()
关键配置说明
- 数据重塑:通过
pd.melt将current和previous列合并为score_type类别列,对应分数存入score列,这是Altair处理分组对比的标准数据格式。 - 图表布局:
xOffset='score_type:N':让同一科目的两个分数类型柱子并列显示column='student:N':按学生分面,每个学生对应独立的子图表- 自定义颜色映射与轴标签样式,提升图表可读性
内容的提问来源于stack exchange,提问作者ozzboy
相关产品推荐
相关产品推荐

