注释文本到轴并对齐为圆

annotate text to axes and align as a circle

我正在尝试在坐标轴上绘制文本并将该文本与圆对齐。

更准确地说,有不同坐标 (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):

[('Berlin', 735951.59991561132, 617707.36153527966, 1206703.3293253453, 1019231.2121256208), ('Berlin', 735965.58122088562, 617712.48195467936, 1206714.0793803122, 1019218.6083879157), ('Bremen', 425896.14258295257, 673875.68843362806, 665833.6191604546 , 1270108.8219153266), ('Dortmund', 330448.62508515653, 502638.58154814231, 987816.52265995357, 734203.8568234311), ('Duisburg', 281456.9370223835, 495636.46544709487, 913803.62749559013, 654599.89177739131), ('Düsseldorf', 283849.70917473407, 471649.47447504522, 935371.04632360162, 571443.52693890885 ), ('Essen, Ruhr', 298590.41880710673, 497973.49884993531, 941640.19382135477, 678755.74152428762), ('Frankfurt am Main', 412037.5979210182, 345052.92773266998, 998077.35579369171, 825581.23014117288), ('Hamburg', 505147.96843631176, 726635.42284052074, 540149.82358692121, 1333686.6774791477), ('Hannover', 487540.73893698538, 594957.33199132804, 642620.87620513374, 1315004.3411755674), ('Köln', 292146.52126941859, 439340.70884408138, 962192.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)]

但是结果不尽如人意,因为文本没有对齐为圆,而是未定义....

有人可以帮我吗...?

我看不出距离在等式中有什么作用。你想确定注解的定位点,把这个点交给注解函数。

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()