我正在寻找一种在使用科学计数法时改变指数在轴上的位置的方法。我已经被这个问题困扰过几次了。我已经知道默认格式化程序是ScalarFormatter但它没有选项以某种方式访问指数。
有一个解决方法,但我不喜欢它,因为它还会操纵现有的刻度标签。到目前为止,我发现,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())
Run Code Online (Sandbox Code Playgroud)

打印给出: <a list of 9 Text xticklabel objects>因此<a list of 10 Text xticklabel objects>
我认为附加列表项可能是指数的文本对象。但当我打印文本时它是空的。
有没有办法以文本对象的形式访问该指数?那么应该可以设置它的位置,不是吗?
要访问Text 对象列表,您可以使用该类的方法,例如get_text():
print([s.get_text() for s in ax2.get_xmajorticklabels()])
Run Code Online (Sandbox Code Playgroud)
然而,这样做的结果是
<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'']
Run Code Online (Sandbox Code Playgroud)
运行后,现在可以枚举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)]
Run Code Online (Sandbox Code Playgroud)
对于像 之类的指数-7,两个列表中实际上有相同数量的对象。
Scott 在这里详细介绍了我找到的最接近的标签定位方法。遗憾的是,它只能在 x 轴上水平工作,在 y 轴上垂直工作,因此您无法真正在图表上任意定位标签。
ax2.get_xaxis().get_offset_text().set_position((0.5,0))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10964 次 |
| 最近记录: |