设置自定义 imshow 刻度以显示为科学记数法

Setting custom imshow ticks to appear as scientific notation

所以我是一个相当新的 python 程序员,并且在这个小问题上停留的时间比我应该的要长。我有这个情节:

如您所见,只有 select 个值显示为科学记数法。

我希望所有值都以科学计数法出现(即 1e1、1e2 ... 等等)这是我尝试过的(许多)尝试之一:

fig2 = plt.figure(2)
ax = plt.gca()

plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
plt.xlabel('gamma')
plt.ylabel('C')
plt.imshow(scores, interpolation='nearest', cmap=plt.cm.hot,
           norm=MidpointNormalize(vmin=0.2, midpoint=0.7))
plt.colorbar()           
ax.set_yticks(range(len(C_range)))
ax.set_yticklabels(C_range)
ax.set_xticks(range(len(gamma_range)))
ax.set_xticklabels((gamma_range), rotation=45)

plt.title('Validation accuracy')
plt.tight_layout()
fig2.show()

上面代码中的第 3 行似乎没有做任何事情,所以我想我可以将它移到 set_xticks 部分之后,因为我假设这些行会覆盖 ticklabel_format 命令。好累以下:

fig2 = plt.figure(2)
ax = plt.gca()

plt.xlabel('gamma')
plt.ylabel('C')

plt.imshow(scores, interpolation='nearest', cmap=plt.cm.hot,
           norm=MidpointNormalize(vmin=0.2, midpoint=0.7))
plt.colorbar()           
ax.set_yticks(range(len(C_range)))
ax.set_yticklabels(C_range)
ax.set_xticks(range(len(gamma_range)))
ax.set_xticklabels((gamma_range), rotation=45)
plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
plt.title('Validation accuracy')
plt.tight_layout()
fig2.show()

这导致:

AttributeError: This method only works with the ScalarFormatter.

我已经阅读了很多关于如何做这样的事情的例子,但是每次我按照已经完成的事情去做,要么没有任何反应,要么我得到同样的错误。

有人可以解释一下这里到底发生了什么吗? ax.set_yticks 是否更改格式化程序?我没有明确选择格式化程序,这是我需要做的事情吗?我怎样才能强制输出我要找的东西?

所以我找到了一个解决方法来满足我的需要,尽管 xticks/yticks 覆盖格式化程序的确切原因超出了我的理解范围。如果有人想为我澄清一下,我会洗耳恭听,因为我对它的工作原理很感兴趣。

我只是将 C_range 和 gamma_range 数组更改为字符串列表并将它们传递到 xticks/yticks

fmt_C = ['%.0e' % i for i in C_range.tolist()]
fmt_gamma = ['%.0e' % i for i in gamma_range.tolist()]

plt.xticks(np.arange(len(gamma_range)), fmt_gamma, rotation=45)
plt.yticks(np.arange(len(C_range)), fmt_C)