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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:05:21