【问题标题】:Anchor or lock text to a marker in Matplotlib在 Matplotlib 中将文本锚定或锁定到标记
【发布时间】:2014-12-21 20:19:29
【问题描述】:

有没有办法将文本锚定或锁定到标记?使用pyplot 提供的交互式缩放时,文本移动超出范围,如图所示。

import matplotlib.pyplot as plt

x=[2,4]
y=[2,3]

fig, ax = plt.subplots()
ax.plot(x, y, 'ro',markersize=23)

offset = 1.0 
ax.set_xlim(min(x)-offset, max(x)+ offset)
ax.set_ylim(min(y)-offset, max(y)+ offset)

for x,y in zip(x,y):
     ax.annotate(str(y),  xy=(x-0.028,y-0.028))

plt.show()

【问题讨论】:

    标签: python text matplotlib marker annotate


    【解决方案1】:

    简单的答案是它是默认完成的。文本的左下角与xy 指定的位置相关联。现在,正如您在下图中看到的那样,当您以交互方式缩放到其中一个标记时,将保留标记和文本的相对位置。

    import matplotlib.pyplot as plt
    
    x=[2,4]
    y=[2,3]
    
    fig, ax = plt.subplots()
    ax.plot(x, y, 'ro',markersize=23)
    
    offset = 1.0 
    ax.set_xlim(min(x)-offset, max(x)+ offset)
    ax.set_ylim(min(y)-offset, max(y)+ offset)
    
    for x,y in zip(x,y):
         ax.annotate(str(y),  xy=(x,y))
    
    plt.show()
    

    但是,这看起来相当难看,因为文本现在位于标记的右上象限,有时甚至位于标记的边缘。我想这就是您在xy=(x-0.028,y-0.028) 中添加偏移量 0.028 的原因,因此引入了您现在试图摆脱的行为。发生的情况是默认情况下matplotlib 使用数据的坐标系来定位您的文本。当您缩放时,0.028 个数据单位表示您的帧的比例越来越大,并且文本“漂移”远离您的标记,最终结束于可见的值范围之外。

    要摆脱这种行为,您需要更改坐标系。 annotate 参数 textcoords 可以设置为 offset point。这里xytext 允许您指定距离xy 位置的偏移量(以磅为单位):

    ax.annotate(str(y),  xy=(x,y), xytext=(-5.0,-5.0), textcoords='offset points')
    

    现在具有挑战性的部分是评估要添加到绘图中的文本大小,以确定偏移值。文本可能会更改,但无法在绘制之前确定渲染文本字符串的大小。 See this post on that matter. 在下面的示例代码中,我尝试引入一点灵活性:

    import matplotlib.pyplot as plt
    
    x=[2,4]
    y=[2,12]
    
    fig, ax = plt.subplots()
    ax.plot(x, y, 'ro',markersize=23)
    
    offset = 1.0 
    ax.set_xlim(min(x)-offset, max(x)+ offset)
    ax.set_ylim(min(y)-offset, max(y)+ offset)
    
    for x,y in zip(x,y):
        text = str(y)
        fontsize, aspect_ratio = (12, 0.5) # needs to be adapted to font
        width = len(text) * aspect_ratio * fontsize 
        height = fontsize
        a = ax.annotate(text,  xy=(x,y), xytext=(-width/2.0,-height/2.0), textcoords='offset points')
    
    plt.show()
    

    这里,文本是一个长度为 2 的字符串,尽管进行了很多缩放,但它仍然大致位于标记的中心。然而,您需要根据您的字体和字体大小调整此解决方案。非常欢迎提出改进建议。

    【讨论】:

      猜你喜欢
      • 2010-12-07
      • 2011-03-16
      • 1970-01-01
      • 2014-06-09
      • 2013-04-03
      • 2015-12-16
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      相关资源
      最近更新 更多