【发布时间】:2012-06-13 13:37:16
【问题描述】:
我正在寻找一种方法来从 matplotlibfigure 中提取所有文本元素,包括它们的位置、样式、对齐方式等。调用图形的 findobj(matplotlib.text.Text) 方法完全可以完成这项工作。然而,我得到了所有刻度标签的一些奇怪的重复,我不知道如何处理它们。
例如,使用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)
请注意,所有刻度标签在轴的末端都有重复的标签。为什么?如何从 Text 元素列表中过滤掉它们?他们的get_visible() 属性为True。
另一件事是我首先必须调用draw() 才能更新/生成刻度。如何强制更新刻度标签? matplotlib.colorbar.Colorbar 似乎有一个 update_ticks() 方法,但我找不到与轴上的刻度类似的东西。
我还尝试编写一个自定义后端并从draw_text() 获取所有文本
渲染器的方法。与draw_text() 的文档相反
没有收到具有所有必要条件的matplotlib.text.Text 实例
信息,但只有一个简单的字符串和一个预先布局的位置。
【问题讨论】:
-
不管它值多少钱,在邮件列表中你可能会更幸运。
-
我正在尝试为 (xe)latex 编写一个后端,它可以在保存为 pdf 时像 inkscape 一样将图形和文本元素分开。这样,文本的字体将遵循您在文档中使用的任何字体,而无需重新创建图形。
-
哦,也使用 nabble 发布在邮件列表中,但消息需要 2-3 个小时才能出现在列表中。这在一定程度上让我感到困惑,我在这里打开了这个问题..
标签: python matplotlib