如何用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核心结构大概是这样的:
| date | Variable | Value |
|---|---|---|
| 2017-09-05 | A | 25 |
| 2017-09-06 | A | 261 |
| ... | ... | ... |
| 2017-09-09 | C | 325 |
第三步:用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
相关产品推荐
相关产品推荐

