【问题标题】:Seaborn & Matplotlib Adding Text Relative to AxesSeaborn 和 Matplotlib 添加相对于轴的文本
【发布时间】:2019-03-01 17:41:15
【问题描述】:

尝试使用 seaborn 和 matplotlib 绘制一些数据,需要在我的绘图中添加一些描述性文本,通常我只使用 matplotlib 命令文本,并将其放置在我想要的相对于轴的位置,但它没有t 似乎根本无法工作,除了轴、刻度等上的默认内容之外,我没有显示任何文本。我想要的是在绘图区域的左上角显示一些自定义文本。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

df 是我的 pandas 数据框,它只包含一些时间列和坐标数据,带有一个标签“p”,这是一个标识符。

ax2 = sns.scatterplot("t","x", data = df, hue = "p")
ax2.text(0.1, 0.9, r"$s = {}, F = {}, N = {}$".format(value1, valu2, value3))

plt.show()

任何人都知道如何获得一些文本来显示,相对定位,“值”项只是带有我要打印的数据的变量。谢谢。

【问题讨论】:

    标签: python matplotlib text seaborn


    【解决方案1】:

    您希望将文本放置在“绘图区域的左上角”。 “绘图区域”称为轴。想到了三个解决方案:

    坐标轴坐标中的文本

    您可以在坐标轴坐标中指定文本。这些范围从坐标区左下角的(0,0) 到坐标区右上角的(1,1)。通过ax.transAxes得到对应的变换。

    import matplotlib.pyplot as plt
    fig, ax = plt.subplots()
    
    ax.text(0.02, 0.98, "Text", ha="left", va="top", transform=ax.transAxes)
    
    plt.show()
    

    带偏移量的注解

    在上面的文本和左上角之间的距离将取决于轴的大小。因此,将文本准确地定位在左上角(即坐标轴坐标中的(0,1))然后将其偏移一些点(即绝对单位)可能是有益的。

    ax.annotate("Text", xy=(0,1), xycoords="axes fraction",
                        xytext=(5,-5), textcoords="offset points",
                        ha="left", va="top")
    

    这里的结果看起来和上面类似,但与坐标轴或图形大小无关;文本将始终距离左上角 5 pts。

    锚定位置的文本

    最后,您可能根本不想指定任何坐标。毕竟"upper left"作为定位信息应该足够了。这将通过AnchoredText 实现,如下所示。

    import matplotlib.pyplot as plt
    from matplotlib.offsetbox import AnchoredText
    
    fig, ax = plt.subplots()
    
    anc = AnchoredText("Text", loc="upper left", frameon=False)
    ax.add_artist(anc)
    
    plt.show()
    

    【讨论】:

    • 我觉得您没有阅读我发布的内容,因为您给我的第一个示例是我给出的示例,但不适用于 seaborn。我没有尝试锚定,但会,注释内容不清楚,但你的例子可能有效,我必须试一试。
    • 您可以放心地假设我确实阅读并理解了您的问题。此处显示的所有 3 个示例都可以使用!请注意第一个示例中的参数之间的区别。 (当然,您需要将 ax 替换为 ax2 或您为 seaborn 生成的轴指定的任何名称。)
    • 我想我明白你的意思,尽管我认为对于这些绘图方法,注释可能是更好/更清晰的选择。谢谢。
    【解决方案2】:

    为了将文本定位在绘图的左上角而不事先知道限制,您可以查询轴的 x 和 y 限制并使用它来相对于绘图的边界定位文本。考虑这个例子(我还包含了一些代码来生成一些用于演示的随机数据)

    import seaborn as sns
    import matplotlib.pyplot as plt
    import pandas as pd
    import numpy as np
    
    np.random.seed(1)
    df = pd.DataFrame({'t':np.linspace(1,2,100),
                      'x':np.random.randn(100)})
    
    value1 = 1
    value2 = 2
    value3 = 3
    ax2 = sns.scatterplot("t","x", data = df)
    tl = ((ax2.get_xlim()[1] - ax2.get_xlim()[0])*0.010 + ax2.get_xlim()[0],
          (ax2.get_ylim()[1] - ax2.get_ylim()[0])*0.95 + ax2.get_ylim()[0])
    ax2.text(tl[0], tl[1], r"$s = {}, F = {}, N = {}$".format(value1, value2, value3))
    
    plt.show()
    

    这将输出

    改变边界不会改变文本的位置,即

    您可能需要根据文本与拐角的确切距离来调整乘数 0.010.95

    【讨论】:

    • “改变边界不会改变文本的位置”具有误导性。即使在第一次绘制绘图之后,轴限制也可能随时更改,例如通过缩放或添加更多元素。在这些情况下,人们宁愿根本没有数据坐标中的文本位置。有关推荐的替代方案,请参阅其他答案。
    猜你喜欢
    • 2014-03-31
    • 2013-01-20
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    相关资源
    最近更新 更多