我正在寻找一种从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()
方法,但我找不到与轴上的刻度类似的东西。
我还尝试编写一个custum后端并从draw_text()
获取所有文本
渲染器的方法。与文档draw_text()
相反
没有收到所有必要的matplotlib.text.Text
个实例
信息,但只有一个简单的字符串和一个预先安排好的位置。
答案 0 :(得分:1)
这个问题的答案在matplotlib邮件列表中给出。 Tick对象始终创建两个文本标签,一个用于左/底,一个用于右/顶。绘制刻度线艺术家时,其label1On
和label2On
属性会定义两个子文本标签中的哪一个接收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