使用matplotlib中的plt.plot()将所有numpy数组打印点相互连接

使用matplotlib中的plt.plot()将所有numpy数组打印点相互连接,numpy,python-3.x,matplotlib,Numpy,Python 3.x,Matplotlib,我有一个点坐标为xy的numpy数组。我已经绘制了这些点中的每一个,并希望有一条线将每个点连接到另一个点(完整的图形)。这个数组是一个2x50结构,所以我对它进行了转置,并使用了一个视图来让我遍历这些行。但是,我得到一个“索引超出范围”错误,如下所示: plt.plot(*zip(*v.T)) #to plot all the points viewVX = (v[0]).T viewVY = (v[1]).T for i in range(0, 49):

我有一个点坐标为xy的numpy数组。我已经绘制了这些点中的每一个,并希望有一条线将每个点连接到另一个点(完整的图形)。这个数组是一个2x50结构,所以我对它进行了转置,并使用了一个视图来让我遍历这些行。但是,我得到一个“索引超出范围”错误,如下所示:

     plt.plot(*zip(*v.T)) #to plot all the points
     viewVX = (v[0]).T
     viewVY = (v[1]).T
     for i in range(0, 49):
        xPoints = viewVX[i], viewVX[i+1]
        print("xPoints is", xPoints)
        yPoints = viewVY[i+2], viewVY[i+3]
        print("yPoints is", yPoints)
        xy = xPoints, yPoints
        plt.plot(*zip(*xy), ls ='-')
我希望索引将“环绕”,这样对于ypoints,它将从y0、y1等开始。有没有更简单的方法来实现我想要实现的目标?

使用2 x 50数组

 for i in range(0, 49):
    xPoints = viewVX[i], viewVX[i+1]
    print("xPoints is", xPoints)
    yPoints = viewVY[i+2], viewVY[i+3]

将超出
i=47
i=48
的范围,因为您使用
i+2
i+3
作为
viewVY

的索引,这是我想到的,但我希望有人能想出更好的方法

def plot_complete(v):
     for x1, y1 in v.T:
          for x2, y2, in v.T:
             plt.plot([x1, x2], [y1, y2], 'b')
     plt.plot(v[0], v[1], 'sr')

'b'
使线条变蓝,而
'sr'
用红色方块标记点。

已经计算出来了。基本上使用了@Bago提供的简化语法进行绘图,并考虑了@Daniel的索引技巧。只需迭代每个xy点集,并构造一组新的xx'yy'点集,用于发送到plt.plot():

这样做的好处是对
plt.plot
的调用更少。这应该比调用
plt.plot
的O(N**2)方法快得多

还请注意,不需要单独绘制点。相反,您可以使用
marker='o'
参数


说明:我认为理解此代码最简单的方法是查看它如何在简单的
v
上运行:

In [4]: import numpy as np
In [5]: import itertools
In [7]: v=np.arange(8).reshape(2,4)
In [8]: v
Out[8]: 
array([[0, 1, 2, 3],
       [4, 5, 6, 7]])
生成所有可能的点对:

In [10]: list(itertools.combinations(v.T,2))
Out[10]: 
[(array([0, 4]), array([1, 5])),
 (array([0, 4]), array([2, 6])),
 (array([0, 4]), array([3, 7])),
 (array([1, 5]), array([2, 6])),
 (array([1, 5]), array([3, 7])),
 (array([2, 6]), array([3, 7]))]
In [11]: list(itertools.chain.from_iterable(itertools.combinations(v.T,2)))
Out[11]: 
[array([0, 4]),
 array([1, 5]),
 array([0, 4]),
 array([2, 6]),
 array([0, 4]),
 array([3, 7]),
 array([1, 5]),
 array([2, 6]),
 array([1, 5]),
 array([3, 7]),
 array([2, 6]),
 array([3, 7])]
现在,我们使用将此点对列表转换为(展平)点列表:

In [10]: list(itertools.combinations(v.T,2))
Out[10]: 
[(array([0, 4]), array([1, 5])),
 (array([0, 4]), array([2, 6])),
 (array([0, 4]), array([3, 7])),
 (array([1, 5]), array([2, 6])),
 (array([1, 5]), array([3, 7])),
 (array([2, 6]), array([3, 7]))]
In [11]: list(itertools.chain.from_iterable(itertools.combinations(v.T,2)))
Out[11]: 
[array([0, 4]),
 array([1, 5]),
 array([0, 4]),
 array([2, 6]),
 array([0, 4]),
 array([3, 7]),
 array([1, 5]),
 array([2, 6]),
 array([1, 5]),
 array([3, 7]),
 array([2, 6]),
 array([3, 7])]
如果我们把这些点一个接一个地画出来,用线连接起来,我们就得到了完整的图形。唯一的问题是
plt.plot(x,y)
期望
x
是一个
x
值序列,
y
是一个
y
值序列

我们可以使用
zip
将点列表转换为x值和y值列表:

In [12]: zip(*itertools.chain.from_iterable(itertools.combinations(v.T,2)))
Out[12]: [(0, 1, 0, 2, 0, 3, 1, 2, 1, 3, 2, 3), (4, 5, 4, 6, 4, 7, 5, 6, 5, 7, 6, 7)]
zip
plt.plot
中使用splat运算符(
*
)是不正确的


因此,我们成功地将数据转换成正确的形式,以提供给
plt.plot

我有点迷路了。首先,
plt.plot(*zip(*v.T))
似乎做了与
plt.plot(v[0],v[1])
相同的事情。第二,你的问题听起来好像你想在每一对点之间画一条线(也许是一个完整的图形?),但你的代码并不是这样做的。你能更清楚一点你想做什么吗?是的,Bago,我想画一个完整的图表,让我的代码去做,这对我来说是个问题。感谢更简单的plt.plot(v[0],v[1])语法。我是numpy和matplotlab的新手。我将编辑我的问题,以使完整的图表清晰明了。是否有一种方法可以从不同的起始点迭代数组元素,从而使迭代回到起始元素?模块索引,
(I+2(3))%50
将在达到50时将其包装回0。感谢您解决了我的索引问题。但我只需要整理一下要发送的点,以获得一个完整的图表。很乐意为您提供帮助。恐怕我不能帮你们策划,但不是我的领域。巴戈,谢谢-这基本上也是我的目的。我更喜欢你简洁的语法。我开始习惯于只使用“for x1,y1 in v.T”语法来标记列。这太棒了-谢谢!我以前没有使用过itertools,因此plt.plot调用中的一些语法对我来说并不熟悉。这和nditer相似吗?