是否可以使用matplotlib中的set_xticklabels格式化标签?

时间:2017-07-12 11:35:43

标签: python matplotlib

为了设置轴对象的标签,可以使用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)

给出了:

1

也可以使用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'))

但是格式化程序只使用刻度位置,而不是他的标签:

2

解决方法是在使用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)

3

所以,有两个问题:

  1. 使用set_xticklabels功能时是否可以格式化标签?例如,使用格式字符串。
  2. set_xticklabelsFormatter之间的链接是什么?格式化程序似乎根本没有考虑set_xticklabels,并自行生成标签。

3 个答案:

答案 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])

1

请小心按顺序排列矩阵:使用extent,x和y轴上的最小刻度值将始终位于左下角! (所以matrix[-1, 0])。

答案 2 :(得分:1)

现在(在 matplotlib 3.4.2 上测试)您还可以使用 .format_ticksFormatter 方法。

ax.set_xticklabels(FormatStrFormatter('%.2f').format_ticks(ticks))

Formatter 在将刻度线传递给 set_xticklabels 之前格式化它们。