2017-01-09 37 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