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()绘制水平柱状图,两者参数类似但坐标轴互换。

三、参数说明

参数 类型 默认值 说明
x array_like 必填 柱子的X坐标
height array_like 必填 柱子的高度
width float/array 0.8 柱子宽度
bottom float/array 0 柱子底部Y坐标(用于堆叠)
align str 'center' 对齐方式:'center'或'edge'
color str/array 自动 柱子填充颜色
edgecolor str None 柱子边框颜色
tick_label str/list None 刻度标签
hatch str None 填充图案('/', '\\', 'x', '*'等)

四、代码示例

示例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("堆叠与水平柱状图已保存")

五、实际应用场景

  • 销售报表:使用柱状图对比不同产品或地区的销售额,直观展示业绩差距

  • 调查问卷:使用水平柱状图展示各选项的选择比例,标签文字较长时避免重叠

  • 财务报告:使用堆叠柱状图展示收入构成,同时呈现总量和各项占比

六、柱状图类型对比

类型 函数 适用场景 特点
垂直柱状图 bar() 类别较少 直观对比
水平柱状图 barh() 类别较多/标签长 避免标签重叠
分组柱状图 bar() + 偏移 多组对比 并排展示
堆叠柱状图 bar() + bottom 构成分析 展示总量和构成

七、注意事项

  • 分组偏移:分组柱状图需要手动计算偏移量,确保柱子正确对齐

  • 堆叠顺序:堆叠柱状图使用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参数。也可以手动指定颜色列表。

标签: 柱状图 plt.bar 分组柱状图 堆叠柱状图 水平柱状图 分类对比 数据可视化

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: matplotlib折线图plot教程 - 参数详解与代码示例 下一篇: matplotlib散点图scatter教程 - 多维数据可视化与颜色映射

poll相关推荐