一、案例一:温度堆积图
python
复制代码
# 导入 matplotlib 库中的 pyplot 模块,这个模块提供了类似于 MATLAB 的绘图接口,
# 方便我们创建各种类型的可视化图表,比如折线图、柱状图、散点图等
import matplotlib.pyplot as plt
# 导入 numpy 库,它是 Python 中用于科学计算的基础库,提供了强大的多维数组对象和各种数学函数,
# 能高效地处理数值数据,在后续的绘图中可用于生成和处理坐标轴数据
import numpy as np
# 创建一个新的图形窗口,该函数的参数解释如下:
# num='堆形图':设置图形窗口的标题为 '堆形图',方便我们识别当前打开的图形
# figsize=(12, 7):指定图形的大小,单位为英寸,这里图形的宽度为 12 英寸,高度为 7 英寸
# facecolor='w':设置图形窗口的背景颜色为白色,'w' 是白色的缩写
plt.figure(num='堆形图', figsize=(12, 7), facecolor='w')
# matplotlib 默认的字体可能无法正确显示中文,所以我们通过修改 rcParams 参数来更改字体。
# 'font.sans-serif' 是用来指定无衬线字体的参数,这里将其设置为 'KaiTi'(楷体),
# 这样在绘制图形时,中文就能正常显示了
plt.rcParams['font.sans-serif'] = 'KaiTi'
# 设置图形中文字的字体大小为 15,这样可以让图形中的文字清晰易读
plt.rcParams['font.size'] = 15
# 在默认情况下,matplotlib 可能无法正确显示负号,将 'axes.unicode_minus' 参数设置为 False,
# 可以解决负号显示的问题,确保负号能在图形中正常显示
plt.rcParams['axes.unicode_minus'] = False
# 定义 x 轴的数据,使用 numpy 的 array 函数创建一个一维数组,数组元素为字符串类型,
# 代表 5 个月份,后续会作为柱状图的 x 轴刻度
x = np.array(['1', '2', '3', '4', '5'])
# 定义最高温度的数据,同样使用 numpy 的 array 函数创建一维数组,
# 数组元素为整数类型,代表每个月对应的最高温度值
y1 = np.array([10, 8, 7, 11, 13])
# 定义最低温度的数据,创建一维数组,数组元素为整数类型,
# 代表每个月对应的最低温度值
y2 = np.array([9, 6, 5, 10, 12])
# 定义误差数据,是一个列表,列表中的元素代表每个月最低温度数据的误差范围,
# 在绘制柱状图时,会使用这些误差数据来绘制误差线,以展示数据的不确定性
error = [2, 1, 2.5, 2, 1.5]
# 定义柱状图的宽度,这里设置为 0.3,它会影响柱状图在 x 轴上的宽窄程度
bar_width = 0.3
# 设置图形的标题,标题内容为 '5 个月的温度堆积柱形图',让读者一眼就能知道这个图形所展示的内容
plt.title('5个月的温度堆积柱形图')
# 设置 x 轴的标签,标签内容为 '月份',明确 x 轴数据所代表的含义
plt.xlabel('月份')
# 设置 y 轴的标签,标签内容为 '温度',明确 y 轴数据所代表的含义
plt.ylabel('温度')
# 使用 for 循环遍历 x 和 y1 数据,zip 函数将 x 和 y1 中对应的元素一一配对,
# 每次循环取出一个月份和对应的最高温度值
for a, b in zip(x, y1):
# 在每个最高温度柱状图的上方添加文本标签,用于显示具体的温度值。
# plt.text 函数的参数解释如下:
# a:文本标签的 x 坐标位置,即对应的月份
# b + 1:文本标签的 y 坐标位置,在最高温度值的基础上向上偏移 1 个单位,使标签不与柱状图重叠
# '%d' % b:将最高温度值格式化为整数形式的字符串,作为文本标签的内容
# ha='center':设置文本的水平对齐方式为居中对齐,使标签在柱状图上方居中显示
# va='center':设置文本的垂直对齐方式为居中对齐
plt.text(a, b + 1, '%d' % b, ha='center', va='center')
# 绘制最高温度的柱状图,plt.bar 函数的参数解释如下:
# x:柱状图的 x 轴位置,即月份
# y1:柱状图的高度,即最高温度值
# width=bar_width:柱状图的宽度,使用之前定义的 bar_width 值
plt.bar(x, y1, width=bar_width)
# 同样使用 for 循环遍历 x 和 y2 数据,将每个月份和对应的最低温度值配对
for a, b in zip(x, y2):
# 在每个最低温度柱状图的上方添加文本标签,显示具体的温度值。
# b - 1:文本标签的 y 坐标位置,在最低温度值的基础上向下偏移 1 个单位
# va='baseline':设置文本的垂直对齐方式为基线对齐
plt.text(a, b - 1, '%d' % b, ha='center', va='baseline')
# 绘制最低温度的柱状图,使其堆积在最高温度柱状图的上方。
# plt.bar 函数的参数解释如下:
# x:柱状图的 x 轴位置,即月份
# y2:柱状图的高度,即最低温度值
# bottom=y1:指定柱状图的底部位置,将最低温度柱状图堆积在最高温度柱状图上方
# width=bar_width:柱状图的宽度
# yerr = error:为柱状图添加误差线,误差范围由 error 列表指定
plt.bar(x, y2, bottom=y1, width=bar_width, yerr=error)
# 为图形添加图例,图例用于说明图形中不同元素所代表的含义。
# 传入一个列表 ['最高温度', '最低温度'],分别对应之前绘制的最高温度和最低温度柱状图。
# shadow=True:为图例添加阴影效果,使其更具立体感
# fancybox=True:将图例的边框设置为圆角样式,让图例外观更美观
plt.legend(['最高温度', '最低温度'], shadow=True, fancybox=True)
# 显示绘制好的图形,调用该函数后,图形窗口会弹出显示绘制的温度堆积柱状图
plt.show()
二、案例二:公司各部支出
python
复制代码
import matplotlib.pyplot as plt
import pandas as pd
plt.figure(num='图', figsize=(12, 6), facecolor='w')
plt.rcParams['font.sans-serif'] = 'KaiTi'
df = pd.read_excel('某公司各部门1---2月份实际支出.xlsx')
# 从 DataFrame 中提取 '部门' 列的数据,作为柱状图的 x 轴标签
x = df['部门']
# 定义误差棒的高度,这是一个列表,列表中的每个元素对应每个部门的误差值,后续绘制柱状图时会用到这些误差值来绘制误差棒
error = [1000, 200, 150, 100, 100, 500, 1000, 880]
# 定义柱状图的宽度,该值会影响柱状图在 x 轴上的宽窄程度
bar_width = 0.4
plt.title('某公司各部门1---2月份实际支出簇状柱形图', fontsize=20, fontproperties='SimHei')
plt.ylabel('实际支出(元)', fontsize=15)
# 使用 for 循环遍历 x 轴标签、1 月数据和 2 月数据,zip 函数将这三个序列中的对应元素一一配对
for a, b, c in zip(x, df['1月'], df['2月']):
# 在每个 1 月支出柱状图的中间位置添加文本标签,显示具体的支出值
# a:文本标签的 x 坐标位置,即部门名称对应的位置
# b / 2:文本标签的 y 坐标位置,在 1 月支出值的一半高度处
# '%d' % b:将 1 月支出值格式化为整数形式的字符串,作为文本标签的内容
# ha='center':设置文本的水平对齐方式为居中对齐
# va='center':设置文本的垂直对齐方式为居中对齐
plt.text(a, b / 2, '%d' % b, ha='center', va='center')
# 在每个 2 月支出柱状图的中间位置添加文本标签,显示具体的支出值
# b + c / 2:文本标签的 y 坐标位置,在 1 月和 2 月支出总和的一半高度处
plt.text(a, b + c / 2, '%d' % c, ha='center', va='center')
# 绘制 1 月支出的柱状图
# x:柱状图的 x 轴位置,即部门名称
# df['1月']:柱状图的高度,即 1 月各部门的实际支出值
# width=bar_width:柱状图的宽度
# color='g':设置柱状图的颜色为绿色
plt.bar(x, df['1月'], width=bar_width, color='g')
# 绘制 2 月支出的柱状图,使其堆积在 1 月支出柱状图的上方
# x:柱状图的 x 轴位置,即部门名称
# df['2月']:柱状图的高度,即 2 月各部门的实际支出值
# bottom=df['1月']:指定柱状图的底部位置,将 2 月支出柱状图堆积在 1 月支出柱状图上方
# yerr=error:为柱状图添加误差棒,误差范围由 error 列表指定
# width=bar_width:柱状图的宽度
# color='salmon':设置柱状图的颜色为鲑鱼色
plt.bar(x, df['2月'], bottom=df['1月'], yerr=error, width=bar_width, color='salmon')
# 为图形添加图例,说明不同颜色的柱状图所代表的含义
# ['1月', '2月']:传入一个列表,分别对应 1 月和 2 月支出的柱状图
plt.legend(['1月', '2月'])
# 将绘制好的图形保存为图片文件,文件名为 '某公司堆图.png'
plt.savefig('某公司堆图.png')
# 显示绘制好的图形,调用该函数后,图形窗口会弹出显示绘制的柱状图
plt.show()
三、案例三:不同产品销售额
python
复制代码
import matplotlib.pyplot as plt
import pandas as pd
plt.figure(num='图', figsize=(12, 8), facecolor='w')
# 设置 matplotlib 使用的字体为楷体,以确保图形中的中文能正常显示,因为默认字体可能无法正确显示中文
plt.rcParams['font.sans-serif'] = 'KaiTi'
# 解决负号显示问题,默认情况下 matplotlib 可能无法正确显示负号,将该参数设置为 False 可解决此问题
plt.rcParams['axes.unicode_minus'] = False
df = pd.read_excel('不同产品各季度的销售额.xlsx')
# 从 DataFrame 中提取 '季度' 列的数据,作为柱状图的 x 轴标签
x = df['季度']
# 从 DataFrame 中提取 '产品A' 列的数据,作为产品 A 的销售额数据
y1 = df['产品A']
# 从 DataFrame 中提取 '产品B' 列的数据,作为产品 B 的销售额数据
y2 = df['产品B']
# 从 DataFrame 中提取 '产品C' 列的数据,作为产品 C 的销售额数据
y3 = df['产品C']
plt.title('不同产品各季度的销售额', fontsize=20)
plt.ylabel('销售额(元)', fontsize=14)
plt.ylim(0, 12000)
# 定义柱状图的宽度,该值会影响柱状图在 x 轴上的宽窄程度
bar_width = 0.3
plt.bar(x, y3, width=bar_width)
plt.bar(x, y2, bottom=y3, width=bar_width)
plt.bar(x, y1, bottom=y2, width=bar_width)
# 使用 for 循环遍历 x 轴标签、产品 C、产品 B 和产品 A 的销售额数据,zip 函数将这四个序列中的对应元素一一配对
for a, b, c, d in zip(x, y3, y2, y1):
# 在产品 C 销售额柱状图的中间位置添加文本标签,显示具体的销售额值
# a:文本标签的 x 坐标位置,即季度对应的位置
# b / 2:文本标签的 y 坐标位置,在产品 C 销售额值的一半高度处
# '%d' % b:将产品 C 销售额值格式化为整数形式的字符串,作为文本标签的内容
# ha='center':设置文本的水平对齐方式为居中对齐
plt.text(a, b / 2, '%d' % b, ha='center')
# 在产品 B 销售额柱状图的中间位置添加文本标签,显示具体的销售额值
# b + c / 2:文本标签的 y 坐标位置,在产品 C 和产品 B 销售额总和的一半高度处
plt.text(a, b + c / 2, '%d' % c, ha='center')
# 在产品 A 销售额柱状图的中间位置添加文本标签,显示具体的销售额值
# b + c + d / 2:文本标签的 y 坐标位置,在产品 C、产品 B 和产品 A 销售额总和的一半高度处
plt.text(a, b + c + d / 2, '%d' % d, ha='center')
plt.legend(['产品A', '产品B', '产品C'], shadow=True, fancybox=True)
plt.show()