【人工智能概论】pyplot作图中文显示、逐点标记、保存图像
文章目录
- 【人工智能概论】pyplot作图中文显示、逐点标记、保存图像
- 一. 简单的绘图
- 二. 逐点坐标显示
- 三. 中文显示
- 四. 中文显示可能遇到的问题——缺少字体
- 4.1 下载 SimHei.ttf
- 4.2 复制 SimHei.ttf 到 Matplotlib 的 font/ttf 文件夹
- 4.3 修改 Matplotlib 配置
- 4.4 清空原有配置
- 4.5 大功告成
- 五. 保存图像
- 5.1 保存单张图片
- 5.2 保存多张图片
一. 简单的绘图
- 代码:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(10) # 用numpy生成x坐标点
y = x * x + x - 3
# 生成y坐标的值
plt.title("y = x^2 + x - 3") # 设置标题
plt.xlabel("x") # 设置x坐标标签
plt.ylabel("y") # 设置y坐标标签
plt.plot(x, y) # 绘图
plt.show() # 显示图片
- 效果图:
二. 逐点坐标显示
- 如果只有上面的那种干巴巴的图,可读性会很差,因此不妨将绘图的点,逐点进行坐标展示。
- 代码:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(10) # 用numpy生成x坐标点
y = x * x + x - 3
# 生成y坐标的值
plt.xlabel("x") # 设置x坐标标签
plt.ylabel("y") # 设置y坐标标签
plt.title("y = x^2 + x - 3") # 设置标题
plt.plot(x, y, color='r', markerfacecolor='blue', marker='o') # 绘图
for a, b in zip(x, y): # 添加这个循环显示坐标
plt.text(a, b, (a, b), ha='center', va='bottom', fontsize=10)
plt.show() # 显示图片
- 效果图:
三. 中文显示
- Matplotlib默认显示英文,如果不进行相关设定,妄图直接输出中文,收获的只能是一堆方块乱码。
- 实际上只需要加两条语句即可实现中文显示,如下:
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
- 代码:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(10) # 用numpy生成x坐标点
y = x * x + x - 3
# 生成y坐标的值
plt.title("一元二次方程") # 设置标题
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
plt.xlabel("x") # 设置x坐标标签
plt.ylabel("y") # 设置y坐标标签
plt.plot(x, y, color='r', markerfacecolor='blue', marker='o') # 绘图
for a, b in zip(x, y): # 添加这个循环显示坐标
plt.text(a, b, (a, b), ha='center', va='bottom', fontsize=10)
plt.show() # 显示图片
- 效果图:
四. 中文显示可能遇到的问题——缺少字体
- 在初次设定中文显示时,可能会遇到这样的问题:
findfont: Generic family 'sans-serif' not found because none of the following families were found: SimHei
,这说明Matplotlib缺少SimHei字体。 - 这就需要我们下载SimHei.ttf ,并配置Matplotlib。
4.1 下载 SimHei.ttf
- 略
4.2 复制 SimHei.ttf 到 Matplotlib 的 font/ttf 文件夹
- 执行以下代码:
import matplotlib
print(matplotlib.matplotlib_fname())
- 会得到类似如下以 matplotlibrc 结尾的地址:
/home/用户名/anaconda3/envs/环境名/lib/python3.10/site-packages/matplotlib/mpl-data/matplotlibrc
- 以此路径为基础,获得ttf文件的存放路径:
/home/用户名/anaconda3/envs/环境名/lib/python3.10/site-packages/matplotlib/mpl-data/font/ttf
- 将下载好的ttf文件移动到此。
4.3 修改 Matplotlib 配置
- 执行以下代码:
import matplotlib
print(matplotlib.matplotlib_fname())
- 会得到类似如下以 matplotlibrc 结尾的地址,它就是Matplotlib的配置文件:
/home/用户名/anaconda3/envs/环境名/lib/python3.10/site-packages/matplotlib/mpl-data/matplotlibrc
- 终端中输入以下指令,打开配置文件:
gedit /home/用户名/anaconda3/envs/环境名/lib/python3.10/site-packages/matplotlib/mpl-data/matplotlibrc
- 做以下三点修改
修改1:去掉 font.family 前的 # 号;
修改2:去掉 font.sans-serif 前的 # 号,并加入 SimHei ;
修改3:去掉 axes.unicode_minus 前的 # 号,并将其值修改为 False。
- 修改前:
#font.family: sans-serif
#font.serif: DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
#axes.unicode_minus: True # use Unicode for the minus symbol rather than hyphen. See
# https://en.wikipedia.org/wiki/Plus_and_minus_signs#Character_codes
- 修改后:
font.family: sans-serif
font.serif: SimHei, DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
axes.unicode_minus: False # use Unicode for the minus symbol rather than hyphen. See
# https://en.wikipedia.org/wiki/Plus_and_minus_signs#Character_codes
4.4 清空原有配置
- 执行以下指令,获得Matplotlib的缓存文件位置:
import matplotlib
print(matplotlib.get_cachedir())
- 得到类似下面的结果:
/home/用户名/.cache/matplotlib
- 终端执行以下指令,清除缓存文件
rm -r /home/用户名/.cache/matplotlib
4.5 大功告成
- 重启编辑器,执行代码:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(10) # 用numpy生成x坐标点
y = x * x + x - 3
# 生成y坐标的值
plt.title("一元二次方程") # 设置标题
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
plt.xlabel("x") # 设置x坐标标签
plt.ylabel("y") # 设置y坐标标签
plt.plot(x, y, color='r', markerfacecolor='blue', marker='o') # 绘图
for a, b in zip(x, y): # 添加这个循环显示坐标
plt.text(a, b, (a, b), ha='center', va='bottom', fontsize=10)
plt.show() # 显示图片
- 效果图:
- 果然神功大成。
五. 保存图像
5.1 保存单张图片
- 只需添加以下指令:
plt.savefig('./image/pic.png')
5.2 保存多张图片
- 生成不同图像的代码间,要额外添加一条语句,用于重置plt,以避免图像混叠:
plt.clf()
- 代码举例:
plt.plot(loss, 'r')
plt.title("Loss")
plt.xlabel("epoch")
plt.ylabel("Loss")
plt.savefig("loss.png")
plt.clf() # 添加上这一行,画完第一个图后,将plt重置
plt.plot(acc, 'r')
plt.title("Accuracy")
plt.xlabel("epoch")
plt.ylabel("accuracy")
plt.savefig("accuracy.png")