# 用Python实现流星雨效果的方法详解

`matplotlib`并不能给一条曲线映射多个颜色，故而可将一条线拆分成多条，效果如图所示

 123456789101112131415161718192021 `import` `numpy as np``import` `matplotlib.pyplot as plt``from` `matplotlib.collections ``import` `LineCollection` `x0,y0 ``=` `1``,``1`     `#此为流星位置``ts ``=` `np.arange(``0``,``1``,``0.01``)    ``#参数``xs,ys ``=` `x0``+``ts, y0``+``ts        ``#绘图线条` `points ``=` `np.array([xs, ys]).T.reshape(``-``1``, ``1``, ``2``)``segments ``=` `np.concatenate([points[:``-``1``], points[``1``:]], axis``=``1``)` `ax ``=` `plt.subplot()``lc ``=` `LineCollection(segments, cmap``=``'viridis'``)` `lc.set_array(ts)``lc.set_linewidth(ts[::``-``1``])``line ``=` `ax.add_collection(lc)` `ax.set_xlim(``0``, ``3``)``ax.set_ylim(``0``, ``3``)``plt.show()`

 12345678910111213141516171819202122 `from` `numpy.random ``import` `rand, randint``N,L ``=` `20``,``100`  `#流星个数和线段数``ts ``=` `np.array([``    ``np.linspace(``0``,rand(),L) ``for` `_ ``in` `range``(N)]).T``x0,y0 ``=` `rand(``2``*``N).reshape(``2``,``1``,N)``x0 ``*``=` `5``xs,ys ``=` `x0``+``ts, y0``+``ts ``#绘图线条1` `points ``=` `np.array([xs, ys]).T.reshape(N,L,``-``1``,``2``)` `ax ``=` `plt.subplot()``for` `i ``in` `range``(N):``    ``segs ``=` `np.concatenate([points[i][:``-``1``], points[i][``1``:]], axis``=``1``)``    ``lc ``=` `LineCollection(segs, cmap``=``'viridis'``)``    ``lc.set_array(ts[:,i])``    ``lc.set_linewidth(ts[::``-``1``,i])``    ``ax.add_collection(lc)` `ax.set_xlim(``0``, ``6``)``ax.set_ylim(``-``2``, ``3``)``ax.set_axis_off()                      ``#取消坐标轴``plt.show()`

 1 `plt.figure(facecolor``=``"black"``)          ``#将背景设为黑色`

 1 `lc ``=` `LineCollection(segs, cmap``=``'viridis_r'``)`