Python柱状图案例如何绘制对比图表

wen python案例 23

Python柱状图案例:如何绘制对比图表(超详细教程)

目录导读

  1. 为什么需要对比柱状图?
  2. Python绘制对比柱状图的3种主流方法
    • Matplotlib基础对比图
    • Seaborn分组柱状图
    • Pandas直接绘图
  3. 实战案例:销售数据季度对比
  4. 常见问题与优化技巧(问答环节)
  5. 总结与扩展

为什么需要对比柱状图?

在数据分析和业务报告中,对比柱状图是最直观的展示两组或多组数据差异的可视化工具,无论是比较不同产品的月度销量、各地区用户增长,还是年度营收变化,对比柱状图能清晰呈现数据间的“高低落差”与“趋势走向”。

Python柱状图案例如何绘制对比图表

Python作为数据科学的核心语言,提供了Matplotlib、Seaborn、Pandas等多个库,让绘制对比柱状图变得简单且高度可定制。


Python绘制对比柱状图的3种主流方法

Matplotlib基础对比图(最灵活)

核心思路:通过调整柱状图的x轴位置(width参数与偏移量)实现分组对比。

import matplotlib.pyplot as plt
import numpy as np
# 数据准备
categories = ['A', 'B', 'C', 'D']
values_2023 = [15, 28, 32, 20]
values_2024 = [22, 35, 28, 27]
# 绘图
x = np.arange(len(categories))
width = 0.35
plt.bar(x - width/2, values_2023, width, label='2023', color='#4C72B0')
plt.bar(x + width/2, values_2024, width, label='2024', color='#DD8452')
plt.xticks(x, categories)
plt.ylabel('销量(万件)')'年度销量对比')
plt.legend()
plt.show()

优势:完全控制柱体位置、颜色、标签;适合复杂定制场景(如添加误差线、旋转标签)。


Seaborn分组柱状图(一键美观)

核心思路:利用seaborn.barplot()hue参数自动分组,无需手动计算偏移量。

import seaborn as sns
import pandas as pd
# 数据长格式(必需)
df = pd.DataFrame({
    '类别': ['A','A','B','B','C','C','D','D'],
    '年份': ['2023','2024']*4,
    '销量': [15,22,28,35,32,28,20,27]
})
sns.barplot(data=df, x='类别', y='销量', hue='年份', palette='Set2')'Seaborn自动分组柱状图')
plt.show()

优势:默认配色科学,自动添加图例,适合快速生成出版级图表;支持统计计算(如均值、置信区间)。


Pandas直接绘图(一分钟极简版)

核心思路:使用DataFrame.plot.bar(),以列为分组键。

import pandas as pd
df_wide = pd.DataFrame({
    '2023': [15,28,32,20],
    '2024': [22,35,28,27]
}, index=['A','B','C','D'])
df_wide.plot.bar(rot=0, figsize=(8,5), color=['#1f77b4','#ff7f0e'])
plt.ylabel('销量(万件)')'Pandas直接绘制对比柱状图')
plt.show()

优势:代码量最少,适合快速查看数据对比;可自由更改索引标签。


实战案例:销售数据季度对比

背景:某电商公司需要对比2023年与2024年四个季度的市场营销活动效果。
完整代码(含注释):

import matplotlib.pyplot as plt
import numpy as np
# 模拟数据
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
revenue_2023 = [120, 180, 210, 160]
revenue_2024 = [145, 220, 195, 185]
# 绘图参数
x_pos = np.arange(len(quarters))
bar_width = 0.3
# 创建图表
fig, ax = plt.subplots(figsize=(10,6))
bars1 = ax.bar(x_pos - bar_width/2, revenue_2023, bar_width, 
               label='2023年', color='#4C72B0', edgecolor='white')
bars2 = ax.bar(x_pos + bar_width/2, revenue_2024, bar_width, 
               label='2024年', color='#DD8452', edgecolor='white')
# 添加数据标签(增强可读性)
for bar in bars1:
    height = bar.get_height()
    ax.text(bar.get_x() + bar.get_width()/2., height + 2,
            f'{height}', ha='center', va='bottom', fontsize=10)
for bar in bars2:
    height = bar.get_height()
    ax.text(bar.get_x() + bar.get_width()/2., height + 2,
            f'{height}', ha='center', va='bottom', fontsize=10)
# 样式优化
ax.set_xticks(x_pos)
ax.set_xticklabels(quarters, fontsize=12)
ax.set_ylabel('营收(万元)', fontsize=12)
ax.set_title('2023 vs 2024 季度营收对比', fontsize=14, pad=15)
ax.legend(fontsize=11)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.tight_layout()
plt.show()

输出效果:每个季度两组柱体并排,顶部显示具体数值,便于直接读取差异。


常见问题与优化技巧(问答环节)

Q1:如何让柱状图颜色更专业?
A:使用色盲友好调色板(如Seaborn的Set2colorblind),或从virdisplasma等渐变色中选取,避免纯红/绿这对色盲难辨的组合。

Q2:数据标签重叠怎么办?
A:调整text()的垂直偏移量(如height + 2改为height * 1.02),或使用plt.ylim()扩大y轴范围;密集数据建议使用adjust_text库自动避让。

Q3:如何添加对比差异线(如增长百分比)?
A:在bars2上方用ax.plot()绘制连线,并标注百分数,

for i in range(len(quarters)):
    diff = ((revenue_2024[i] - revenue_2023[i]) / revenue_2023[i]) * 100
    ax.annotate(f'+{diff:.1f}%', xy=(i, max(revenue_2023[i], revenue_2024[i])+15), 
                ha='center', color='green', fontweight='bold')

Q4:比较超过两组数据(如3年对比)怎么办?
A:用hue参数增加分组,或使用堆叠柱状图(stacked=True);注意控制颜色数量(≤5组),避免视觉混乱。

Q5:图表保存后字体模糊怎么办?
A:设置plt.savefig('chart.png', dpi=300, bbox_inches='tight'),并确保系统安装了中文字体(如plt.rcParams['font.sans-serif']=['SimHei'])。


总结与扩展

对比柱状图是商业分析中高频使用的图表类型,通过本文的3种方法(Matplotlib底层控制、Seaborn快速分组、Pandas极简绘图),你可以根据场景灵活选择:

  • 需要精细定制(如误差线、网格线)→ Matplotlib
  • 需要快速出图(如报告探索阶段)→ Seaborn
  • 需要最小代码量(如临时查看数据)→ Pandas

下一步拓展:尝试用plotly制作交互式对比柱状图(悬停显示数值、柱体可点击),或结合matplotlib.animation实现动态时序对比动画。

参考来源:Python官方文档、Stack Overflow精选案例、DataCamp教程,经去重与深度整合。

抱歉,评论功能暂时关闭!