matplotlib散点图在png上绘图

时间:2017-01-09 19:28:10

标签: python image matplotlib overlay scatter-plot

我试图制作一个包含约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

fig1.png

图2

fig2.png

我希望fig1.pngfig2.png能够完美地叠加在另一个之上。

1 个答案:

答案 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,这也不是内存问题。 问题出在其他地方,但你应该能够将所有点一起绘制。

最后,散点图:

big_scatter_plot