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)

请注意,所有刻度标签在轴的末端都有重复。为什么?如何从 Text 元素列表中过滤掉它们?他们的get_visible()属性是True。

另一件事是我首先必须调用draw()才能更新/生成刻度。如何强制更新刻度标签?matplotlib.colorbar.Colorbar似乎有一种update_ticks()方法,但我在轴上找不到类似的滴答声。

我还尝试编写一个自定义后端并从draw_text() 渲染器的方法中获取所有文本。与文档相反,draw_text()它没有收到matplotlib.text.Text包含所有必要信息的实例,而只有一个简单的字符串和一个预先布局的位置。

4

1 回答 1

1

这个问题的答案在 matplotlib 邮件列表中给出。Tick 对象总是创建两个文本标签,一个用于左/下,一个用于右/上。绘制 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
于 2012-06-15T09:28:28.863 回答