Skip to main content
 首页 » 编程设计

python之Matplotlib 中的重复刻度标签

2025年05月04日9Renyi-Fan

我正在寻找一种方法来从 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。

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

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

请您参考如下方法:

matplotlib 邮件列表中给出了这个问题的答案。 Tick 对象总是创建两个文本标签,一个用于左侧/底部,一个用于右侧/顶部。绘制 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