3.21 Matplotlib进阶绘图——图中文本命令及参数
梦幻加工厂
编辑于 2024年01月06日 22:37
收录于文集
共46篇

一、 基本文本命令

对于绘图,文本命令主要来自于两个接口,一个是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&#​39;, 'sans-serif&#​39;, 'cursive&#​39;, 'fantasy&#​39;, 'monospace&#​39;}

6. fontproperties

功能:设置字体

7. fontsize

功能:字体大小,一个浮点数

8. fontstretch

功能:字体拉伸程度。一个0-1000的浮点数,或'ultra-condensed&#​39;, 'extra-condensed&#​39;, 'condensed&#​39;, 'semi-condensed&#​39;, 'normal&#​39;, 'semi-expanded&#​39;, 'expanded&#​39;, 'extra-expanded&#​39;, 'ultra-expanded&#​39;

9. fontstyle

功能:字体类型。{'normal&#​39;, 'italic&#​39;, 'oblique&#​39;}

10. fontweight

功能:字体粗细。一个0-1000浮点数 或 'ultralight&#​39;, 'light&#​39;, 'normal&#​39;, 'regular&#​39;, 'book&#​39;, 'medium&#​39;, 'roman&#​39;, 'semibold&#​39;, 'demibold&#​39;, 'demi&#​39;, 'bold&#​39;, 'heavy&#​39;, 'extra bold&#​39;, 'black&#​39;

11. horizontalalignment 或 ha

功能:设置相对于锚点的水平对齐。 {'left&#​39;, 'center&#​39;, 'right&#​39;}

12. label

功能:设置图形标签,一个字符串

13. linespacing

功能:将行间距设置为字体大小的倍数。一个浮点数

14. math_fontfamily

功能:设置数学公式字体,一个字符串

15. multialignment 或 ma

功能:设置多行文本的文本对齐方式。 {'left&#​39;, 'right&#​39;, 'center&#​39;}

16. path_effects

功能:设置路径效果,详见上一章。

17. position

功能:设置文字的位置,一个浮点二元组,分别是0-1之间的浮点数

18. rotation

功能:设置文字旋转方向。一个浮点数表示旋转角度或 {'vertical&#​39;, 'horizontal&#​39;}

19. rotation_mode

功能:设置文本旋转模式。{None, 'default&#​39;, 'anchor&#​39;}

20. verticalalignment 或 va

功能:设置相对于锚点的垂直对齐。 {'bottom&#​39;, 'baseline&#​39;, 'center&#​39;, 'center_baseline&#​39;, 'top&#​39;}

三、x轴和y轴标签 xlabel, ylabel

直接使用set_xlabel和set_ylabel即可,语法为

代码块
Python
自动换行
复制代码
ax.set_xlabel(name,其他参数);
ax.set_ylabel(name,其他参数)
复制成功

name表示标签的内容

这里使所有标签文字大小为13。

代码块
Python
自动换行
复制代码
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();
复制成功

我们也可以自定义设置标签的位置

代码块
Python
自动换行
复制代码
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

语法为

代码块
Python
自动换行
复制代码
ax.set_title(name,其他参数)
复制成功

其中name是标题内容,一个字符串。

title标签相较于其它文本标签多了一个loc参数,可以改变标题的位置以及对齐方式,其有三种对齐方式 loc={'center&#​39;, 'left&#​39;, 'right&#​39;}。

代码块
Python
自动换行
复制代码
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

代码块
Python
自动换行
复制代码
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()来设置刻度以及刻度标签,语法如下:

代码块
Python
自动换行
复制代码
ax.set_xticks(xtick,name)
复制成功

这里的xtick表示想要设置的x轴刻度位置,是一个一维数组。name是一个与xtick大小相同的一维数组,表示对应刻度的标签,如果不填此项,则显示原来的数值。ax.set_yticks()的用法与之相同。

例如这里使用三张子图来表示设置不同坐标刻度的样式。

代码块
Python
自动换行
复制代码
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&#​39;,'both&#​39;};默认为'both&#​39;

(2) which

功能:设置该命令所作用的标尺,可以有 {‘major’,'minor&#​39;,'both&#​39;},默认为‘major’

(3) direction

功能:刻度线的方向, 可以有 {'in&#​39;,'out&#​39;,'inout&#​39;};

(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的一维数组,分别表示左端刻度和右端刻度。

代码块
Python
自动换行
复制代码
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 等改变不同时间单位。

代码块
Python
自动换行
复制代码
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

代码块
Python
自动换行
复制代码
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()函数,该函数主要格式如下:

代码块
Python
自动换行
复制代码
plt.text(x,y,s,其它参数);
复制成功

其中x,y分别代表text文字起始的xy坐标位置,各是一个浮点数;s表示文本内容,是一个字符串。

其它参数为文本命令的基本参数,详见本文的第二节。

注意,默认的窗口坐标范围是[0,1],如果超出该坐标,需要使用xlim和ylim修改坐标显示范围。

代码块
Python
自动换行
复制代码
plt.figure();
plt.text(1,1,'Hello World',fontsize=20,color='purple');
plt.xlim([0,2]);
plt.ylim([0,2]);
复制成功