Cycoe@Home

使用 matplotlib 进行科学绘图第二弹-调整坐标轴

Sorry, your browser does not support SVG.
Figure 1: 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()
LaTeX.png
Figure 2: matplotlib 支持 LaTeX

2 设置坐标轴上下限

一般来说,matplotlib 会自动将上下限设置为比数据最大值和最小值多出约 10% 的区域。 但很多时候我们需要手动进行调整。以上面的图为例,\(x\) 的范围为 \([0, 10]\),我们希望 x 轴的范围也为 \([0, 10]\),则可通过如下方法设置,y 轴同理。

xlim = (0, 10)
ax.set_xlim(xlim)
xlim.png
Figure 3: 为 x 轴设置范围

3 设置坐标轴缩放类型

很多时候,我们需要将图绘制为对数刻度,调用 set_xscaleset_yscale 方法,参 数选择 'log'

ax.set_yscale('log')
scale.png
Figure 4: 普通刻度与对数刻度的对比

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)
ticks.png
Figure 5: 自定义刻度

这两种方法此处具有相同的效果,但是 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$'])
ticklabels.png
Figure 6: 自定义刻度标签

6 设置副刻度(Minor Ticks)

设置副刻度需要使用坐标刻度定位器。

# 引入 Multiplelocator
from matplotlib.ticker import MultipleLocator

# 实例化 Multiplelocator 对象,刻度间距为 np.pi / 3
xminorLocator = MultipleLocator(np.pi / 3)
# 设置副刻度定位器
ax.xaxis.set_minor_locator(xminorLocator)
minor_ticks.png
Figure 7: 自定义副刻度

7 刻度方向

我认为老师说我图做得丑的一个重要原因是 matplotlib 刻度的默认方向是向外的。。

# 设置刻度方向有两种方式
# 第一种是面向对象式,现在还没整明白

# 第二种是命令式,设置 xtick 和 ytick 的方向:in、out、inout
plt.rcParams['xtick.direction'] = 'in'
plt.rcParams['ytick.direction'] = 'in'
Author: Cycoe (cycoejoo@163.com)
Date: <2019-12-06 Fri 14:57>
Generator: Emacs 28.0.50 (Org mode 9.3)
Built: <2020-05-21 Thu 20:10>