Matplotlib: 自动调整坐标轴标签。

4

我知道可以通过手动设置轴标签来更改它们。(例如: 修改刻度标签文本)

然而,这只适用于您知道要使用哪些标签的情况,而这并不适用于我。

以下是我想要完成的示例: 我有两个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个回答

5
如果我真正理解你的问题,你正在寻找来自matplotlib.ticker的格式化程序
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()

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