matplotlib 使用科学计数法时定位刻度标签的指数

des4xlb0  于 2023-10-24  发布在  其他
关注(0)|答案(2)|浏览(98)

我正在寻找一种方法来改变使用科学计数法时指数在轴上的位置。我已经在这个问题上卡住了几次。我已经知道默认格式化程序是ScalarFormatter,但它没有选择以某种方式访问指数。
有一个workaround,但我不喜欢它,因为它也操作现有的ticklabels。到目前为止,我发现,如果使用科学计数法,由axes的get_xmajorticklabels()方法返回的列表包含多一个文本对象。例如:

  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. fig= plt.figure(figsize = plt.figaspect(0.5))
  4. ax1= fig.add_subplot(121)
  5. ax1.plot(np.arange(146), np.random.rand(146))
  6. print(ax1.get_xmajorticklabels())
  7. ax2= fig.add_subplot(122)
  8. ax2.plot(np.arange(146)*1e-6, np.random.rand(146))
  9. print(ax2.get_xmajorticklabels())

印刷品给予:所以我认为额外的列表项可以是指数的文本对象,但是当我打印文本的时候它是空的。
有没有办法把这个指数作为一个文本对象来访问?那么应该可以设置它的位置,不是吗?

oxiaedzo

oxiaedzo1#

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

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

然而,这样做的结果是,

  1. <a list of 9 Text xticklabel objects>
  2. [u'', u'', u'', u'', u'', u'', u'', u'', u'']
  3. <a list of 10 Text xticklabel objects>
  4. [u'', u'', u'', u'', u'', u'', u'', u'', u'', u'']

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

  1. <a list of 9 Text xticklabel objects>
  2. [(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)]
  3. <a list of 10 Text xticklabel objects>
  4. [(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这样的指数,两个列表中实际上有相同数量的对象。
我找到的最接近的定位标签的方法是detailed here by Scott。遗憾的是,它只能水平地定位x轴,垂直地定位y轴,所以你不能在图上任意地定位标签。

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

展开查看全部
flvtvl50

flvtvl502#

我的解决方法是这样的:

  1. import matplotlib.pyplot as plt
  2. from matplotlib import ticker
  3. import numpy as np
  4. fig = plt.figure(figsize = plt.figaspect(0.5))
  5. ax1 = fig.add_subplot(121)
  6. ax1.plot(np.arange(146), 1e+5*np.random.rand(146))
  7. yfmt = ticker.ScalarFormatter(useMathText=True)
  8. yfmt.set_powerlimits((3, 4))
  9. ax1.yaxis.set_major_formatter(yfmt)
  10. ax1.ticklabel_format(style='sci', axis='y', scilimits=(0,0))
  11. ax1.get_yaxis().get_offset_text().set_visible(False)
  12. ax_max = max(ax1.get_yticks())
  13. exponent_axis = np.floor(np.log10(ax_max)).astype(int)
  14. ax1.annotate(r'$\times$10$^{%i}$'%(exponent_axis),
  15. xy=(.01, .96), xycoords='axes fraction')
  16. ax2 = fig.add_subplot(122)
  17. ax2.plot(np.arange(146)*1e-6, np.random.rand(146))
  18. yfmt = ticker.ScalarFormatter(useMathText=True)
  19. yfmt.set_powerlimits((-6, -5))
  20. ax2.xaxis.set_major_formatter(yfmt)
  21. ax2.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
  22. ax2.get_xaxis().get_offset_text().set_visible(False)
  23. ax_max = max(ax2.get_xticks())
  24. exponent_axis = np.floor(np.log10(ax_max)).astype(int)
  25. ax2.annotate(r'$\times$10$^{%i}$'%(exponent_axis),
  26. xy=(.89, .01), xycoords='axes fraction')
  27. plt.tight_layout()
  28. plt.show()

展开查看全部

相关问题