我正在寻找一种使用科学计数法更改指数在轴上的位置的方法。我已经被这个问题困扰了好几次了。我已经知道默认格式化程序是ScalarFormatter,但是它没有以某种方式访问​​指数的选项。

有一个workaround,但我不喜欢它,因为它还会操纵现有的ticklabel。到目前为止,我发现,如果使用科学计数法,则轴的get_xmajorticklabels()方法返回的列表还包含一个文本对象。例如:

import matplotlib.pyplot as plt
import numpy as np

fig= plt.figure(figsize = plt.figaspect(0.5))
ax1= fig.add_subplot(121)
ax1.plot(np.arange(146), np.random.rand(146))
print(ax1.get_xmajorticklabels())

ax2= fig.add_subplot(122)
ax2.plot(np.arange(146)*1e-6, np.random.rand(146))
print(ax2.get_xmajorticklabels())




印刷品给出:<a list of 9 Text xticklabel objects><a list of 10 Text xticklabel objects>
因此,我认为其他列表项可能是指数的文本对象。但是当我打印文本时它是空的。

有什么方法可以作为文本对象访问此指数?然后应该可以设置位置,不是吗?

最佳答案

要访问Text objects列表,您可以使用该类的方法,例如get_text()

print([s.get_text() for s in ax2.get_xmajorticklabels()])


但是,结果是

<a list of 9 Text xticklabel objects>
[u'', u'', u'', u'', u'', u'', u'', u'', u'']
<a list of 10 Text xticklabel objects>
[u'', u'', u'', u'', u'', u'', u'', u'', u'', u'']


运行fig.tight_layout()之后,现在可以列举这些Text xticklabel objects的输出:

<a list of 9 Text xticklabel objects>
[(0.0, 0), (20.0, 0), (40.0, 0), (60.0, 0), (80.0, 0), (100.0, 0), (120.0, 0), (140.0, 0), (160.0, 0)]

<a list of 10 Text xticklabel objects>
[(0.0, 0), (2.0000000000000002e-05, 0), (4.0000000000000003e-05, 0), (6.0000000000000008e-05, 0), (8.0000000000000007e-05, 0), (0.0001, 0), (0.00012000000000000002, 0), (0.00014000000000000001, 0), (0.00016000000000000001, 0), (0, 0)]


对于像-7这样的指数,两个列表中实际上存在相同数量的对象。

我找到的最接近放置标签的方法是here by Scott。可悲的是,它只能在x轴水平方向上工作,而在y轴垂直方向上工作,因此您不能真正在图表上随意放置标签。

ax2.get_xaxis().get_offset_text().set_position((0.5,0))


python - 在matplotlib中使用科学计数法时定位刻度标签的指数-LMLPHP

关于python - 在matplotlib中使用科学计数法时定位刻度标签的指数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39620700/

10-16 22:15