Python Matplotlib绘图核心概念与实战操作指南
本文深入解析Python中Matplotlib库的核心组件,通过画板、画纸与画笔的类比阐明figure、subplot和plot的关系。详细演示如何修改曲线样式、添加图例标签、绘制注解与矩形区域,并说明图形保存的正确时机与参数设置,帮助读者掌握从基础绘图到细节优化的完整流程。
前言部分旨在引出主题。
在数据处理环节,可视化能够直观呈现数据特征。本文结合实践经验,以最终视觉效果为导向进行编写,内容后续可能持续扩充。
解析Matplotlib中figure、subplot与plot三者之间的关系。
理解这三者关系可借助实际场景类比:若外出写生需携带工具,包括画板、画纸和画笔,它们的功能可一一对应。
| 函数 | 工具 |
|---|---|
| figure | 画板 |
| subplot、add_subplot | 画纸 |
| plot、hist、scatter | 画笔 |
进一步深入,画纸需贴在画板上,且画纸可裁剪为多块布局于画板之上,而画笔只能在纸上作画。这种层级关系略显抽象,下文将通过代码及注释清晰展示(建议记忆以下代码示例)。
相关代码展示。
import matplotlib.pyplot as plt
import numpy as np
# 拿起画板
fig = plt.figure()
# 在画板上贴上画纸
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(223)
# 一步完成(直接拿起画板和画纸)-----------------
# ax1 = plt.subplot(221)
# ax2 = plt.subplot(222)
# ax3 = plt.subplot(223)
# ----------------------------------------
# 在画纸上作图
ax1.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)
ax2.scatter(np.arange(30), np.arange(30) + 3 * np.random.randn(30))
ax3.plot(np.random.randn(50).cumsum(), 'k--')
plt.show()
代码运行后的结果展示。

对所用函数进行详细解析。
| 代码行 | 作用 | 参考链接 |
|---|---|---|
| ax1.hist(np.random.randn(100), bins=20, color=‘k’, alpha=0.3) | 绘制直方图 | python用hist参数解读 |
介绍绘图细节的修改方法。
依次实现以下绘图效果:

1. 绘制一条正弦函数实线与一条随机数值虚线,并包含其他样式修改;
2. 调整图例、坐标轴标签等元素;
3. 添加标注,并在指定范围内以红色矩形标示。
2.1 修改plot绘图形式。
相关代码展示。
import matplotlib.pyplot as plt
import numpy as np
# 拿起画板
fig = plt.figure()
# 贴上画纸
ax1 = fig.add_subplot(111)
# 数据准备
x_sin = np.arange(0, 6, 0.001) # [0, 6]
y_sin = np.sin(x_sin)
data_random = np.zeros(7) # 生成[-1,1]的7个随机数
for i in range(0, 6):
data_random[i] = np.random.uniform(-1, 1)
# 画图
ax1.plot(x_sin, y_sin, linestyle='-', color='g', linewidth=3)
ax1.plot(data_random, linestyle='dashed', color='b', marker='o')
plt.show()
代码运行结果。

2.2 添加图例与标签等操作。
相关代码展示。
import matplotlib.pyplot as plt
import numpy as np
# 拿起画板
fig = plt.figure()
# 贴上画纸
ax1 = fig.add_subplot(111)
# 数据准备
x_sin = np.arange(0, 6, 0.001) # [0, 6]
y_sin = np.sin(x_sin)
data_random = np.zeros(7) # 生成[-1,1]的7个随机数
for i in range(0, 6):
data_random[i] = np.random.uniform(-1, 1)
# 画图
ax1.plot(x_sin, y_sin, linestyle='-', color='g', linewidth=3, label='sin')
ax1.plot(data_random, linestyle='dashed', color='b', marker='o', label='random')
#-----------------添加部分------------------
# 添加标题
ax1.set_title('Title')
# 添加x轴名称
ax1.set_xlabel('x')
# 设置x轴坐标范围
ax1.set_xlim(xmin=0, xmax=6)
# 添加图例,在plot处加上label
ax1.legend(loc='best')
#----------------------------------------
plt.show()
代码运行结果。

2.3 在图表中添加注解及绘制矩形。
相关代码展示。
import matplotlib.pyplot as plt
import numpy as np
# 拿起画板
fig = plt.figure()
# 贴上画纸
ax1 = fig.add_subplot(111)
# 数据准备
x_sin = np.arange(0, 6, 0.001) # [0, 6]
y_sin = np.sin(x_sin)
data_random = np.zeros(7) # 生成[-1,1]的7个随机数
for i in range(0, 6):
data_random[i] = np.random.uniform(-1, 1)
# 画图
ax1.plot(x_sin, y_sin, linestyle='-', color='g', linewidth=3, label='sin')
ax1.plot(data_random, linestyle='dashed', color='b', marker='o', label='random')
# 添加标题
ax1.set_title('Title')
# 添加x轴名称
ax1.set_xlabel('x')
# 设置x轴坐标范围
ax1.set_xlim(xmin=0, xmax=6)
# 添加图例
ax1.legend(loc='best')
#-----------------添加部分------------------
# 注解
ax1.annotate('max', xy=((np.pi) / 2, np.sin(np.pi/2)),
xytext=((np.pi) / 2, np.sin(np.pi/2)-0.2),
arrowprops=dict(facecolor='black', headwidth=4, width=2,headlength=4),
horizontalalignment='left', verticalalignment='top')
ax1.annotate('min', xy=((np.pi) * 3 / 2, np.sin(np.pi * 3 / 2)),
xytext=((np.pi) * 3 / 2, np.sin(np.pi * 3 / 2)+0.2),
arrowprops=dict(facecolor='black', headwidth=4, width=2,headlength=4),
horizontalalignment='left', verticalalignment='top')
# 矩形
print(ax1.axis())
rect = plt.Rectangle((np.pi / 2, ax1.axis()[2]), np.pi, ax1.axis()[3] - ax1.axis()[2], color='r', alpha=0.3) # 起始坐标点,width, height
ax1.add_patch(rect)
#-----------------------------------------
plt.show()
代码运行结果。

介绍如何保存生成的图形。
plt.savefig('figpath.png', dpi=400)
注意:保存图形的代码必须置于show()函数之前执行。
完整代码示例。
import matplotlib.pyplot as plt
import numpy as np
# 拿起画板
fig = plt.figure()
# 贴上画纸
ax1 = fig.add_subplot(221)
ax2 = fig.add_subplot(222)
ax3 = fig.add_subplot(223)
# 数据准备
x_sin = np.arange(0, 6, 0.001) # [0, 6]
y_sin = np.sin(x_sin)
data_random = np.zeros(7) # 生成[-1,1]的7个随机数
for i in range(0, 6):
data_random[i] = np.random.uniform(-1, 1)
# 画图
ax1.plot(x_sin, y_sin, linestyle='-', color='g', linewidth=3, label='sin')
ax1.plot(data_random, linestyle='dashed', color='b', marker='o', label='random')
ax2.plot(x_sin, y_sin, linestyle='-', color='g', linewidth=3, label='sin')
ax2.plot(data_random, linestyle='dashed', color='b', marker='o', label='random')
ax3.plot(x_sin, y_sin, linestyle='-', color='g', linewidth=3, label='sin')
ax3.plot(data_random, linestyle='dashed', color='b', marker='o', label='random')
# # 添加标题
ax2.set_title('Title')
# 添加x轴名称
ax2.set_xlabel('x')
# 设置x轴坐标范围
ax2.set_xlim(xmin=0, xmax=6)
# 添加图例
ax2.legend(loc='best')
ax3.set_title('Title')
# 添加x轴名称
ax3.set_xlabel('x')
# 设置x轴坐标范围
ax3.set_xlim(xmin=0, xmax=6)
# 添加图例
ax3.legend(loc='best')
# 注解
ax3.annotate('max', xy=((np.pi) / 2, np.sin(np.pi/2)),
xytext=((np.pi) / 2, np.sin(np.pi/2)-0.2),
arrowprops=dict(facecolor='black', headwidth=4, width=2,headlength=4),
horizontalalignment='left', verticalalignment='top')
ax3.annotate('min', xy=((np.pi) * 3 / 2, np.sin(np.pi * 3 / 2)),
xytext=((np.pi) * 3 / 2, np.sin(np.pi * 3 / 2)+0.2),
arrowprops=dict(facecolor='black', headwidth=4, width=2,headlength=4),
horizontalalignment='left', verticalalignment='top')
# 矩形
# print(ax1.axis())
rect = plt.Rectangle((np.pi / 2, ax3.axis()[2]), np.pi, ax3.axis()[3] - ax3.axis()[2], color='r', alpha=0.3) # 起始坐标点,width, height
ax3.add_patch(rect)
#-----------------添加部分------------------
plt.savefig('figpath.png', dpi=400)
#------------------------------------------
plt.show()
总结部分。
文章至此结束,希望能为读者提供帮助,同时也欢迎关注本站获取更多技术内容。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









