使用 matplotlib 进行科学绘图第二弹-调整坐标轴
坐标轴主要包含了轴标签(axis labels)、刻度(ticks)和刻度标签(tick labels)。
1. 设置轴标签
轴标签主要用来说明各个坐标轴的物理意义。可以通过以下方式设置。
ax.set_xlabel('Axis Label for X') ax.set_ylabel('Axis Label for Y')
同时,matplotlib 的文本渲染也支持简单的 \(\LaTeX\) 语法,只需在字符串前加上 'r'
使其作为 raw 字符串即可, $$
包围起来的区域会被自动解析为数学环境。同样的,
title 也可通过同样方式设置。
# 从 matplotlib 中引入 pyplot from matplotlib import pyplot as plt import numpy as np # x 的范围 xlim = (0, 10) # 生成 [0, 10] 的等差格点作为 x x = np.linspace(*xlim, 1000) # 生成对应 y 值 y = np.log(np.sin(x)**2 + 1) # 生成 figure 对象 fig = plt.figure() # 添加子图 ax ax = fig.add_subplot(111) # 绘制折线图 ax.plot(x, y) # 设置子图标题 ax.set_title(r"Image of $f(x) = \log(\sin^2 x + 1)$") # 设置 x 轴标签 ax.set_xlabel(r"x") # 设置 y 轴标签 ax.set_ylabel("$f(x)$") # 显示图像 plt.show()
2. 设置坐标轴上下限
一般来说,matplotlib 会自动将上下限设置为比数据最大值和最小值多出约 10% 的区域。 但很多时候我们需要手动进行调整。以上面的图为例,\(x\) 的范围为 \([0, 10]\),我们希望 x 轴的范围也为 \([0, 10]\),则可通过如下方法设置,y 轴同理。
xlim = (0, 10)
ax.set_xlim(xlim)
3. 设置坐标轴缩放类型
很多时候,我们需要将图绘制为对数刻度,调用 set_xscale
和 set_yscale
方法,参
数选择 'log'
。
ax.set_yscale('log')
4. 设置刻度
在 matplotlib 中,刻度是一个容器(tick containers),可以通过传入一个可索引对象
来自定义刻度。通过 set_xticks=和 =set_yticks
来分别 x 轴和 y 轴的刻度。
# 设置 [0, 1..10] 数组作为刻度 ax.set_xticks(np.arange(0, 11, 1))
另一种方法是使用刻度定位器(tick locator)。
# 引入 IndexLocator from matplotlib.ticker import IndexLocator # 实例化 IndexLocator 对象 locator = IndexLocator(offset=0, base=1) # 设置副刻度定位器 ax.xaxis.set_major_locator(locator)
这两种方法此处具有相同的效果,但是 tick locator 具有更加强大的功能,matplotlib 提供以下 locator
Locators | Description |
---|---|
plt.NullLocator() | 空定位器,即不显示刻度 |
plt.MaxNLocator(nbins=5, steps=[1, 3, 5, 7, 9]) | nbin=5:面元边界个数即 4 个 bucket steps 不知道啥意思 |
plt.FixedLocator(locs=[0, 2.5, 5, 7.5, 10]) | 直接指定刻度值位置 |
plt.AutoLocator() | 自动分配刻度值位置 |
plt.AutoMinorLocator() | 自动分配副刻度值位置 |
plt.IndexLocator(base=1.5, offset=0.5) | 从 0.5 开始,间隔 1.5 |
plt.MultipleLocator(1) | 可以自由定义刻度间隔,间隔为 1 |
plt.LinearLocator(numticks=21) | 线性划分 20 等分,21 个刻度 |
plt.LogLocator(base=2, subs=(1.0,)) | 对数定位器 |
5. 设置刻度标签
ticklabels 的长度需要与 ticks 相同,并且是可索引对象。可以通过使用 r'$math$'
的形式使用 LaTeX 引擎。
# 设置 [0, pi, 2pi, 3pi] 作为刻度 ax.set_xticks(np.arange(0, 4, 1) * np.pi) # 设置刻度标签 ax.set_xticklabels([r'$0$', r'$\pi$', r'$2\pi$', r'$3\pi$'])
6. 设置副刻度(Minor Ticks)
设置副刻度需要使用坐标刻度定位器。
# 引入 Multiplelocator from matplotlib.ticker import MultipleLocator # 实例化 Multiplelocator 对象,刻度间距为 np.pi / 3 xminorLocator = MultipleLocator(np.pi / 3) # 设置副刻度定位器 ax.xaxis.set_minor_locator(xminorLocator)
7. 刻度方向
我认为老师说我图做得丑的一个重要原因是 matplotlib 刻度的默认方向是向外的。。
# 设置刻度方向有两种方式 # 第一种是面向对象式,现在还没整明白 # 第二种是命令式,设置 xtick 和 ytick 的方向:in、out、inout plt.rcParams['xtick.direction'] = 'in' plt.rcParams['ytick.direction'] = 'in'