为了设置轴对象的标签,可以使用xticklabels
方法:
fig, ax = plt.subplots()
ax.imshow(np.eye(101))
labels = np.linspace(2, 4, 4)
ax.set_xticks([0, 33, 66, 100])
ax.set_xticklabels(labels)
给出了:
也可以使用formatter:
格式化标签fig, ax = plt.subplots()
labels = np.linspace(2, 4, 4)
ax.imshow(np.eye(101))
ax.set_xticks([0, 33, 66, 100])
ax.set_xticklabels(labels)
ax.xaxis.set_major_formatter(FormatStrFormatter('%.2f'))
但是格式化程序只使用刻度位置,而不是他的标签:
解决方法是在使用set_xticklabels
之前手动设置标签格式:
fig, ax = plt.subplots()
labels = ["{0:.1f}".format(x) for x in np.linspace(2, 4, 4)]
ax.imshow(np.eye(101))
ax.set_xticks([0, 33, 66, 100])
ax.set_xticklabels(labels)
所以,有两个问题:
set_xticklabels
功能时是否可以格式化标签?例如,使用格式字符串。set_xticklabels
和Formatter之间的链接是什么?格式化程序似乎根本没有考虑set_xticklabels
,并自行生成标签。答案 0 :(得分:4)
设置xticklabels相当于使用FixedFormatter
。
ax.set_xticklabels(ticks)
与
相同ax.xaxis.set_major_formatter(matplotlib.ticker.FixedFormatter(ticks))
(见source code)
如果您设置了ticklabels然后设置了一个格式化程序,它只会覆盖之前设置的ticklabels。反之亦然。
因为set_xticklabels
使用的是FixedFormatter
,而不是{1}}。 a FormatStrFormatter
,您需要自己格式化ticklabels。从这个意义上讲,使用FormatStrFormatter
可能是比使用预格式化列表更好的方法。
答案 1 :(得分:1)
还有另一种选择,使用extent
函数的imshow
参数:如果您只想要一个自动定位和格式的刻度,它将为您处理所有事情:
fig, ax = plt.subplots()
ax.imshow(np.eye(101), extent=[2, 4, 2, 4])
请小心按顺序排列矩阵:使用extent
,x和y轴上的最小刻度值将始终位于左下角! (所以matrix[-1, 0]
)。
答案 2 :(得分:1)
现在(在 matplotlib 3.4.2 上测试)您还可以使用 .format_ticks
的 Formatter
方法。
ax.set_xticklabels(FormatStrFormatter('%.2f').format_ticks(ticks))
Formatter
在将刻度线传递给 set_xticklabels
之前格式化它们。