如何使用颜色图加速 plt.scatter()?

How to speed up plt.scatter() with colormap?

我想绘制坐标(后面是 x0y0

colors = cm.rainbow(np.linspace(0, 1, len(x0)))
for k in np.arange(len(x0)):
    for i in range(len(x0[k])):
        plt.scatter(x0[k][i], y0[k][i], color=colors[k], s = 2) 

这个循环大约运行了 50000-60000 次。

但是完成需要时间 2 小时。 我 运行 这个脚本在我的 macbook air m1 上。

我认为 运行 这个脚本很慢。

您是否有任何解决方案来加速此代码或其他库来分散坐标,例如。 ggplot等?

这是 x0y0 的一些信息。

for i in range(10000,10021):
        print(f'{x0[i]} {y0[i]}')

-----------------------------------
Result :
[145.5, 146] [39.5, 39]
[146.5] [39.5]
[147] [39]
[147.5] [39.5]
[148.5] [39.5]
[149.5] [39.5]
[150, 150.5] [39, 39.5]
[151] [39]
[151.5] [39.5]
[152.5] [39.5]
[153] [39]
[153.5, 154] [39.5, 39]
[154.5] [39.5]
[155, 155.5] [39, 39.5]
[156] [39]
[156.5] [39.5]
[157] [39]
[157.5] [39.5]
[158.5] [39.5]
[159] [39]
[159.5] [39.5]

plt.show()应该是(不要有白点和黑点):

将内部列表作为一个整体传递给情节要快得多。由于您仍想按 k 设置颜色,因此可以轻松避免 i 循环。假设 i 的维度不可忽略,这应该会大大加快这个过程。

colors = cm.rainbow(np.linspace(0, 1, len(x0)))
for k in np.arange(len(x0)):
        plt.scatter(x0[k], y0[k], color=colors[k], s = 2)

编辑:由于 k 的维度比 i 高得多,之前切换维度会进一步减少散点的数量。

import pandas as pd
#...
colors = cm.rainbow(np.linspace(0, 1, len(x0)))
dfx = pd.DataFrame(x0).T
dfy = pd.DataFrame(y0).T

for i in np.arange(len(x0)):
        plt.scatter(dfx[i], dfy[i], color=colors[i], s = 2)

尝试使用 pandas 将二维 data/colors explode() 转换为长格式向量。然后你可以用一次调用 scatter():

来替换循环
import pandas as pd

df = pd.DataFrame({'x0': x0, 'color': cm.rainbow(np.linspace(0, 1, len(x0))).tolist()})
df = df.explode('x0')
df['y0'] = pd.Series(y0).explode()

plt.scatter(df.x0, df.y0, color=df.color, s=2)

长格式数据框将如下所示:

      x0    y0                                              color
0  145.5  39.5                               [0.5, 0.0, 1.0, 1.0]
0    146    39                               [0.5, 0.0, 1.0, 1.0]
1  146.5  39.5  [0.40588235294117647, 0.1473016980546375, 0.99...
2    147    39  [0.303921568627451, 0.30315267411304353, 0.988...
3  147.5  39.5  [0.2019607843137255, 0.45124405704532283, 0.97...
4  148.5  39.5  [0.09999999999999998, 0.5877852522924731, 0.95...
5  149.5  39.5  [0.0019607843137254832, 0.7092813076058534, 0....
6    150    39  [0.09607843137254901, 0.8053809193888326, 0.89...
6  150.5  39.5  [0.09607843137254901, 0.8053809193888326, 0.89...
7    151    39  [0.19803921568627447, 0.8896040127307095, 0.85...
...  ...   ...                                                ...