我试图制作一个包含约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()。有人可以帮我吗?
图1
图2
我希望fig1.png
和fig2.png
能够完美地叠加在另一个之上。
答案 0 :(得分:1)
我使用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')
它达到300 Mb,这也不是内存问题。 问题出在其他地方,但你应该能够将所有点一起绘制。
最后,散点图: