【问题标题】:Plotting lines connecting points绘制连接点的线
【发布时间】:2016-02-12 13:08:51
【问题描述】:

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

plotting lines in pairs

我在(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 个点。

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

谢谢。

【问题讨论】:

    标签: matplotlib


    【解决方案1】:

    我认为每个段都需要单独的行:

    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 样本数据)

    【讨论】:

    • 为什么是范围的第 2 步?你能澄清一下你在用 x[i:i+2] 访问数组时在做什么吗?
    • @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] 等作为要加入的点的索引。
    【解决方案2】:

    您只需将要连接的两个点的列表传递给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)有没有更紧凑的方法?
    【解决方案3】:

    我知道很久以前就有人问过这个问题并得到了回答,但答案并没有给出我认为最简单的解决方案。尽可能避免循环几乎总是一个好主意,matplotlib 的plot 能够用一个命令绘制多条线。如果xy 是数组,则plot 为每一列画一条线。

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

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

    【讨论】:

    • 这应该是公认的答案,也是 matplotlib 的使用方式!
    【解决方案4】:

    使用matplotlib.arrow() 函数并将参数head_length 和head_width 设置为零,以免出现“箭头末端”。 可以使用矢量加法简单地计算不同点之间的连接: 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()
    

    【讨论】:

      【解决方案5】:

      使用下面的代码,您可以通过连接点的坐标来创建多条线:

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

      结果

      【讨论】:

        【解决方案6】:

        我更喜欢 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)
        

        更详细的例子可以在here找到。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-26
          • 2016-08-22
          • 2019-09-09
          相关资源
          最近更新 更多