0

我有三个列表,一个包含一组名为“Atype”的符号(字符),第二个“el”包含一组数字,每个对应于“AType”中元素的位置+1,另一个包含集合名为“XYcoord”的坐标 (x,y)。我想在绘图中注释 AType 的字符,将 AType 的每个元素放置在 XYCoord 中对应的 (x,y) 对指示的位置(在绘图上)。这不是问题,但是当点对之间的距离小于值“BMax”时,我想在字母之间画一条连接线。
到目前为止,这就是我所拥有的:

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
for x in range(1, NCenter+1): # NCenter is the number of elements in AType and XYcoord.
    xposcoord, yposcoord = XYcoord[x-1][0]/100.0, XYcoord[x-1][1]/100.0
    ax.annotate('%s' % (AType[el[x-1]-1]), xy=(xposcoord, yposcoord), 
                xycoords='axes fraction')

plt.show()

我得到一个看起来像这样的图: 绘图显示没有连接的字母 现在,如果字母之间的距离小于 BMax,我想在字母之间画一条连接线。我之前定义了一个函数,它返回点之间的距离“dist_betwn_points(x1,y1,x2,y2)”所以,我知道通过在某处放置一个 if 语句,例如:

if dist_betwn_points(x1, y1, x2, y2) < BMax:

会有所帮助,但我尝试了几种方法,但未能成功定义“ax.annotate(...)”部分以在字母之间画线。谢谢你的帮助!

4

1 回答 1

2

这里有一个例子。我希望它对你有帮助。

import numpy as np
import matplotlib.pyplot as plt

def make_lines(x,y):
    ax = plt.gca()
    for j in range(len(x)):
        for i in range(j,len(x)):
            distance = np.sqrt((x[i]-x[j])**2+(y[i]-y[j])**2)
            if distance < 0.2 and distance > 0:
                ax.annotate('', xy=(x[i], y[i]), xytext=(x[j], y[j]),
                            arrowprops=dict(facecolor='black', 
                                            shrink=0.1,
                                            width=1),
                            textcoords='data',
                            )
n = 30
x,y = np.random.rand(n), np.random.rand(n)

fig = plt.figure(figsize=(5,5))
ax = fig.add_subplot(111)

make_lines(x,y)

ax.plot(x,y,'ro',markersize=10)
plt.show()

在此处输入图像描述

于 2013-07-09T22:50:51.947 回答