【问题标题】:Can i specify the bottom right corner of a text box in matplotlib?我可以在 matplotlib 中指定文本框的右下角吗?
【发布时间】:2018-09-30 16:45:00
【问题描述】:

有什么方法可以使用 matplotlib 指定文本框的右下角坐标?

我的盒子的代码是:

plt.text(x_max-2.7e+3, y_min+1e+5, box_text, style='italic',
        bbox={'facecolor':'white', 'alpha':0.5, 'pad':10})

这会为当前的情节产生这个:

但是,这些坐标值是通过反复试验找到的,并且对于不同的图,我的数据的范围和数量级也会有所不同。我想要一种可以指定右下角坐标的方法文本框的角为 (x_max, y_min),它会自动从那里绘制框。

有什么办法吗?

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    毫不奇怪,答案是肯定的。但是,有一种更简单的方法可以做你想做的事。让我先介绍一下背景。

    plt.text 只是一个在当前坐标区上创建mpl.text.Text 对象的包装器。不幸的是,Text 基于文本对齐属性锚定自身,您不能指定文本框的任意点来锚定。这是不幸的,因为有一个完整的tutorial 是关于如何使用轴transform(坐标系)而不是数据来定位文本。

    幸运的是,matplotlib.offsetbox 中有一些帮助类可以完全满足您的需求。这些类在tutorial 中进行了描述,示例库herehere 中显示了几个相关示例。您正在寻找的特定课程是mpl.offsetbox.AnchoredText。你可以这样设置你的文本框:

    from matplotlib.offsetbox import AnchoredText
    
    ...
    
    text_box = AnchoredText(box_text, frameon=True, loc=4, pad=0.5)
    plt.setp(text_box.patch, facecolor='white', alpha=0.5)
    plt.gca().add_artist(text_box)
    

    frameon=True 使文本后面的Patch 可见。 loc=4 将框的右下角与 Axes 对齐。 pad 现在以字体大小的分数为单位。 plt.setp 是一个实用函数,可以一次在一堆对象上设置多个属性。在这种情况下,第一个参数只是一个补丁,但通常你会传入一个要操作的东西的列表。

    由于您必须将AnchoredText 直接添加到Axes,我建议切换到Object Oriented API。您的代码看起来非常相似,但您可以更直接地访问底层对象。你可以使用plt.subplots 之类的东西来创建你的图形和坐标轴。然后,您将使用与通常的pyplot methods 对应的Axes 方法绘制数据。您的代码如下所示:

    from matplotlib import pyplot as plt
    from matplotlib.offsetbox import AnchoredText
    
    fig, ax = plt.subplots()
    
    ax.plot(...)
    
    text_box = AnchoredText(box_text, frameon=True, loc=4, pad=0.5)
    plt.setp(text_box.patch, facecolor='white', alpha=0.5)
    ax.add_artist(text_box)
    

    【讨论】:

    • 非常感谢,这真的很有帮助,而且介绍得很好!
    • 实际上,它现在将我的文本对齐到文本框的右侧.. 有什么办法可以将框对齐到绘图的右侧,但不能将文本对齐到框的右侧?
    • 我的错。看来我把你误入歧途了。您只需要一个AnchoredText,而不是所有带有转换的垃圾。这是示例:matplotlib.org/gallery/misc/anchored_artists.html。稍后我会重写我的答案。
    • 等等,这里有一个更好的例子:matplotlib.org/gallery/axes_grid1/simple_anchored_artists.html
    • 我必须提交 PR 才能将它们合并。
    猜你喜欢
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 2010-09-09
    • 2013-05-07
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多