文章目录

  • 对数坐标系
  • 自定义映射
  • 对数图表
  • 重置刻度

matplotlib支持重设坐标轴刻度,包括刻度值的重新映射和刻度标签的重新映射。前者可以调整坐标刻度的缩放比例,后者可以更改显示文字,以增强图像的表现力。

对数坐标系

在实际绘图时,如果python matplotlib坐标轴改名 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()

python matplotlib坐标轴改名 matplotlib调整坐标轴_对数坐标_02

从其y轴坐标可以看出,linear就是最常见的线性映射;log是对数坐标;symlog是“双”对数坐标;logit则是以0.5为中心的双对数坐标。

自定义映射

set_xscale和set_yscale这两个函数,除了支持matplotlib实现好的字符串标识之外,还支持自定义函数映射。例如,想把y轴映射为python matplotlib坐标轴改名 matplotlib调整坐标轴_python_03,则需要定义两个函数,分别用于坐标系映射和图像映射,具体代码如下

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()

python matplotlib坐标轴改名 matplotlib调整坐标轴_matplotlib_04

对数图表

虽然上面的例程均通过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()

结果为

python matplotlib坐标轴改名 matplotlib调整坐标轴_semilog_05

重置刻度

通过更改坐标映射,可以改变坐标轴的数值分布情况,但并不能更改坐标轴上显示的文字。通过xticks和yticks,可以修改坐标轴的刻度标签。以xticks为例,其主要参数为ticks和labels,二者构成了一一对应的坐标刻度映射,可以实现下图的效果

python matplotlib坐标轴改名 matplotlib调整坐标轴_matplotlib_06

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】中,将坐标重新映射为字符串,从而可用python matplotlib坐标轴改名 matplotlib调整坐标轴_对数坐标_07的整数倍来表示横轴;【224】则直接将坐标设为了空列表,从而隐藏了坐标刻度。

如果不仅想取消坐标刻度,还隐藏了坐标图框,则可直接用更加极端的off开关,示例如下

plt.plot(x,y)
plt.axis('off')
plt.show()

python matplotlib坐标轴改名 matplotlib调整坐标轴_python_08