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

如何用Seaborn绘制宽格式Pandas DataFrame的分组条形图

用Seaborn实现带日期索引的分组条形图

嘿,刚好我之前做过类似的需求,用Seaborn来实现这个分组条形图其实很顺手,毕竟它对分类数据的可视化支持比Pandas原生绘图更灵活。我给你一步步拆解:

第一步:先还原你的DataFrame

首先咱们先把你给出的数据转换成可运行的代码,方便后续操作:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 创建你的DataFrame
data = {
    'A': [25, 261, 188, 200, 292],
    'B': [261, 1519, 1545, 2110, 2391],
    'C': [31, 151, 144, 232, 325]
}
df = pd.DataFrame(data, index=pd.to_datetime(['2017-09-05', '2017-09-06', '2017-09-07', '2017-09-08', '2017-09-09']))
df.index.name = 'date'

第二步:把宽格式数据转成长格式

Seaborn的大部分绘图函数更适配**长格式(long-form)**数据,所以我们需要用pd.melt()把原来的宽表(A、B、C作为列)转成长表,这样每个日期-变量组合对应一行数据:

# 转换数据格式
df_long = df.reset_index().melt(id_vars='date', var_name='Variable', value_name='Value')

转换后的df_long核心结构大概是这样的:

dateVariableValue
2017-09-05A25
2017-09-06A261
.........
2017-09-09C325

第三步:用Seaborn绘制分组条形图

现在就可以用seaborn.barplot()来绘制了,通过hue参数指定分组的变量(也就是A、B、C),这样每个日期下会对应三个并排的条形:

# 设置绘图风格(可选,让图更好看)
sns.set_style("whitegrid")

# 创建画布
plt.figure(figsize=(10, 6))

# 绘制分组条形图
ax = sns.barplot(data=df_long, x='date', y='Value', hue='Variable')

# 美化图表:旋转x轴标签,避免重叠
ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha='right')

# 添加标题和轴标签
plt.title('Daily Values of Variables A, B, C', fontsize=14)
plt.xlabel('Date', fontsize=12)
plt.ylabel('Value', fontsize=12)

# 调整图例位置,避免遮挡图表
plt.legend(loc='upper left')

# 自动调整布局,防止标签被截断
plt.tight_layout()
plt.show()

补充小技巧

  • 如果想要更灵活的子图布局,可以用sns.catplot(),把kind='bar'作为参数传入,它会返回一个FacetGrid对象,方便后续批量调整样式。
  • 因为你的B变量数值远大于A和C,图表里B的条形会很高,如果想让A和C的变化更明显,也可以考虑对B单独做轴刻度调整,但个人更建议保持单y轴,这样数据的真实对比关系更直观。

内容的提问来源于stack exchange,提问作者jayko03

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:16:25