2

位置、スタイル、配置などを含むすべてのテキスト要素を matplotlibfigure から抽出する方法を探していますfindobj(matplotlib.text.Text)。図のメソッドを呼び出すと、その仕事が正確に行われます。ただし、すべての目盛りラベルで奇妙な重複が発生し、それらの処理方法がわかりません。

たとえばfindobj、軸のすべての Text 要素を出力するために使用します。

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 です。

もう1つのことはdraw()、ティックを更新/生成するために最初に呼び出しを行う必要があることです。目盛りラベルを強制的に更新するにはどうすればよいですか? matplotlib.colorbar.Colorbarメソッドがあるようupdate_ticks()ですが、軸の目盛りに似たものが見つかりません。

また、カスタム バックエンドを作成してdraw_text() 、レンダラーのメソッドからすべてのテキストを取得しようとしました。ドキュメントとは対照的に、必要なすべての情報を含むインスタンスをdraw_text()受け取るのではmatplotlib.text.Textなく、単純な文字列と事前にレイアウトされた位置のみを受け取ります。

4

1 に答える 1

1

この問題に対する答えは、matplotlib メーリング リストで提供されました。Tick オブジェクトは常に 2 つのテキスト ラベルを作成します。1 つは左/下用、もう 1 つは右/上用です。ティック アーティストが描画されると、その属性label1Onlabel2On属性によって、2 つの子テキスト ラベルのどちらが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
于 2012-06-15T09:28:28.863 に答える