Python案例:如何绘制柱状统计图?从入门到实战的完整指南
目录导读
- 柱状图的应用场景与核心价值
- 准备工作:Python环境与库安装
- 基础案例:用Matplotlib绘制单系列柱状图
- 进阶案例:多组数据对比与堆叠柱状图
- 美化技巧:字体、颜色与标签调整
- 数据源实战:从CSV文件读取并绘图
- 常见问题解答(FAQ)
- 总结与延伸学习建议
柱状图的应用场景与核心价值
柱状图(Bar Chart)是数据可视化中最基础且最常用的图表类型之一,适用于展示离散数据之间的对比,常见场景包括:

- 公司各季度销售额对比
- 不同城市的人口密度排名
- 社交媒体平台用户活跃度分析
- 实验组与对照组的效果差异
核心优势:直观呈现数值大小关系,便于快速发现最大值、最小值或异常值,Python中Matplotlib和Seaborn库提供了灵活且强大的柱状图绘制功能。
准备工作:Python环境与库安装
在开始绘图前,请确保已安装以下库(若未安装,可在终端运行对应命令):
pip install matplotlib numpy pandas
推荐环境:使用Jupyter Notebook或VS Code + Python插件,便于逐步调试。
基础案例:用Matplotlib绘制单系列柱状图
案例1:静态销售数据对比
场景:某电商平台1-6月销售额(单位:万元),数据如下:
月份:1月、2月、3月、4月、5月、6月
销售额:12、19、3、27、8、22
代码实现:
import matplotlib.pyplot as plt
import numpy as np
# 准备数据
months = ['1月', '2月', '3月', '4月', '5月', '6月']
sales = [12, 19, 3, 27, 8, 22]
# 创建画布
plt.figure(figsize=(10, 6))
# 绘制柱状图
plt.bar(months, sales, color='skyblue', width=0.6, edgecolor='navy', linewidth=1.2)
和轴标签'2024年1-6月销售额分布', fontsize=16, fontweight='bold')
plt.xlabel('月份', fontsize=12)
plt.ylabel('销售额(万元)', fontsize=12)
# 显示数值标签
for i, v in enumerate(sales):
plt.text(i, v + 0.8, str(v), ha='center', fontsize=11, color='darkblue')
# 显示网格
plt.grid(axis='y', linestyle='--', alpha=0.6)
plt.show()
输出效果:一个清晰的蓝色柱状图,顶部标注具体数值,网格辅助阅读。
关键参数解释:
color:柱子填充色width:柱子宽度(默认0.8)edgecolor:边框颜色,提升专业感plt.text():手动添加数值标签,ha='center'使文字居中对齐
进阶案例:多组数据对比与堆叠柱状图
案例2:两组产品销售额对比
场景:某公司A、B两款产品在四个季度的销售额对比:
| 季度 | 产品A(万元) | 产品B(万元) |
|---|---|---|
| Q1 | 15 | 10 |
| Q2 | 22 | 18 |
| Q3 | 12 | 25 |
| Q4 | 30 | 20 |
实现分组柱状图代码:
import matplotlib.pyplot as plt
import numpy as np
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
product_a = [15, 22, 12, 30]
product_b = [10, 18, 25, 20]
# 设置柱状图位置
x = np.arange(len(quarters)) # [0,1,2,3]
width = 0.35
fig, ax = plt.subplots(figsize=(10,6))
bars1 = ax.bar(x - width/2, product_a, width, label='产品A', color='#FF6B6B')
bars2 = ax.bar(x + width/2, product_b, width, label='产品B', color='#4ECDC4')
# 添加标签、图例
ax.set_xlabel('季度')
ax.set_ylabel('销售额(万元)')
ax.set_title('产品A vs 产品B 季度销售对比')
ax.set_xticks(x)
ax.set_xticklabels(quarters)
ax.legend()
# 在柱子上显示数值
for bar in bars1:
height = bar.get_height()
ax.text(bar.get_x() + bar.get_width()/2., height + 0.5, f'{height}', ha='center', fontsize=10)
for bar in bars2:
height = bar.get_height()
ax.text(bar.get_x() + bar.get_width()/2., height + 0.5, f'{height}', ha='center', fontsize=10)
plt.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.show()
案例3:堆叠柱状图(展示整体与部分)
场景:同一公司不同产品在年度总销售额中的构成比例,可使用堆叠柱状图。
# 继续用上面的数据,绘制堆叠图
fig, ax = plt.subplots(figsize=(10,6))
# 注意:堆叠图的第二个系列要加到底部
bars_bottom = ax.bar(quarters, product_a, label='产品A', color='#FF6B6B')
bars_top = ax.bar(quarters, product_b, bottom=product_a, label='产品B', color='#4ECDC4')
ax.set_xlabel('季度')
ax.set_ylabel('总销售额(万元)')
ax.set_title('产品A与产品B堆叠销售额')
ax.legend()
# 在堆叠柱子上标注总销售额
for i, (qa, qb) in enumerate(zip(product_a, product_b)):
total = qa + qb
ax.text(i, total + 1.5, str(total), ha='center', fontsize=11, fontweight='bold')
plt.grid(axis='y', alpha=0.3)
plt.show()
注意:bottom参数决定第二组数据从哪个高度开始绘制,实现“堆叠”效果。
美化技巧:字体、颜色与标签调整
一个好图表不仅需要数据准确,审美同样重要,以下是常用美化设置:
使用内置样式
plt.style.use('ggplot') # 类似R语言风格
其他可用样式:fivethirtyeight, seaborn-v0_8, classic
中文字体支持(避免乱码)
plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows plt.rcParams['font.sans-serif'] = ['Arial Unicode MS'] # macOS plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
个性化颜色选择
使用color参数时,可直接指定十六进制色码或常见颜色名称('red','green'等),更高级可用渐变色:
colors = ['#2E86AB', '#A23B72', '#F18F01', '#C73E1D']
旋转X轴标签(防止重叠)
plt.xticks(rotation=45, ha='right')
数据源实战:从CSV文件读取并绘图
实际工作中数据通常存储在CSV文件,以下演示如何读取并绘图。
示例CSV文件(sales_data.csv):
月份,销售额
1月,12
2月,19
3月,3
4月,27
5月,8
6月,22
代码实现:
import pandas as pd
import matplotlib.pyplot as plt
# 读取数据
df = pd.read_csv('sales_data.csv')
print(df.head())
# 绘图
plt.figure(figsize=(10,6))
plt.bar(df['月份'], df['销售额'], color='lightcoral', edgecolor='maroon', linewidth=1.5)'从CSV读取数据的柱状图', fontsize=16)
plt.xlabel('月份')
plt.ylabel('销售额')
plt.grid(axis='y', alpha=0.5)
plt.tight_layout()
plt.show()
优点:Pandas自动处理数据类型,无需手动输入数据,适合批量处理。
常见问题解答(FAQ)
Q1:柱状图柱子太窄或太宽怎么办?
答:调整width参数(0.1到1之间),例如plt.bar(..., width=0.5),分组图中建议width = (1/组数)*0.8。
Q2:如何同时显示柱状图和折线图?
答:使用twinx()创建双轴,
fig, ax1 = plt.subplots() ax1.bar(x, sales, color='b') ax2 = ax1.twinx() ax2.plot(x, growth_rate, color='r', marker='o')
Q3:何时用竖直柱状图,何时用水平柱状图?
答:类别名较长(如城市名、产品名)时,推荐水平柱状图(plt.barh),避免标签重叠。
Q4:如何保存高清图片?
答:在plt.show()前添加:
plt.savefig('bar_chart.png', dpi=300, bbox_inches='tight')
Q5:数据中有负值怎么处理?
答:Matplotlib支持负值显示,柱子会从零轴向下延伸,可设置bottom参数调整基线。
总结与延伸学习建议
通过以上案例,你已经掌握了用Python绘制柱状统计图的完整流程:
- 基础柱状图(单系列)
- 分组柱状图(多系列对比)
- 堆叠柱状图(构成分析)
- 从CSV文件读取数据绘制
- 常见美化与问题处理
下一步推荐学习:
- Seaborn库:更简洁的API和内置统计函数(
sns.barplot、sns.countplot) - 交互式图表:Plotly或Bokeh实现鼠标悬停提示、缩放功能
- 动画与仪表盘:结合Matplotlib Animation或Streamlit制作动态报告
数据可视化是数据科学家的核心能力之一,建议多练习不同数据集,逐步形成自己的绘图风格。
本文基于Matplotlib官方文档及社区最佳实践编写,各代码均经过本地环境(Python 3.10, Matplotlib 3.7)测试通过。