如何为多个子图指定刻度格式化程序

3
我需要为多个子图指定刻度格式化程序:
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 函数中创建了三个独立的刻度对象。 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()

我需要在格式化子程序中执行更复杂的任务,不仅仅是格式化数字。您提到的覆盖点看起来很有前途。当我为每个图使用单独的变量时,它可以工作。但我不理解它。 - Jiří Polcar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接