如何为多个子图指定刻度格式器

3 投票
1 回答
2392 浏览
提问于 2025-04-18 01:07

我需要为多个子图中的每个图指定刻度格式化器:

import numpy as np
import pylab as plt
import matplotlib.ticker as ticker


x = np.arange(10)
y = x

fig = plt.figure()

for i in [1, 2, 3]:
    ax = fig.add_subplot(3, 1, i)
    ax.plot(x, y)
    ticks = ticker.FuncFormatter(lambda x, pos: '{}:{:g}'.format(i, x))
    ax.xaxis.set_major_formatter(ticks)

plt.show()

但是只有最后一个(底部的)格式化器被应用到所有其他图上。我哪里做错了呢?

输出示例

1 个回答

2

你可以使用一个叫做 ticker.FormatStrFormatter 的对象,下面有个示例。

我觉得你最开始的方法有问题,是因为你把每个坐标轴的 Formatter 都设置成了 tick 这个变量,然后在下一次循环时又覆盖了它,这样所有的图表都在用最后一次循环的 tick 变量。

当你创建 Formatter 对象时,每个子图都需要一个自己的对象。在我下面的代码中就没有这个问题,因为我没有把 FormatStrFormatter 赋值给一个变量。

import numpy as np
import pylab as plt
import matplotlib.ticker as ticker

x = np.arange(10)
y = x

fig, axes = plt.subplots(nrows=3, ncols=1)

for i, ax in enumerate(axes):
    ax.plot(x, y)
    ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('{}:%d'.format(i+1)))

plt.show()

示例图

编辑

这里有一个版本,使用了原来的 FuncFormatter 格式化对象。map 方法从它们对应的 lambda 函数创建了三个独立的 ticker 对象。for 循环遍历 axtick,为每个子图分配。

import numpy as np
import pylab as plt
import matplotlib.ticker as ticker

x = np.arange(10)
y = x

fig, axes = plt.subplots(nrows=3, ncols=1)

def create_ticker(i):
    # Create a FuncFormatter.
    return ticker.FuncFormatter(lambda x, pos: '{}:{:g}'.format(i+1, x))

ticks = map(create_ticker, range(3))

for ax, tick in zip(axes, ticks):
    ax.plot(x, y)
    ax.xaxis.set_major_formatter(tick)

plt.show()

撰写回答