在 png 上绘制 matplotlib 散点图

matplotlib scatter plotting over png

我正在尝试制作一个包含约 600 万个点的散点图,以试图理解某种聚类。

当我尝试在一个简单的分散命令中执行此操作时,matplotlib 抱怨内存过多。所以我决定绘制 3000 个点,然后将图形保存为 .png 格式,清除图形,用 imread() 加载保存的 .png,然后覆盖接下来的 3000 个点。

我遇到了一些填充问题,但我不明白它们是如何出现的。我的代码有点长,因为我要解析很多文本文件,但下面是一个复制我的想法的示例模型代码:

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
plt.xlim(0,1000)
plt.ylim(-1000,1000)
plt.scatter(400,500,marker="+",c="r")
plt.gca().set_aspect('equal')
plt.draw()
plt.savefig(r"C:\TMP\fig1.png")
plt.clf()
im = plt.imread(r"C:\TMP\fig1.png")
implot = plt.imshow(im, origin='upper', aspect='equal', extent=[0,1000,-1000,1000], zorder=0)
plt.scatter(600,500,marker="+",c="b")
plt.savefig(r"C:\TMP\fig2.png")
plt.close(fig)

结果是我不明白如何解释的东西。显然,我没有从imshow()中理解"aspect"和"extent"之间的关系。有人可以帮我解决这个问题吗?

图一

图2

我原以为 fig1.pngfig2.png 可以完美地叠加在一起。

我用 memory_profiler 做了一个内存配置文件作为一个合理的例子,6M 点。

import numpy as np
import time
x = np.random.normal(size=6000000)
y = np.random.normal(size=6000000)

start = time.time()
plt.scatter(x, y, alpha=0.1)
end = time.time() - start
print(end)

out 是 30.015294551849365 秒。不是特别慢。

另一方面,配置文件输出:

Line #    Mem usage    Increment   Line Contents
================================================
 5   81.738 MiB    0.000 MiB   @profile
 6                             def make_test():
 7  127.516 MiB   45.777 MiB       x = np.random.normal(size=6000000)
 8  173.293 MiB   45.777 MiB       y = np.random.normal(size=6000000)
 9                             
10  282.934 MiB  109.641 MiB       plt.scatter(x, y, alpha=0.1)
11  298.160 MiB   15.227 MiB       plt.savefig('big_plot')

达到300Mb,也不是内存问题。 问题出在别处,但您应该能够将 ALL 点绘制在一起。

最后,散点图: