我需要为几个子图的每个图指定刻度格式化器:
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用于所有其他图。我做错了什么?
答案 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()
这是一个使用原始FuncFormatter
格式化程序对象的版本。 map
方法从其关联的lambda函数创建三个单独的ticker对象。 for
循环遍历ax
和tick
以分配每个子图。
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()