连接点的绘制线条

49

我知道有另一个非常相似的问题,但我无法从中提取所需的信息。

成对绘制线条

我在 (x,y) 平面上有4个点:x=[x1,x2,x3,x4]y=[y1,y2,y3,y4]

x=[-1 ,0.5 ,1,-0.5]
y=[ 0.5,  1, -0.5, -1]

现在,我可以通过以下步骤绘制这四个点:

import matplotlib.pyplot as plt

plt.plot(x,y, 'ro')
plt.axis('equal')
plt.show()

除了这四点之外,我想要有两条线:

1) 连接(x1,y1)(x2,y2), 2) 第二条连接(x3,y3)(x4,y4)

这只是一个简单的示例。在实际情况中,我在平面上有2N个点。

如何获取所需的输出:对于具有两个连接线的点?

谢谢。

6个回答

63

我认为你需要为每个部分使用单独的行:

import numpy as np
import matplotlib.pyplot as plt

x, y = np.random.random(size=(2,10))

for i in range(0, len(x), 2):
    plt.plot(x[i:i+2], y[i:i+2], 'ro-')

plt.show()

(numpy导入只是为了设置一些随机的2x10样本数据)

输入图像描述


为什么range函数中步长为2?当通过x[i:i+2]访问数组时,您可以澄清一下具体在做什么吗? - Bruce Seymour
1
@BruceSeymour,有10个随机x坐标和10个随机y坐标,我想将它们配对,以便我在(x[0], y[0])和(x[1], y[1])之间画线,然后在(x[2], y[2])和(x[3], y[3])等之间画线。因此,循环必须从每个其他点开始,并且切片必须是[i:i+2],以产生[0:2]、[2:4]、[4:6]等作为要连接的点的索引。 - xnx

25

我知道这个问题早就被问答过了,但是我觉得之前的回答并没有提供最简单的解决方案。尽可能地避免使用循环通常是一个好的习惯,而 matplotlib 的 plot 命令可以一次绘制多条线。如果 xy 是数组,则每列将绘制一条线。

在您的情况下,您可以执行以下操作:

x=np.array([-1 ,0.5 ,1,-0.5])
xx = np.vstack([x[[0,2]],x[[1,3]]])
y=np.array([ 0.5,  1, -0.5, -1])
yy = np.vstack([y[[0,2]],y[[1,3]]])
plt.plot(xx,yy, '-o')

有一个长列表的x和y,想要连接相邻的一对吗?

xx = np.vstack([x[0::2],x[1::2]])
yy = np.vstack([y[0::2],y[1::2]])

想为点和线指定(不同的)颜色吗?

plt.plot(xx,yy, '-ok', mfc='C1', mec='C1')

连接两个点的两条分离线条绘图


3
这应该是被接受的答案,也是使用matplotlib的正确方式! - Gulzar

23

您可以只传递要连接的两个点的列表到plt.plot中。为了使其可以轻松地扩展到您想要的任意数量的点,您可以定义一个函数,如下所示。

import matplotlib.pyplot as plt

x=[-1 ,0.5 ,1,-0.5]
y=[ 0.5,  1, -0.5, -1]

plt.plot(x,y, 'ro')

def connectpoints(x,y,p1,p2):
    x1, x2 = x[p1], x[p2]
    y1, y2 = y[p1], y[p2]
    plt.plot([x1,x2],[y1,y2],'k-')

connectpoints(x,y,0,1)
connectpoints(x,y,2,3)

plt.axis('equal')
plt.show()

输入图像描述

注意,该函数是一个通用函数,可以将列表中的任何两个点连接起来。

要将此扩展到2N个点,假设您始终将点i连接到点i+1,我们只需将其放入for循环中:

import numpy as np
for i in np.arange(0,len(x),2):
    connectpoints(x,y,i,i+1)

如果始终将点i连接到点i+1,您可以简单地执行以下操作:

for i in np.arange(0,len(x),2):
    plt.plot(x[i:i+2],y[i:i+2],'k-')

它确实有效。但是正如我所说,通常我有2N个点,其中N可以是50。然后需要显式地编写所有这些点,这是一个问题。是否有更紧凑的方法来处理一般的2N情况(对于此情况,N=2)? - Mencia

4

通过以下代码,您可以通过连接它们的坐标创建多条线:

import matplotlib.pyplot as plt

# 1st line
point_1 = [1,3]
point_2 = [2,6]

# 2nd line
point_3 = [4,6]
point_4 = [1,2]

x_values = [[point_1[0], point_3[0]],[point_2[0], point_4[0]]]
y_values = [[point_1[1], point_3[1]],[point_2[1], point_4[1]]]

plt.plot(x_values, y_values, 'red')
plt.show()

结果

图示


2
使用matplotlib.arrow()函数,将head_length和head_width参数设置为0,以避免出现“箭头结束”。不同点之间的连接可以通过向量加法简单计算得出: A = [1,2], B=[3,4] --> A到B的连接是B-A = [2,2]。 从A的尖端开始绘制该向量,最终到达B的尖端。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style
style.use('fivethirtyeight')


A = np.array([[10,8],[1,2],[7,5],[3,5],[7,6],[8,7],[9,9],[4,5],[6,5],[6,8]])


fig = plt.figure(figsize=(10,10))
ax0 = fig.add_subplot(212)

ax0.scatter(A[:,0],A[:,1])


ax0.arrow(A[0][0],A[0][1],A[1][0]-A[0][0],A[1][1]-A[0][1],width=0.02,color='red',head_length=0.0,head_width=0.0)
ax0.arrow(A[2][0],A[2][1],A[9][0]-A[2][0],A[9][1]-A[2][1],width=0.02,color='red',head_length=0.0,head_width=0.0)
ax0.arrow(A[4][0],A[4][1],A[6][0]-A[4][0],A[6][1]-A[4][1],width=0.02,color='red',head_length=0.0,head_width=0.0)


plt.show()

enter image description here


1

我更喜欢在matplotlib中使用LineCollection。请参见以下最小代码:

import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection

x = np.arange(100)
# Here are many sets of y to plot vs. x
ys = x[:50, np.newaxis] + x[np.newaxis, :]

segs = np.zeros((50, 100, 2))
segs[:, :, 1] = ys
segs[:, :, 0] = x

# We need to set the plot limits.
fig, ax = plt.subplots(1, 1, figsize=(7.2, 7.2))
ax.set_xlim(x.min(), x.max())
ax.set_ylim(ys.min(), ys.max())

line_segments = LineCollection(segs)
ax.add_collection(line_segments)

更详细的示例可以在这里找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接