2016-09-21 179 views
1

我正在尋找一種方法,以便在使用科學記數法時更改軸上指數的位置。我已經陷入了這個問題幾次。我已經知道默認格式化程序是ScalarFormatter,但它無法以某種方式訪問​​指數。在matplotlib中使用科學記數法時定位刻度標籤的指數

有一個workaround但我不喜歡它,因爲它也操縱現有的標籤。到目前爲止,我發現,如果使用科學記數法,軸方法返回的列表更多地包含一個文本對象。例如:

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()) 

Image with the resulting plots

的打印功能可給出:<a list of 9 Text xticklabel objects><a list of 10 Text xticklabel objects> 於是我想到了另外的列表項目可能是指數的文本對象。但是當我打印文本時它是空的。

有什麼辦法可以將這個指數作爲文本對象來訪問嗎?那麼應該有可能確定它的位置,不是嗎?

+0

你可以使用'ax2.xaxis.get_offset_text含指數的'Text'對象()'。雖然這有一個'.set_position()'方法,但是當畫布重繪時,它的位置似乎會被重置。如果你能弄清楚發生了什麼,那麼你應該能夠覆蓋文本的位置。 –

回答

0

要訪問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)) 

exponent label moved horizontally

+1

非常感謝!我沒有想到指數會出現在偏移文本中。 – kluonk

+0

'set_position(x,y)',修改'y'似乎沒有效果? – zyxue