Matplotlib 库使用入门8
在前面关于 matploblib 的文章中,笔者分别介绍了:
前面介绍了 Matplotlib 将数据绘制成各种常用图形进行展示的方法,但是实际情况中还可能使用更多其他的图(比如3D图等等),笔者接触较少,这里不一一展开介绍了。关于 Matplotlib 库最全面的介绍可以参考 Matplotlib 官方网站(https://matplotlib.org/3.6.2/index.html#),这里有全面的用户文档、教程示例、API 详解等等,笔者使用的是3.6.2版本,其他版本亦可浏览。
本篇为 Matplotlib 最后一篇,介绍 Matplotlib 绘制文本、数学表达式以及处理图像的方法。
绘制文本与数学表达式
绘制文本的函数与功能
Matplotlib 内置有字体管理器,它是一个实现了跨平台的字体集合,支持广泛的文本格式,比如: TTF(TrueType Font页面语言)、Unicode 字符等。 用户可以对文本属性进行控制,比如:字体大小、粗细、位置和颜色等。通过下表中的方法可以绘制出相应的内容:
函数 | 功能 |
---|---|
text / figtext | 在绘图区域 / 画布的任意位置添加文本。 |
title / suptitle | 为绘图区域 / 画布添加标题。 |
xlabel / ylabel | 在绘图区域的 x / y 轴上添加标签。 |
annotate | 在绘图区域的任意位置添加带有可选箭头的注释。 |
-
plt.text(x, y, s, **kwargs)
或者axes.text(...)
x / y:在图形坐标系中,文本的横 / 纵坐标;
s:文本字符串;
其他:给出了字体属性,比如:
fontsize:设置字体大小,默认12,可取 'xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’,‘x-large’, ‘xx-large’;
fontweight:设置字体粗细,可取 ‘light’, ‘normal’, ‘medium’, ‘semibold’, ‘bold’, ‘heavy’, ‘black’;
fontstyle:设置字体类型,可取 ‘normal’,‘italic’,‘oblique’ ;
verticalalignment:水平对齐方式 ,可取 ‘center’ , ‘top’ , ‘bottom’ , ‘baseline’;
horizontalalignment:垂直对齐方式,可取 ‘left’, ‘right’, ‘center’;
rotation:(旋转角度)可选参数为:‘vertical’,‘horizontal’, 也可以为数字;
alpha:透明度,参数值0至1之间;
backgroundcolor:背景颜色;
bbox:增加外框 ,常用参数有:boxstyle 方框外形、facecolor(fc) 背景颜色、edgecolor(ec) 边框线条颜色、edgewidth 边框线条大小。 -
plt.title(label, fontdict, loc, pad, *, y, **kwargs)
或者ax.set_title(...)
label:绘图区标题字符串;
fontdict:字典,给出字体属性,参考上述 text 的参数;
loc:指定标题位置。 -
plt.suptitle(t, **kwargs)
或者fig.suptitle(...)
t 为标题字符串;其他参数给出字体属性,参考上述 text 的参数。 -
plt.xlabel(xlabel, fontdict, labelpad, *, loc, **kwargs)
或者ax.set_xlabel(...)
xlabel:x 轴标签字符串;
fontdict:字典,给出字体属性,参考上述 text 的参数;
loc:指定轴标签位置。 -
plt.annotate(text, xy, xytext, xycoords='data', textcoords, arrowprops, annotation_clip, **kwargs)
或者axes.annotate(...)
text:注释文本;
xy:被注释的数据点的坐标;
xytext:注释文本内容坐标;
arrowprops:字典,设置注释箭头的属性;
其他参数给出注释文本的字体属性,参考上述 text 的参数。
绘制数学表达式
Matplotlib 支持在文本中使用 LATEX,因此,需要书写数学表达式时,可将其中的特殊格式字符串使用 Text Markup(一种文本标记语言)表达出来。具体的使用方法是:
- 将特殊符号文本放在一对美元符号内,即使用 ‘$’ 作为界定符( ‘$…$’ )。
- 通常使用 raw 字符串,即 r’$…$’ 的格式,因为原生字符串不会转义 ‘\’,从而使得大量的 LATEX 词法能够正确解析。
- 如果要绘制下标和上标,需要使用 ‘_’ 和 ‘^’ 符号。
上述文本与数学表达式绘制示例如下:
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"] # 设置字体
plt.rcParams["axes.unicode_minus"] = False # 正常显示负号
fig = plt.figure('Text example1', figsize=(7, 6))
fig.suptitle(t='Matplotlib画布标题', horizontalalignment='center',
verticalalignment='top', fontsize=20) # 画布标题,水平居中、置顶,字体大小20。
# 这里也可以使用 x、y 比例值指定位置:
# fig.suptitle(t='Matplotlib 绘制文本示例', x=0.2, y=0.97, fontsize=20)
ax = fig.add_subplot()
ax.set_title('axes绘图区标题', loc='left', fontsize=16, fontweight='bold')
ax.set_xlabel('这是 x 轴标签', rotation=10, backgroundcolor='y', color='b', alpha=0.5)
ax.set_ylabel('这是 y 轴标签') # 使用默认的字体和位置
ax.text(3, 8, '文本示例1', style='italic', bbox={'facecolor': 'm'}, fontsize='xx-large')
ax.text(7, 7, '文本示例2', fontdict={'bbox':{'facecolor': 'c'}, 'fontsize':10})
ax.text(4, 0, '文本示例3', horizontalalignment='left', verticalalignment='bottom', color='g') # 指定文本对齐方式
ax.text(2, 6, r'数学方程: $E = mc^2$', fontsize=15)
ax.text(6, 1, r'比大小:$\alpha_i> \sqrt{2}\beta_i$', fontsize=15)
ax.text(4, 3, r'函数:$\mathcal{A}\mathrm{sin}(2 \omega t)$', fontsize = 20)
ax.plot([2], [1], 'o')
ax.annotate('注释:该点坐标为(2,1)', xy=(2, 1), xytext=(3, 4),
arrowprops={'facecolor': 'blue', 'shrink': 0.04},
fontsize=20, color='r', rotation=15, backgroundcolor='y', alpha=0.7)
ax.axis([0, 10, 0, 9])
plt.show()
绘制结果如下图:
图像处理
Matplotlib 软件包中的 image 模块提供了保存、加载、缩放、显示图像的功能,但该模块支持的图片格式有限,通常情况下可以采用 Python 图像处理库 Pillow 来处理图像。
-
plt.imread(fname, format=None)
fname 是图像的文件名,返回一个 numpy 数组。 -
plt.imshow(X, cmap, norm, aspect, interpolation, alpha, vmin, vmax, origin, extent, filternorm=True, filterrad=4.0, resample, url, data, **kwargs)
X:包含了图片的数据。其形状可以为:(n,m)(灰度图),类型为float;(n,m,3)(RGB图),类型为float或unit8;(n,m,4)(RGBA图),类型为float或unit8。
cmap:Colormap 实例。默认由rc的image.cmap指定。若X是RGB/RGBA,则忽略。
aspect:一个字符串,指定图片的缩放。可以为:‘auto’ 、‘equal’ 。
interpolation:一个字符串,指定插值方式。
norm:Normalize实例,用于将图片亮度正则化到 0~1。默认采用normalize.norm
vmin/vmax:辅助norm进行正则化。如果传入了一个norm实例,则忽略。
alpha:浮点数,指定透明度。
origin:可以为’upper’/‘lower’。图片的第一个像素X[0,0]放置在坐标原点。‘upper’:横坐标向右,纵坐标向下;‘lower’:横坐标向右,纵坐标向上。
extent:元组(left, right, bottom, top),等价于同时使用了set_xlim(left,right)+set_ylim(bottom,top)
filternorm/filterrad:用于过滤。
其他参数用于调整 Artist属性,返回一个AxesImage对象。 -
plt.imsave(fname, arr, **kwargs)
该函数保存图像。
fname:图像的文件名;
arr:图像数组数据。 -
fig.savefig(fname, *, transparent, **kwargs)
该函数保存画布。
fname:带路径的文件名。
dpi:保存的分辨率。
facecolor/edgecolor:figure rectangle的背景色和边线颜色。
orientation:可以为 ‘landscape’ / ‘portrait’。
format:图片格式,可以为’png’/‘pdf’/‘svg’/‘eps’…。
transparent:如果为True,设置figure和axes背景透明(除非设置了facecolor/edgecolor)。
示例如下:
import numpy as np
import matplotlib.pyplot as plt
img = plt.imread('logo.png') # 返回一个numpy数组
print(img.shape) # (128, 554, 3)
fig = plt.figure(figsize=(7,5))
ax1 = fig.add_subplot(221)
ax1.imshow(img)
ax1.set_title('default')
ax2 = fig.add_subplot(222)
ax2.imshow(img[:100, :300, :], aspect='equal')
ax2.set_title('partial')
ax3 = fig.add_subplot(223)
ax3.imshow(img, origin='lower')
ax3.set_title("origin='lower'")
ax4 = fig.add_subplot(224)
ax4.imshow(img, origin='upper', alpha=0.5)
ax4.set_title("origin='upper', alpha=0.5")
plt.imsave("E:/logo2.png", img[:100, :300, :], origin = 'lower') # 保存图片,部分保存,上下翻转
fig.savefig('E:/fig.png', dpi=200, facecolor='gray', transparent=False) # 保存绘制图像,背景灰色
fig.savefig('E:/fig2.png', dpi=200, transparent=True) # 保存绘制图像,背景透明
plt.show()
图像处理如下图:
以上。