Python Package:matplotlib

Posted on Wed, 25 Dec 2024 16:11:32 +0800 by LiangMingJian


概述

matplotlib 是 Python 提供的绘图工具,可以帮助用户通过可视化的方式查看或分析数据。

pip install matplotlib

使用

import matplotlib.pyplot as plt  # 约定俗成的写法 plt
import numpy as np

X=np.linspace(-np.pi,np.pi,256,endpoint=True)  # -π,to+π 的 256 个值
# 定义两个函数(正弦&余弦)
C,S=np.cos(X),np.sin(X)
plt.plot(X,C)
plt.plot(X,S)
plt.show()

示例一:在画布上绘制一张图

x=np.linspace(0,10,1000)  # X轴数据
y1=np.sin(x)     # Y轴数据
y2=np.cos(x**2)  # Y轴数据 x^2即x的平方

plt.figure(figsize=(8,4))

plt.plot(x,y1,label="$sin(x)$",color="red",linewidth=2)  # 将$包围的内容渲染为数学公式
plt.plot(x,y2,"b--",label="$cos(x^2)$")
# 指定曲线的颜色和线性,如'b--'表示蓝色虚线(b:蓝色,-:虚线)

plt.xlabel("Time(s)")
plt.ylabel("Volt")
plt.title("PyPlot First Example")

'''
使用关键字参数可以指定所绘制的曲线的各种属性:
label:给曲线指定一个标签名称,此标签将在图标中显示。如果标签字符串的前后都有字符'$',则Matplotlib会使用其内嵌的LaTex引擎将其显示为数学公式
color:指定曲线的颜色。颜色可以用如下方法表示
       英文单词
       以 # 字符开头的3个16进制数,如 #ff0000 表示红色。
       以0~1的RGB表示,如(1.0,0.0,0.0)也表示红色。
linewidth:指定权限的宽度,可以不是整数,也可以使用缩写形式的参数名lw。
'''

plt.ylim(-1.5,1.5)
plt.legend() # 显示左下角的图例
plt.show()

示例二:在画布上绘制多张图

如果要绘制多幅图表的话,可以给 Figure 传递一个整数参数指定图表的序号,如果所指定序号的绘图对象已经存在的话,将不创建新的对象,而只是让它成为当前绘图对象。

fig1=plt.figure(2)
plt.subplot(211)
# subplot(211)把绘图区域等分为2行*1列共两个区域,然后在区域1(上区域)中创建一个轴对象
plt.subplot(212)
# 在区域2(下区域)创建一个轴对象
plt.show()

还可以通过命令再次拆分这些块(相当于 Word 中拆分单元格操作)

f1=plt.figure(5)# 弹出对话框时的标题,如果显示的形式为弹出对话框的话
plt.subplot(221)
plt.subplot(222)
plt.subplot(212)
plt.subplots_adjust(left=0.08,right=0.95,wspace=0.25,hspace=0.45)
# subplots_adjust的操作时类似于网页css格式化中的边距处理,左边距离多少?
# 右边距离多少?这取决于你需要绘制的大小和各个模块之间的间距
plt.show()

示例三:通过 Axes 设置当前图的属性

当画布中绘制图案过多,用户可以使用 Axes 对象选取不同的小模块进行格式化设置。

fig,axes=plt.subplots(nrows=2,ncols=2)
plt.show()

需要通过命令来操作每个 plot(subplot),设置它们的 title 并删除横纵坐标值。

fig,axes=plt.subplots(nrows=2,ncols=2)
axes[0,0].set(title='Upper Left')
axes[0,1].set(title='Upper Right')
axes[1,0].set(title='Lower Left')
axes[1,1].set(title='Lower Right')

# 通过Axes的flat属性进行遍历
for ax in axes.flat:
    ax.set(xticks=[],yticks=[])
    # xticks和yticks设置为空置
plt.show()

实际来说,plot 操作的底层就是 Axes 对象的操作,只不过,如果不使用 Axes 而用 plot 操作时,它默认的是 plot.subplot(111),也就是说 plot 其实是 Axes 的特例。

示例四:图像的保存

plt.savefig(r"C:\Users\123\Desktop\save_test.png",dpi=520)
# 默认像素 dpi 是 80

EX.matplotlib 的底层 backend

matplotlib 中,frontend 是我们写的代码,而 backend 就是负责显示我们代码所写图形的底层代码。

在不同环境下,相应的 backend 后端可能会有所不同,其内容与具体的硬件和显示条件相关。因此在服务器使用matplotlib时,可能会因为没有安装图形化和显示相关的包导致出现backend错误。为解决backend错误的问题,通常需要手动在脚本中指定与服务器相配的backend类别。

backend 又分为两类,一类是 interface backend,又叫做 interactive backend,这一类是表示跟显示到屏幕相关的后端;另一类是 hardcopy backend,又叫做 non-interactive backend,这一类是写入到文件相关的后端。

non-interactive backend

interactive backend

import matplotlib
matplotlib.rcsetup.interactive_bk # 获取 interactive backend
matplotlib.rcsetup.non_interactive_bk # 获取 non-interactive backend
matplotlib.rcsetup.all_backends # 获取 所有 backend

在代码中,有 4 种方式可以来设置 matplotlib 的 backend,在下面的介绍中,越后面的设置方式,优先级越高,后面的设置会覆盖前面的设置。

  1. 通过设置 matplotlibrc 的配置文件来设置。需要注意的是,matplotlibrc 文件不一定在你的工程目录下,可以通过matplotlib.get_configdir()获取其存放位置,然后添加backend: WXAgg这样的内容来进行指定。
  2. 通过MPLBACKEND环境变量来设置 backend。设置名为MPLBACKEND='Agg'的环境变量来进行指定。
  3. 通过-d选项来设置。在运行脚本时使用python script.py -d backend进行指定。
  4. 通过matplotlib.use('Agg')函数来设置。
参考文件 1: Python 绘图与可视化 @小杜同学的嘚啵嘚 2: Matplotlib 的 backend 浅析 @王云峰 3: Matplotlib 接口文档