坐标轴刻度#

默认情况下,Matplotlib 使用线性刻度在坐标轴上显示数据。Matplotlib 还支持 对数刻度 以及其他不太常见的刻度。通常,这可以通过直接使用 set_xscaleset_yscale 方法来实现。

import matplotlib.pyplot as plt
import numpy as np

import matplotlib.scale as mscale
from matplotlib.ticker import FixedLocator, NullFormatter

fig, axs = plt.subplot_mosaic([['linear', 'linear-log'],
                               ['log-linear', 'log-log']], layout='constrained')

x = np.arange(0, 3*np.pi, 0.1)
y = 2 * np.sin(x) + 3

ax = axs['linear']
ax.plot(x, y)
ax.set_xlabel('linear')
ax.set_ylabel('linear')

ax = axs['linear-log']
ax.plot(x, y)
ax.set_yscale('log')
ax.set_xlabel('linear')
ax.set_ylabel('log')

ax = axs['log-linear']
ax.plot(x, y)
ax.set_xscale('log')
ax.set_xlabel('log')
ax.set_ylabel('linear')

ax = axs['log-log']
ax.plot(x, y)
ax.set_xscale('log')
ax.set_yscale('log')
ax.set_xlabel('log')
ax.set_ylabel('log')
axes scales

loglog 和 semilogx/y#

对数坐标轴使用频率很高,因此有一组辅助函数可以完成相同的事情:semilogysemilogxloglog

fig, axs = plt.subplot_mosaic([['linear', 'linear-log'],
                               ['log-linear', 'log-log']], layout='constrained')

x = np.arange(0, 3*np.pi, 0.1)
y = 2 * np.sin(x) + 3

ax = axs['linear']
ax.plot(x, y)
ax.set_xlabel('linear')
ax.set_ylabel('linear')
ax.set_title('plot(x, y)')

ax = axs['linear-log']
ax.semilogy(x, y)
ax.set_xlabel('linear')
ax.set_ylabel('log')
ax.set_title('semilogy(x, y)')

ax = axs['log-linear']
ax.semilogx(x, y)
ax.set_xlabel('log')
ax.set_ylabel('linear')
ax.set_title('semilogx(x, y)')

ax = axs['log-log']
ax.loglog(x, y)
ax.set_xlabel('log')
ax.set_ylabel('log')
ax.set_title('loglog(x, y)')
plot(x, y), semilogy(x, y), semilogx(x, y), loglog(x, y)

其他内置刻度#

还可以使用其他刻度。注册的刻度列表可以通过 scale.get_scale_names 返回。

['asinh', 'function', 'functionlog', 'linear', 'log', 'logit', 'mercator', 'symlog']
fig, axs = plt.subplot_mosaic([['asinh', 'symlog'],
                               ['log', 'logit']], layout='constrained')

x = np.arange(0, 1000)

for name, ax in axs.items():
    if name in ['asinh', 'symlog']:
        yy = x - np.mean(x)
    elif name in ['logit']:
        yy = (x-np.min(x))
        yy = yy / np.max(np.abs(yy))
    else:
        yy = x

    ax.plot(yy, yy)
    ax.set_yscale(name)
    ax.set_title(name)
asinh, symlog, log, logit

刻度的可选参数#

一些默认刻度具有可选参数。这些参数在 scale 中相应刻度的 API 参考文档中有所说明。可以更改所绘制对数的底数(例如,下面的 2)或 'symlog' 的线性阈值范围。

fig, axs = plt.subplot_mosaic([['log', 'symlog']], layout='constrained',
                              figsize=(6.4, 3))

for name, ax in axs.items():
    if name in ['log']:
        ax.plot(x, x)
        ax.set_yscale('log', base=2)
        ax.set_title('log base=2')
    else:
        ax.plot(x - np.mean(x), x - np.mean(x))
        ax.set_yscale('symlog', linthresh=100)
        ax.set_title('symlog linthresh=100')
log base=2, symlog linthresh=100

任意函数刻度#

用户可以定义一个完整的刻度类,并将其传递给 set_xscaleset_yscale(参见 自定义刻度)。一种简便方法是使用 'function' 刻度,并传递 forwardinverse 函数作为额外参数。以下代码对 y 轴执行 墨卡托投影

# Function Mercator transform
def forward(a):
    a = np.deg2rad(a)
    return np.rad2deg(np.log(np.abs(np.tan(a) + 1.0 / np.cos(a))))


def inverse(a):
    a = np.deg2rad(a)
    return np.rad2deg(np.arctan(np.sinh(a)))


t = np.arange(0, 170.0, 0.1)
s = t / 2.

fig, ax = plt.subplots(layout='constrained')
ax.plot(t, s, '-', lw=2)

ax.set_yscale('function', functions=(forward, inverse))
ax.set_title('function: Mercator')
ax.grid(True)
ax.set_xlim([0, 180])
ax.yaxis.set_minor_formatter(NullFormatter())
ax.yaxis.set_major_locator(FixedLocator(np.arange(0, 90, 10)))
function: Mercator

什么是“刻度”?#

刻度是一个附加到轴上的对象。类文档位于 scaleset_xscaleset_yscale 在相应的 Axis 对象上设置刻度。可以使用 get_scale 确定轴上的刻度。

fig, ax = plt.subplots(layout='constrained',
                              figsize=(3.2, 3))
ax.semilogy(x, x)

print(ax.xaxis.get_scale())
print(ax.yaxis.get_scale())
axes scales
linear
log

设置比例尺会做三件事。首先,它定义了轴上的一个变换,将数据值映射到轴上的位置。此变换可以通过 get_transform 访问。

LogTransform(base=10, nonpositive='clip')

轴上的变换是一个相对底层的概念,但它是 set_scale 所扮演的重要角色之一。

设置比例尺还会设置适合该比例尺的默认刻度定位器 (ticker) 和刻度格式化器。具有 'log' 比例尺的轴有一个 LogLocator 来选择十进制间隔的刻度,以及一个 LogFormatter 来在十进制上使用科学计数法。

print('X axis')
print(ax.xaxis.get_major_locator())
print(ax.xaxis.get_major_formatter())

print('Y axis')
print(ax.yaxis.get_major_locator())
print(ax.yaxis.get_major_formatter())
X axis
<matplotlib.ticker.AutoLocator object at 0x7fb4047a2cf0>
<matplotlib.ticker.ScalarFormatter object at 0x7fb3fcaddd00>
Y axis
<matplotlib.ticker.LogLocator object at 0x7fb3fc5ae2a0>
<matplotlib.ticker.LogFormatterSciNotation object at 0x7fb3f3c2c530>

脚本总运行时间:(0 分钟 6.877 秒)

由 Sphinx-Gallery 生成的画廊