Matplotlib,如果条件满足,如何连接线注释?

时间:2013-07-09 21:43:51

标签: python matplotlib draw

我有三个列表,一个包含一组名为“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()

我得到的情节如下: Plot showing letters with no connections 现在,如果它们之间的距离小于BMax,我想在字母之间绘制连接线。我之前定义了一个返回点“dist_betwn_points(x1,y1,x2,y2)”之间距离的函数,所以,我知道在某处放置一个if语句,如:

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

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

1 个答案:

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

enter image description here