一、 基本文本命令
对于绘图,文本命令主要来自于两个接口,一个是pyplot接口,一个是面向对象OO API 来创建文本,下表为创建文本的基本命令。
pyplot命令 OO API 命令 基本描述
text text 在Axes任意位置添加文本
annotate annotate 在Axes任意位置添加带箭头的文本
xlabel set_xlabel 在Axes的x轴添加标签
ylabel set_ylabel 在Axes的y轴添加标签
title set_title 在Axes添加标题
figtext text 在Figure任意位置添加文本
subtitle subtitle 给Figure添加标题
二、文本命令基本参数
1. alpha
功能:透明度,一个浮点数。
2. backgroundcolor
功能:一个颜色变量,设置背景颜色
3. bbox
功能:绘制一个边框,参数是 patches.FancyBboxPatch
4. color
功能:颜色
5. fontfamily或fontname
功能:字体,包括 {FONTNAME, 'serif', 'sans-serif', 'cursive', 'fantasy', 'monospace'}
6. fontproperties
功能:设置字体
7. fontsize
功能:字体大小,一个浮点数
8. fontstretch
功能:字体拉伸程度。一个0-1000的浮点数,或'ultra-condensed', 'extra-condensed', 'condensed', 'semi-condensed', 'normal', 'semi-expanded', 'expanded', 'extra-expanded', 'ultra-expanded'
9. fontstyle
功能:字体类型。{'normal', 'italic', 'oblique'}
10. fontweight
功能:字体粗细。一个0-1000浮点数 或 'ultralight', 'light', 'normal', 'regular', 'book', 'medium', 'roman', 'semibold', 'demibold', 'demi', 'bold', 'heavy', 'extra bold', 'black'
11. horizontalalignment 或 ha
功能:设置相对于锚点的水平对齐。 {'left', 'center', 'right'}
12. label
功能:设置图形标签,一个字符串
13. linespacing
功能:将行间距设置为字体大小的倍数。一个浮点数
14. math_fontfamily
功能:设置数学公式字体,一个字符串
15. multialignment 或 ma
功能:设置多行文本的文本对齐方式。 {'left', 'right', 'center'}
16. path_effects
功能:设置路径效果,详见上一章。
17. position
功能:设置文字的位置,一个浮点二元组,分别是0-1之间的浮点数
18. rotation
功能:设置文字旋转方向。一个浮点数表示旋转角度或 {'vertical', 'horizontal'}
19. rotation_mode
功能:设置文本旋转模式。{None, 'default', 'anchor'}
20. verticalalignment 或 va
功能:设置相对于锚点的垂直对齐。 {'bottom', 'baseline', 'center', 'center_baseline', 'top'}
三、x轴和y轴标签 xlabel, ylabel
直接使用set_xlabel和set_ylabel即可,语法为
ax.set_xlabel(name,其他参数);
ax.set_ylabel(name,其他参数) name表示标签的内容
这里使所有标签文字大小为13。
import matplotlib as mlt
import matplotlib.pyplot as plt
import numpy as np
mlt.use('TkAgg');
x=np.linspace(0,5,200);
y=np.sin(2*np.pi*x)*np.exp(-0.8*x);
plt.figure(1);
ax=plt.subplot(111);
ax.plot(x,y,color='red',linewidth=4);
ax.set_xlabel('time[s]',fontsize=13);
ax.set_ylabel('height[m]',fontsize=13);
plt.show();

我们也可以自定义设置标签的位置
plt.figure(2);
ax=plt.subplot(111);
ax.plot(x,y,color='yellowgreen',linewidth=4);
ax.set_xlabel('time[s]',fontsize=13,position=(0,1e6),ha='left');
ax.set_ylabel('height[m]',fontsize=13,position=(1e6,1),ha='right'); 这里使用1e6表示该数值不起作用。例如ax.set_xlabel中y坐标不会影响x坐标标签位置。

四、标题 title
语法为
ax.set_title(name,其他参数) 其中name是标题内容,一个字符串。
title标签相较于其它文本标签多了一个loc参数,可以改变标题的位置以及对齐方式,其有三种对齐方式 loc={'center', 'left', 'right'}。
fig,axs=plt.subplots(3,1,figsize=(5,6),tight_layout=True);
locs=['center','left','right'];
for ax,loc in zip(axs,locs):
ax.plot(x,y);
ax.set_title('Title with loc at'+loc,loc=loc);

我们可以通过设置pad参数来表示标题离图的距离,其是一个浮点数,例如pad=30
plt.figure(2);
ax=plt.subplot(111);
ax.plot(x,y,color='yellowgreen',linewidth=4);
ax.set_xlabel('time[s]',fontsize=13,position=(0,1e6),ha='left',fontfamily='Times New Roman');
ax.set_ylabel('height[m]',fontsize=13,position=(1e6,1),ha='right');
ax.set_title('Wave',loc='center',pad=30)

五、刻度和刻度标签
1. ax.set_xticks()和ax.set_yticks()
我们可以使用ax.set_xticks() 和 ax.set_yticks()来设置刻度以及刻度标签,语法如下:
ax.set_xticks(xtick,name) 这里的xtick表示想要设置的x轴刻度位置,是一个一维数组。name是一个与xtick大小相同的一维数组,表示对应刻度的标签,如果不填此项,则显示原来的数值。ax.set_yticks()的用法与之相同。
例如这里使用三张子图来表示设置不同坐标刻度的样式。
import matplotlib as mlt
import matplotlib.pyplot as plt
import numpy as np
mlt.use('TkAgg');
x=np.linspace(0,5,200);
y=np.sin(2*np.pi*x)*np.exp(-0.8*x);
fig,axs=plt.subplots(3,1,figsize=(5,6),tight_layout=True);
axs[0].plot(x,y);
axs[1].plot(x,y);
axs[1].set_xticks([0,5]);
axs[2].plot(x,y);
axs[2].set_xticks([0,2,4],['A','B','C']);
axs[2].set_yticks(np.arange(-1,1.1,1,));
plt.show();

2. 设置坐标标签其他参数
在set_xticks() 和 set_yticks() 中不能设置参数,需要使用ax.tick_params()函数,其有如下参数:
(1) axis
功能:设置该命令作用的坐标轴方向,可以有{‘x’,'y','both'};默认为'both'
(2) which
功能:设置该命令所作用的标尺,可以有 {‘major’,'minor','both'},默认为‘major’
(3) direction
功能:刻度线的方向, 可以有 {'in','out','inout'};
(4) length
功能:刻度线的长度,一个浮点数。
(5) width
功能:刻度线的宽度,一个浮点数。
(6) color
功能:刻度线的shiyi颜色,一个颜色变量。
(7) pad
功能:刻度标签和刻度线的距离,一个浮点数。
(8) labelsize
功能:刻度标签的文字大小,一个浮点数。
(9) labelcolor
功能:刻度标签的颜色,一个颜色变量
(10) labelfontfamily
功能:刻度标签的字体类型,一个字体字符串
(11) colors
功能:同时设置刻度线和刻度标签的颜色,一个颜色变量。
(12) labelrotation
功能:刻度标签旋转的角度(逆时针旋转),一个浮点数。
3. 坐标范围 ax.set_xlim()和ax.set_ylim()
我们可以通过ax.set_xlim()和ax.set_ylim()来设置坐标轴范围,其内部为一个长度为2的一维数组,分别表示左端刻度和右端刻度。
fit,ax=plt.subplots(1,1);
ax.plot(x,y);
ax.set_xlim([0,5]);
ax.set_xticks([0,2.5,5]);
ax.set_ylim([-1,1]);
ax.set_yticks([-1,0,1]);

4. 日期型刻度
我们想要将刻度设置成日期,我们可以使用日期型刻度来解决。最简单的是通过python自带的datetime库来解决。具体该库用法详见 https://www.zhihu.com/tardis/bd/art/425996000?source_id=1001 或 https://www.liaoxuefeng.com/wiki/1016959663602400/1017648783851616
其中datetime.delta() 是用来日期加减的,可以通过years, months, days 等改变不同时间单位。
import matplotlib as mlt
import matplotlib.pyplot as plt
import numpy as np
import datetime
mlt.use('TkAgg');
x=np.linspace(0,5,100);
y=np.sin(2*np.pi*x)*np.exp(-0.8*x);
fig,ax=plt.subplots(figsize=(5,3),tight_layout=True);
base=datetime.datetime(2023,1,1,0,0,0);
time=[base+datetime.timedelta(days=t) for t in range(len(y))];
ax.plot(time,y);
ax.tick_params(axis='x',rotation=70);
plt.show();

如果想要将上述日期坐标更加个性化,可以将上面创建的时间参数传递给 matplotlib.dates.DateFormatter,如果想要创建每月的日期列表,则可以通过matplotlib.dates.DayLocator来创建,当然也可以指定分钟,小时,月份和年,详见
https://matplotlib.org/stable/api/dates_api.html#matplotlib.dates.DayLocator
import matplotlib as mlt
import matplotlib.pyplot as plt
import numpy as np
import datetime
import matplotlib.dates as mdates
mlt.use('TkAgg');
x=np.linspace(0,5,100);
y=np.sin(2*np.pi*x)*np.exp(-0.8*x);
fig,ax=plt.subplots(figsize=(5,3),tight_layout=True);
base=datetime.datetime(2023,1,1,0,0,0);
time=[base+datetime.timedelta(days=t) for t in range(len(y))];
locator=mdates.DayLocator(bymonthday=[5,20]);
formatter=mdates.DateFormatter('%b %d');
ax.xaxis.set_major_locator(locator);
ax.xaxis.set_major_formatter(formatter);
ax.plot(time,y);
ax.tick_params(axis='x',rotation=70);
plt.show();

六、图中文本text
在图中添加文本主要使用plt.text()函数,该函数主要格式如下:
plt.text(x,y,s,其它参数); 其中x,y分别代表text文字起始的xy坐标位置,各是一个浮点数;s表示文本内容,是一个字符串。
其它参数为文本命令的基本参数,详见本文的第二节。
注意,默认的窗口坐标范围是[0,1],如果超出该坐标,需要使用xlim和ylim修改坐标显示范围。
plt.figure();
plt.text(1,1,'Hello World',fontsize=20,color='purple');
plt.xlim([0,2]);
plt.ylim([0,2]);
