2012-06-13 235 views
2

我正在尋找一種方法來從matplotlibfigure中提取所有文本元素,包括它們的位置,樣式,對齊方式等。調用圖形的findobj(matplotlib.text.Text)方法完全可以完成這項工作。但是,我爲所有的刻度標籤得到了一些奇怪的副本,我不知道如何處理它們。Matplotlib中的重複刻度標籤

例如,使用findobj用於打印軸的所有文本元素:

import matplotlib 
import pylab as p 

p.plot([1,2,3]) 
p.xticks([1],["tick"]) 
ax = p.gca() 
fig = p.gcf() 

p.draw() 
def print_texts(artist): 
    for t in artist.findobj(matplotlib.text.Text): 
     if t.get_visible() and t.get_text(): 
      print " %r @ %s" % (t.get_text(), t.get_position()) 

print "X-Axis Text Elements:" 
print_texts(ax.xaxis) 
print "Y-Axis Text Elements:" 
print_texts(ax.yaxis) 

結果:

X-Axis Text Elements: 
'tick' @ (1.0, 0.0) 
'tick' @ (0.0, 1.0) 
Y-Axis Text Elements: 
u'1.0' @ (0.0, 1.0) 
u'1.0' @ (1.0, 0.0) 
u'1.5' @ (0.0, 1.5) 
u'1.5' @ (1.0, 0.0) 
u'2.0' @ (0.0, 2.0) 
u'2.0' @ (1.0, 0.0) 
u'2.5' @ (0.0, 2.5) 
u'2.5' @ (1.0, 0.0) 
u'3.0' @ (0.0, 3.0) 
u'3.0' @ (1.0, 0.0) 

注意,所有的標記都定位在軸的端部重複。爲什麼?如何從文本元素列表中過濾掉它們?它們的get_visible()屬性爲True。

另一件事是,我首先必須撥打電話draw()以更新/生成滴答。我如何強制更新刻度標籤? matplotlib.colorbar.Colorbar似乎有一個update_ticks()方法,但我找不到類似的蜱軸上。

我也嘗試編寫一個custum後端,並從渲染器的draw_text() 方法中獲取所有文本。與文檔draw_text()相比, 沒有收到帶有所有必需的 信息的matplotlib.text.Text實例,但只有簡單的字符串和預先佈置的位置。

+0

不管它是值得的,你可能有更多的運氣與此有關的郵件列表。 –

+0

我正試圖爲(xe)乳膠書寫一個後端,它將圖像和文本元素(如inkscape)分開保存爲pdf時可選。這樣,文本的字體將跟隨您在文檔中使用的任何字體,而無需重新創建圖形。 – pwuertz

+0

哦,也發佈在郵件列表使用nabble但消息花了2-3小時,直到他們出現在名單上。這讓我感到困惑,我在這裏提出了這個問題。 – pwuertz

回答

1

這個問題的答案在matplotlib郵件列表中給出。 Tick對象總是創建兩個文本標籤,一個用於左/右,一個用於右/頂。當勾選藝術家時,其label1Onlabel2On屬性定義兩個子標籤中的哪一個接收draw()呼叫。但是它們都保持在可見狀態。

所以通過數字的所有文本元素迭代之前,我隱藏不應該被看到這些標籤:

for tick in fig.findobj(matplotlib.axis.Tick): 
    tick.label1.set_visible(tick.label1On) 
    tick.label2.set_visible(tick.label2On) 

for text in fig.findobj(match=Text, include_self=False): 
    s = text.get_text() 
    if not s or not text.get_visible(): continue 
    # do something with the texts 
相關問題