Matplotlib:自动修改轴标签

时间:2017-04-25 09:26:51

标签: python matplotlib

我知道可以手动设置轴标签来更改轴标签。 (例如:Modify tick label text

然而,这显然只有在你知道你想要什么标签的情况下才有效,但对我来说并非如此。

以下是我想要完成的一个例子: 我有两个numpy数组:x包含1到366之间的数字(但不一定是所有数字),代表2016年的几天。' y'包含一些其他数字。我想做一个散布情节' y'与' x':

import numpy as np
import matplotlib.pyplot as plt
x = np.array([27, 38, 100, 300])
y = np.array([0.5, 2.5, 1.0, 0.8])
plt.scatter(x, y)

不出所料,这会生成一个刻度为0,50,100,...,350的图表。我想将这些刻度标签更改为各个日期。 (例如,50的刻度将被标记为' 2月19日'。)假设我有一个函数tick_to_date,它可以将数字0转换为日期字符串,所以它是我可以手动更改图表中的所有刻度。 (如果您需要占位符函数:tick_to_date = lambda x: ("day " + str(x))

ax = plt.gca()
ax.set_xticklabels([tick_to_date(tick.get_text()) for tick in ax.get_xticklabels()])

然而,这只做了一次。如果我现在放大,或采取任何改变滴答的行动,新的刻度标签将不会是我想要的。

理想情况下,我不是手动设置标签,而是告诉轴始终使用我自己的tick_to_date函数转换刻度标签。或者,每次更改刻度时调用上面的代码行,但我不确定它是否会如此有效。这些中的任何一个是可行的/可行的/愉快的吗?

1 个答案:

答案 0 :(得分:3)

如果我真的理解你的问题,你正在寻找来自matplotlib.ticker的function formatter

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import ticker

# I added 'y' to fit second argument (position) of FuncFormatter
tick_to_date = lambda x,y: ("day " + str(x))

x = np.array([27, 38, 100, 300])
y = np.array([0.5, 2.5, 1.0, 0.8])
plt.scatter(x, y)

ax = plt.gca()
# tick_to_date will affect all tick labels through MyFormatter
myFormatter = ticker.FuncFormatter(tick_to_date)
# apply formatter for selected axis
ax.xaxis.set_major_formatter(myFormatter)
plt.show()