为Matplotlib的LineCollection建立细分列表

时间:2019-11-15 14:26:22

标签: numpy matplotlib

我想使用matplotlib.collections.LineCollection对象,从两个Numpy数组xy开始

>>> from matplotlib.collections import LineCollection
>>> from numpy import array, linspace

>>> x = linspace(0, 2, 5)
>>> y = 1-(1-x)**2

实例化LineCollection的唯一条件是由 segments 列表组成的数据结构,每个 segment 都是的列表> points ,每个 point 是一个元组。

我可以使用两个向量xy

>>> segments = np.array(list(zip( zip(x, x[1:]), zip(y, y[1:])))) .transpose((0,2,1))
>>> print(segments)
[[[0.   0.  ]
  [0.5  0.75]]

 [[0.5  0.75]
  [1.   1.  ]]

 [[1.   1.  ]
  [1.5  0.75]]

 [[1.5  0.75]
  [2.   0.  ]]]

我的问题。可以用一种不太隐秘的方式构造segments吗?

2 个答案:

答案 0 :(得分:2)

我总是喜欢将线段视为3D数组,第一个轴是线段,第二个轴是沿线段的坐标,第三个是每个线段的x和y坐标。

points = np.array([x, y]).T.reshape(-1,1,2)
segments = np.concatenate([points[:-1],points[1:]], axis=1)

或同样地

segments = np.stack((np.c_[x[:-1],x[1:]],np.c_[y[:-1],y[1:]]), axis=2)

答案 1 :(得分:1)

以下是一种可能性:

xy = np.array([x, y])
segments = np.array([[xy[:, i], xy[:, i+1]] for i in range(xy.shape[1]-1)])

尽管我认为它可能不太优雅,因为它具有更多的代码行,使用索引的丑陋迭代且速度稍慢。话虽这么说,但是如果您优先考虑的是一个不太神秘的解决方案,那么这可能对您有用:您避免使用3个zip函数,一个transpose,并且我认为总体上更具可读性。