【问题标题】:annotate text to axes and align as a circle将文本注释到轴并对齐为圆形
【发布时间】:2017-11-29 13:04:56
【问题描述】:

我正在尝试在轴上绘制文本并将此文本对齐到一个圆圈。

更准确地说,有一些具有不同坐标 (x,y) 的点位于该圆内并使用以下方法创建:

ax.scatter(x,y,s=100)

我想用圆圈连接并标记每个点 (Cnameb)。文本的坐标用 (xp,yp) 定义。

因此点和圆之间的箭头长度不同,但圆心到圆的整体距离如下图所示 --> (注意:蓝线是应该打印的线点和圆之间。红线仅用于说明。):

因为我已经定义了半径并且我知道点的坐标以及中心点的坐标,所以我应该能够执行以下步骤:

  1. 计算单点到中心的距离DxMP
  2. 计算单点与圆的距离
  3. 计算角度 alpha
  4. 计算点 xp 和 yp 应该是文本的坐标(圆上的坐标)

因此我使用了以下代码:

def legpoints(x,y):
    DxMP = np.sqrt(((x - 521953) ** 2) + (y - 435179) ** 2)#521953, 435179 are the x and y coordinates of the center of the circle
    DxCirc = np.sqrt((900000 - DxMP)**2)#The distance between the point x and the circle
    alpha = np.arccos((np.sqrt((x - 521953)**2)) / (DxMP))
    xp = x + (np.cos(alpha) * DxCirc) 
    yp = y + (np.sin(alpha) * DxCirc)
    return xp,yp


xp=legpoints(x,y)[0]
yp=legpoints(x,y)[1]

压缩后的数据形状为 (Cnameb,x,y,xp,yp):

[( '柏林',735951.59991561132,617707.36153527966,1206703.3293253453,1019231.2121256208),( '柏林',735965.58122088562,617712.48195467936,1206714.0793803122,1019218.6083879157),( '不来梅',425896.14258295257,673875.68843362806,665833.6191604546,1270108.8219153266),( '多特蒙德' ,330448.62508515653,502638.58154814231,987816.52265995357,734203.8568234311),( '杜伊斯堡',281456.9370223835,495636.46544709487,913803.62749559013,654599.89177739131),( '杜塞尔多夫',283849.70917473407,471649.47447504522,935371.04632360162,571443.52693890885),( 'Essen的鲁尔',298590.41880710673,497973.49884993531,941640.19382135477 ,678755.74152428762),( '法兰克福',412037.5979210182,345052.92773266998,998077.35579369171,825581.23014117288),( '汉堡',505147.96843631176,726635.42284052074,540149.82358692121,1333686.6774791477),( '汉诺威',487540.73893698538,594957.33199132804,642620.87620513374,1315004.3411755674),(”科隆, 292146.52126941859, 439340.70884408138, 9621 92.49751825235,451474.98930779565),( '慕尼黑',623290.92919537693,125422.12264187855,801795.74103644479,671052.90026201855),( '斯图加特',445743.44744934322,196109.08652145317,642879.16415181267,814525.24510293454)] P>

通过以下代码,我想将文本添加到轴上并对齐为一个圆圈:

[ax.annotate(s=nme,xy=(x,y),xytext=(xpoint,ypoint),textcoords="data",arrowprops={"arrowstyle":"->"},color="black",alpha=0.8,fontsize=12) for nme,x,y,xpoint,ypoint in zip(Cnameb,x,y,xp,yp)]

但结果并不理想,因为文本没有对齐为圆形而是未定义......

谁能帮帮我...?

【问题讨论】:

    标签: python matplotlib matplotlib-basemap


    【解决方案1】:

    我看不出距离在方程式中会产生什么影响。您想确定要定位注释的点并将该点提供给注释函数。

    import numpy as np
    import matplotlib.pyplot as plt
    
    texts=["Dresden","Berlin", "Freiburg"]
    xy = np.array([[3.5,1],[3.,2.],[0,-2]])
    
    center = np.array([1.,1.])
    radius = 5 # radius
    
    x,y = zip(*xy)
    cx, cy = center
    plt.scatter(x,y)
    plt.scatter(cx, cy)
    
    #plot a cirle
    ct = np.linspace(0,2*np.pi)
    circx, circy = radius*np.cos(ct)+cx, radius*np.sin(ct)+cy
    plt.plot(circx, circy, ls=":")
    
    
    
    def ann(x,y, cx, cy, r, text):
        angle = np.arctan2(y-cy, x-cx)
        xt, yt = r*np.cos(angle)+cx, r*np.sin(angle)+cy
        plt.annotate(text, xy=(x,y), xytext=(xt, yt), arrowprops={"arrowstyle":"->"})
        plt.scatter(xt, yt, c=0)
    
    for t, xi,yi in zip(texts, x,y):
        ann(xi,yi, cx, cy, radius, t)
    
    plt.gca().set_aspect("equal")
    plt.show()
    

    【讨论】:

    • 谢谢,就是这样!我犯了一个错误,从内到外绘制箭头,而不是像你那样反过来,但这要好得多
    • 这与箭头的方向无关。您可以使用"arrowstyle":"<-" 而不是"arrowstyle":"->" 来改变方向。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多