设置自定义 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)
所以我是一个相当新的 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)