2017-01-09 40 views
2

我试图做一个散点图〜600万点,试图了解某种聚类。matplotlib scatter plotting png

当我尝试在一个简单的分散命令中做到这一点,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”之间的关系。有人可以帮助我吗?

图1

fig1.png

图2

fig2.png

我期待既fig1.pngfig2.png到在另一个的顶部完全重叠。

回答

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

+0

谢谢!我会再看看我的脚本。我可能错过了一些东西,但是使用imshow()加载fig1.png时的填充使我疯狂。如何解释为什么png没有完全覆盖第二个数字?这不是我的意图,在剧情中得到阴谋...... – kabel

+0

我没有找出问题所在,但它不是一个好主意。我建议你以不同的方式做。 – Lucas

+0

没问题,谢谢你的输入。我试图解释的是,如果我想像我原本打算的那样绘图 - 保存 - 载入绘图(一次只绘制3000点),我不想在第二个图中看到两组轴。已保存的图(上图1)没有正确缩放,图2中有两组坐标轴(一个来自PNG,一个来自新创建的坐标图)。有一些填充问题,我不明白它如何使用imshow()。或者我可以根据你的建议修改我的脚本。谢谢。 – kabel