文章目录
- 对数坐标系
- 自定义映射
- 对数图表
- 重置刻度
matplotlib支持重设坐标轴刻度,包括刻度值的重新映射和刻度标签的重新映射。前者可以调整坐标刻度的缩放比例,后者可以更改显示文字,以增强图像的表现力。
对数坐标系
在实际绘图时,如果这两轴的数据变化速率相差过多,线性的坐标映射将无法展示图形变化的细节,就需要更改坐标系的数字映射逻辑,以获得更具细节的图像。
在matplotlib绘图时,通过set_xscale和set_yscale这两个函数,可以轻松对坐标系进行坐标放缩,并且提供了4个基础的放缩模板,分别是linear, log, symlog, logit。
import numpy as np
import matplotlib.pyplot as plt
xs = np.linspace(-5,5,1000)
labels = ['linear', 'log', 'symlog', 'logit']
fig = plt.figure()
for i,L in enumerate(labels, 1):
ax = fig.add_subplot(2,2,i)
ax.plot(xs, np.tan(xs))
ax.plot(xs, np.exp(xs))
ax.set_yscale(L)
ax.set_title(L)
ax.grid()
plt.tight_layout()
plt.show()
从其y轴坐标可以看出,linear就是最常见的线性映射;log是对数坐标;symlog是“双”对数坐标;logit则是以0.5为中心的双对数坐标。
自定义映射
set_xscale和set_yscale这两个函数,除了支持matplotlib实现好的字符串标识之外,还支持自定义函数映射。例如,想把y轴映射为,则需要定义两个函数,分别用于坐标系映射和图像映射,具体代码如下
forward = lambda x : x**(1/2)
inverse = lambda x : x**2
fig, ax = plt.subplots()
xs = np.linspace(0,4,100)
ax.plot(xs, np.exp(xs))
ax.set_yscale('function', functions=(forward, inverse))
ax.set_title('function: $x^{1/2}$')
ax.grid()
plt.tight_layout()
plt.show()
对数图表
虽然上面的例程均通过plot图来演示,但set_xscale和set_yscale其实适用于各种图像。而针对折线图的对数坐标图,matplotlib已经实现了更加成熟的封装,即semilogx, semilogy和loglog。
fig, axes = plt.subplots(1,3, figsize=(8,3))
t = np.linspace(0,200,1000)
axes[0].semilogx(t, np.sin(2 * np.pi * t))
axes[1].semilogy(t, np.exp(-t / 5.0))
axes[2].loglog(t, 20 * np.exp(-t / 10.0))
titles = ['semilogx', 'semilogy', 'loglog']
for ax, title in zip(axes, titles):
ax.set(title=title)
ax.grid()
plt.show()
结果为
重置刻度
通过更改坐标映射,可以改变坐标轴的数值分布情况,但并不能更改坐标轴上显示的文字。通过xticks和yticks,可以修改坐标轴的刻度标签。以xticks为例,其主要参数为ticks和labels,二者构成了一一对应的坐标刻度映射,可以实现下图的效果
x = np.linspace(0,10,100)
y = np.sin(x)
fig = plt.figure()
ax = fig.add_subplot(221)
plt.plot(x,y)
ax = fig.add_subplot(222)
plt.plot(x,y)
L = np.arange(6)*120
plt.xticks(np.deg2rad(L), L)
ax = fig.add_subplot(223)
plt.plot(x,y)
T = [3.14, 6.28, 9.42]
L = ['π', '3π', '3π']
plt.xticks(T, L)
ax = fig.add_subplot(224)
plt.plot(x,y)
plt.xticks([])
plt.show()
其中,图【221】是常规图像,无需多言;【222】中,将坐标重新映射为数值,得以用角度坐标来表示横轴;【223】中,将坐标重新映射为字符串,从而可用的整数倍来表示横轴;【224】则直接将坐标设为了空列表,从而隐藏了坐标刻度。
如果不仅想取消坐标刻度,还隐藏了坐标图框,则可直接用更加极端的off开关,示例如下
plt.plot(x,y)
plt.axis('off')
plt.show()