一、Matplotlib 可视化常用函数
1. 导入库
通常对库名进行重定义,便于引用。
import matplotlib.pyplot as plt
2. plt.grid(*args):绘制网格函数
具体参数如下:
本文介绍了 Python 第三方库 Matplotlib 的常用功能与绘图技巧。涵盖导入方式、网格绘制、图像尺寸设置、布局优化(tight_layout/constrained_layout)、面向对象编程模式(Figure/Axes)、子图创建(subplot/subplot2grid)、图片保存、图例添加及坐标轴控制等核心知识点。通过代码示例演示了如何配置字体、线型、颜色及复杂布局,适用于数据可视化与科学计算场景。
通常对库名进行重定义,便于引用。
import matplotlib.pyplot as plt
具体参数如下:
其中最重要的参数是 visible 和 alpha。
Demo:
plt.grid(
visible=True,
which='major',
axis='both',
alpha=0.3,
color='gray',
linestyle='--',
linewidth=0.5
)
通常 plt.figure(10, 5) 用于桌面图片显示。最常用。
为了确保布局更加紧凑美观,在 plt.show() 之前添加一个 plt.tight_layout() 函数,确保布局紧凑。
在 Matplotlib 中,最常使用的绘图方式是面向对象编程。将整个图片 Figure 和每一个具体的绘图区域 Axes 视为操作对象,调用具体函数更简单,可读性强。可以将关于整个图片 Figure 的属性(如 bbox、figsize、DPI、figure_path 等)与关于每个具体绘图区域 Axes 的属性(如 xlabel、title、legend、linestyle、linecolor 等)分开。通常自定义调参时主要针对 Axes 的参数。
明确 Figure 和 Axes 两个参数之后,介绍最常用的绘图方式,尤其是一个 Figure 里边有很多个子图。具体格式如下:
fig, axes = plt.subplots(m, n)
当然,subplot 函数还有很多参数,比如 constrained_layout {bool}。这个参数很重要,中文是'受限布局',可以对布局进行限制,使其更加规范,防止重叠现象。有点像 plt.tight_layout(),但是二者不一样。
具体使用的 Demo:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
matplotlib.use('TkAgg')
plt.style.use('seaborn-v0_8-bright')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 不使用 constrained_layout
fig1, axes1 = plt.subplots(2, 2, figsize=(10, 8))
for i in range(2):
for j in range(2):
axes1[i, j].plot(np.random.rand(10))
axes1[i, j].set_title(f'非常长的标题 {i},{j}' * 3)
axes1[i, j].set_xlabel('X 轴标签')
axes1[i, j].set_ylabel('Y 轴标签')
fig1.suptitle('不使用 constrained_layout', fontsize=16)
plt.tight_layout()
plt.show()
# 使用 constrained_layout
fig2, axes2 = plt.subplots(2, 2, figsize=(10, 8), constrained_layout=True)
for i in range(2):
for j in range(2):
axes2[i, j].plot(np.random.rand(10))
axes2[i, j].set_title(f'非常长的标题 {i},{j}' * 3)
axes2[i, j].set_xlabel('X 轴标签')
axes2[i, j].set_ylabel('Y 轴标签')
fig2.suptitle('使用 constrained_layout', fontsize=16)
plt.tight_layout()
plt.show()
总结:constrained_layout=True 时,可以合理规范布局,对于很长的标题或者标签,都不会发生重叠。
plt.savefig(*args)。内部参数有很多,但最重要的就是第一个 filename{str} 参数,其余的都是默认即可,特殊需求可自行查阅文档。os.mkdir(str)、os.path.join(str) 等函数,快速组装起保存的路径。import os
def save_figure_customed(filename, save_directory='Result/Figures'):
if not os.path.exists(save_directory):
os.makedirs(save_directory)
save_path = os.path.join(save_directory, filename)
plt.savefig(save_path, bbox_inches='tight')
Note:Os 第三方库是专门用来和电脑操作系统交互使用的库,可以用来快速获取文件路径,建立文件夹等操作,需要提前引用进项目当中。
savefig(*args) 函数中的参数 bbox_inches='tight',主要是用来保存 Figure 时裁剪边框的空白,照片会显得更加紧凑。
虽然说最常用的绘图方法是面向对象绘图,但是最后的显示代码,仍然要是:
plt.tight_layout()
plt.show()
若仍然适用 fig 对象操作,照片会闪一下,然后代码执行结束,无法直接观看 Figure。
图例函数:plt.legend(*args)。注意参数 loc(即 location),loc='upper right' 表示将图例添加到右上角。然后若使用 plt 为对象时,loc=0 表示自动寻找最好的位置,但是若使用 axes 为对象时,没有这个选项,只可以自动添加字符串位置。
关于 axes 对象的绘图属性,提供一个可以实践的 Demo:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
matplotlib.use('TkAgg')
plt.style.use('seaborn-v0_8-bright')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 创建图形和坐标轴
fig, ax = plt.subplots(figsize=(10, 5))
# 1. 绘制不同类型的数据
x = np.linspace(0, 10, 100)
ax.plot(x, np.sin(x), 'b-', label='sin(x)', linewidth=2)
ax.scatter(x[::10], np.cos(x[::10]), c='red', s=50, label='cos(x) 采样点')
ax.fill_between(x, np.sin(x), 0, where=(np.sin(x)>0), color='green', alpha=0.3, label='正半轴区域')
plt.legend(loc='upper right')
plt.legend(loc=0)
plt.show()
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 4))
line1, = ax1.plot(x, np.sin(x), label='sin(x)')
line2, = ax1.plot(x, np.cos(x), label='cos(x)')
ax2.plot(x, -np.sin(x), label='sin(x)')
ax2.plot(x, -np.cos(x), label='cos(x)')
# 创建统一图例
fig.legend([line1, line2], ['正弦函数', '余弦函数'], loc='upper right', ncol=2)
plt.tight_layout()
plt.show()
# 2. 坐标轴控制方法
print("=== Axes 对象方法 ===")
# 设置标签
ax.set_xlabel('X 轴标签', fontsize=12)
ax.set_ylabel('Y 轴标签', fontsize=12)
ax.set_title('坐标轴方法示例', fontsize=14, fontweight='bold')
# 设置坐标轴范围
ax.set_xlim(0, 10)
ax.set_ylim(-1.5, 1.5)
# 设置刻度
ax.set_xticks(np.arange(0, 11, 2))
ax.set_yticks(np.arange(-1.5, 2, 0.5))
ax.tick_params(axis='both', labelsize=10)
# 添加网格
ax.grid(True, which='both', linestyle='--', alpha=0.5)
# 添加图例
ax.legend(loc='upper right', fontsize=10, framealpha=0.9)
# 3. 添加各种图形元素
# 水平线和垂直线
ax.axhline(y=0, color='black', linewidth=0.8, linestyle='-')
ax.axvline(x=5, color='red', linewidth=1, linestyle='--', alpha=0.7)
# 填充区域
ax.axvspan(2, 4, alpha=0.2, color='yellow')
ax.axhspan(-0.5, 0.5, alpha=0.2, color='blue')
# 箭头标注
ax.annotate('最大值点', xy=(np.pi/2, 1), xytext=(4, 1.2), arrowprops=dict(arrowstyle='->', color='green'), fontsize=10, ha='center')
# 4. 获取坐标轴属性
print(f"X 轴范围:{ax.get_xlim()}")
print(f"Y 轴范围:{ax.get_ylim()}")
print(f"X 轴标签:{ax.get_xlabel()}")
print(f"Y 轴标签:{ax.get_ylabel()}")
print(f"标题:{ax.get_title()}")
plt.tight_layout()
plt.show()
plt.suptitle(*args),最后对于整个 figure 的一个属性——super title 总标题,需要注意的参数是 y。
y=1.02,表示距离图形 axes 的顶部高出 2%,y=1,则与图形顶部距离最近,默认是 1。y 太大,会导致在导出的时候,主标题被'截断'。
复杂布局常用函数 plt.subplot2grid(*args),和 plt.subplots(*args) 类似,但是更加灵活。
plt.subplot2grid(*args) 的参数有:
Note:该函数返回值只是一个 axes_n 参数,没有 fig 对象,返回的对象是一个不可迭代的对象。
Demo:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.gridspec as gridspec
import matplotlib
matplotlib.use('TkAgg')
plt.style.use('seaborn-v0_8-bright')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 方法 1:使用 subplot2grid
fig = plt.figure(figsize=(14, 10))
# 创建 2x2 的网格,但第一个子图占两列
ax1 = plt.subplot2grid((3, 4), (0, 0), colspan=4, rowspan=2)
ax2 = plt.subplot2grid((3, 4), (2, 0), colspan=1)
ax3 = plt.subplot2grid((3, 4), (2, 1), colspan=1)
ax4 = plt.subplot2grid((3, 4), (2, 2), colspan=1)
ax5 = plt.subplot2grid((3, 4), (2, 3), colspan=1)
# 绘制内容
x = np.linspace(0, 10, 100)
ax1.plot(x, np.sin(x), 'b-', label='主图')
ax1.set_title('主图(占两行四列)')
ax1.legend()
ax1.grid(True)
for i, ax in enumerate([ax2, ax3, ax4, ax5], 1):
ax.plot(x, np.random.randn(100).cumsum())
ax.set_title(f'子图{i}')
ax.grid(True, alpha=0.3)
plt.suptitle('使用 subplot2grid 的复杂布局', fontsize=16, y=1)
plt.tight_layout()
plt.show()

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online