pin_drop当前位置:知识文库 ❯ 图文
matplotlib柱状图bar教程 - 分组堆叠水平柱状图详解
一、概述
plt.bar()和plt.barh()用于绘制柱状图(垂直和水平),是展示分类数据对比的常用图表。柱状图通过柱子的高度或长度表示数值大小,直观地比较不同类别之间的差异。
支持分组柱状图、堆叠柱状图等多种变体,广泛应用于销售报表、调查问卷、财务分析等场景。
二、基本语法
代码示例
plt.bar(x, height, width=0.8, **kwargs)
plt.barh(y, width, height=0.8, **kwargs)
bar()绘制垂直柱状图,barh()绘制水平柱状图,两者参数类似但坐标轴互换。
三、参数说明
四、代码示例
示例1:基本柱状图
绘制编程语言流行度评分的柱状图,并在柱子上方显示数值:
代码示例
import matplotlib.pyplot as plt
import numpy as np
# 数据
categories = ['Python', 'Java', 'C++', 'JavaScript', 'Go']
values = [85, 70, 55, 80, 45]
# 绘制柱状图
plt.figure(figsize=(8, 5))
bars = plt.bar(categories, values, color=['#2196F3', '#4CAF50', '#FF9800', '#9C27B0', '#F44336'],
edgecolor='white', linewidth=1.5)
# 在柱子上方显示数值
for bar, val in zip(bars, values):
plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 1,
str(val), ha='center', va='bottom', fontsize=12, fontweight='bold')
plt.title('Programming Language Popularity Score')
plt.xlabel('Language')
plt.ylabel('Score')
plt.ylim(0, 100)
plt.grid(axis='y', alpha=0.3)
plt.savefig('basic_bar.png', dpi=100, bbox_inches='tight')
print("基本柱状图已保存")示例2:分组柱状图
对比2023年和2024年各季度的销售额:
代码示例
import matplotlib.pyplot as plt
import numpy as np
# 数据
categories = ['Q1', 'Q2', 'Q3', 'Q4']
sales_2023 = [120, 150, 180, 200]
sales_2024 = [140, 170, 190, 230]
x = np.arange(len(categories))
width = 0.35
fig, ax = plt.subplots(figsize=(8, 5))
bars1 = ax.bar(x - width/2, sales_2023, width, label='2023', color='#2196F3', edgecolor='white')
bars2 = ax.bar(x + width/2, sales_2024, width, label='2024', color='#FF5722', edgecolor='white')
ax.set_title('Quarterly Sales Comparison')
ax.set_xlabel('Quarter')
ax.set_ylabel('Sales (million)')
ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.legend()
ax.grid(axis='y', alpha=0.3)
plt.savefig('grouped_bar.png', dpi=100, bbox_inches='tight')
print("分组柱状图已保存")示例3:堆叠柱状图与水平柱状图
在同一张画布上展示堆叠柱状图和水平柱状图:
代码示例
import matplotlib.pyplot as plt
import numpy as np
# 堆叠柱状图
categories = ['Product A', 'Product B', 'Product C', 'Product D']
online = [30, 45, 25, 50]
offline = [20, 15, 35, 10]
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 5))
# 堆叠柱状图
ax1.bar(categories, online, label='Online', color='#2196F3', edgecolor='white')
ax1.bar(categories, offline, bottom=online, label='Offline', color='#FF9800', edgecolor='white')
ax1.set_title('Stacked Bar Chart')
ax1.set_ylabel('Sales')
ax1.legend()
ax1.grid(axis='y', alpha=0.3)
# 水平柱状图
products = ['Product A', 'Product B', 'Product C', 'Product D']
values = [50, 60, 40, 55]
colors = ['#2196F3', '#4CAF50', '#FF9800', '#9C27B0']
ax2.barh(products, values, color=colors, edgecolor='white', height=0.6)
ax2.set_title('Horizontal Bar Chart')
ax2.set_xlabel('Sales')
for i, v in enumerate(values):
ax2.text(v + 1, i, str(v), va='center', fontsize=11)
plt.tight_layout()
plt.savefig('stacked_hbar.png', dpi=100, bbox_inches='tight')
print("堆叠与水平柱状图已保存")五、实际应用场景
-
销售报表:使用柱状图对比不同产品或地区的销售额,直观展示业绩差距
-
调查问卷:使用水平柱状图展示各选项的选择比例,标签文字较长时避免重叠
-
财务报告:使用堆叠柱状图展示收入构成,同时呈现总量和各项占比
六、柱状图类型对比
七、注意事项
-
分组偏移:分组柱状图需要手动计算偏移量,确保柱子正确对齐
-
堆叠顺序:堆叠柱状图使用bottom参数指定底部位置,第二层从第一层顶部开始
-
标签重叠:柱子数量过多时,考虑使用水平柱状图(barh)避免标签重叠
小贴士:使用
bar.get_height()和bar.get_x()可以获取每个柱子的位置和高度,方便在柱子上方添加数值标签,增强可读性。
八、小结
-
plt.bar()绘制垂直柱状图,plt.barh()绘制水平柱状图
-
分组柱状图通过调整x偏移量和width实现并排效果
-
堆叠柱状图通过bottom参数指定底层高度
-
使用plt.text()在柱子上方添加数值标签,增强可读性
九、练习题
练习1
绘制5个城市的GDP柱状图,每个柱子使用不同颜色,并在柱子上方显示数值。
练习2
绘制分组柱状图,对比3个班级4门科目的平均成绩。
练习3
绘制堆叠柱状图,展示4个季度的线上和线下收入构成。
常见问题
分组柱状图如何计算柱子位置?
使用np.arange()生成索引位置,然后根据柱子数量和宽度计算偏移量。例如两组数据,width=0.35,则第一组位置为x-width/2,第二组为x+width/2。
如何给柱子添加误差线?
使用plt.bar()的yerr参数添加垂直误差线,xerr参数添加水平误差线。例如:plt.bar(x, height, yerr=errors, capsize=5),capsize控制误差线帽的宽度。
如何自定义柱子颜色渐变?
使用matplotlib的颜色映射:colors = plt.cm.viridis(np.linspace(0, 1, n))生成n个渐变色,然后传入bar()的color参数。也可以手动指定颜色列表。
本文涉及AI创作
内容由AI创作,请仔细甄别