Matplotlib 获取文本的边界框并更新画布

Matplotlib 获取文本的边界框并更新画布,matplotlib,Matplotlib,与此问题类似,我想以不同的样式书写两个标签(粗体和普通,例如“boldnormal”),就像它们是相同的标签而不使用乳胶一样 这里是它正在发挥作用的地方: from matplotlib import pyplot as plt fig, ax = plt.subplots() def print_label(fig): l = fig.text(0.5, 0.5, "bold", fontweight='bold') def on_draw(event):

与此问题类似,我想以不同的样式书写两个标签(粗体和普通,例如“boldnormal”),就像它们是相同的标签而不使用乳胶一样

这里是它正在发挥作用的地方:

from matplotlib import pyplot as plt

fig, ax = plt.subplots()

def print_label(fig):
    l = fig.text(0.5, 0.5, "bold", fontweight='bold')
    def on_draw(event):
        xmax = l.get_window_extent().inverse_transformed(fig.transFigure).max[0]
        print xmax
        fig.text(xmax, 0.5, "Normal")
        return False
    fig.canvas.mpl_connect('draw_event', on_draw)

print_label(fig)
fig.canvas.draw()
plt.show()
但是我不高兴,因为
print\u label
的使用是不透明的:用户必须调用
fig.canvas.draw()
。所以我试了一下:

from matplotlib import pyplot as plt

fig, ax = plt.subplots()

def print_label(fig):
    l = fig.text(0.5, 0.5, "bold", fontweight='bold')
    def on_draw(event):
        xmax = l.get_window_extent().inverse_transformed(fig.transFigure).max[0]
        print xmax
        fig.text(xmax, 0.5, "Normal")
        fig.canvas.mpl_disconnect(event)
        fig.canvas.draw()
        return False
    fig.canvas.mpl_connect('draw_event', on_draw)

print_label(fig)
plt.show()
问题是我无法断开事件的连接,我得到:

RuntimeError: maximum recursion depth exceeded while calling a Python object

我遵循了第一节:


运行时错误:如果有人在尝试调用
l.get\u window\u extent().inverse\u transformed(图transFigure)
时遇到此错误,则无法获取不带渲染器的窗口范围。先调用
plt.gcf().canvas.draw()
,然后再进行求解。
from matplotlib import pyplot as plt

fig, ax = plt.subplots()

def print_label(fig):
    l = fig.text(0.5, 0.5, "bold", fontweight='bold')
    def on_draw(event):
        xmax = l.get_window_extent().inverse_transformed(fig.transFigure).max[0]
        print xmax
        fig.text(xmax, 0.5, "Normal")
        fig.canvas.mpl_disconnect(cid)
        return False
    cid = fig.canvas.mpl_connect('draw_event', on_draw)
    fig.canvas.draw()

print_label(fig)
plt.show()