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

时间:2014-04-03 07:45:25

标签: python matplotlib

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

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

但只有最后一个(底部)fotmatter用于所有其他图。我做错了什么? output example

1 个答案:

答案 0 :(得分:1)

您可以使用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()

Example plot

修改

这是一个使用原始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()