将文本注释到轴并对齐为圆

时间:2017-06-26 16:08:20

标签: python matplotlib matplotlib-basemap

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

更准确地说,有一些不同坐标(x,y)的点位于这个圆圈内,并用:

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

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

因此,点和圆之间的箭头长度不同,但是中心和圆圈之间的总距离与下图所示的相同 - > (注意:蓝线是应在点和圆之间打印的线。红线仅用于说明。):

Approach

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

  1. 计算单个点与中心之间的距离DxMP
  2. 计算单个点与圆圈之间的距离
  3. 计算角度α
  4. 计算点xp和yp,它们应该是文本的坐标(圆圈上的坐标)
  5. 因此我使用了以下代码:

    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),(” Köln',292146.52126941859,439340.70884408138,96 2192.49751825235,451474.98930779565),('München',623290.92919537693,125422.12264187855,801795.74103644479,671052.90026201855),('Stuttgart',445743.44744934322,196109.08652145317,642879.16415181267,814525.24510293454)]

    使用以下代码我想将文本添加到轴并作为圆圈对齐:

    [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)]
    

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

    请有人帮帮我吗?

1 个答案:

答案 0 :(得分: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()

enter image description here