2017-01-09 12 views
2

私は600万点からなる散布図を作って、何らかのクラスタリングを理解しようとしています。matplotlib散布図をPNGで

私は単純な散布コマンドでこれを実行しようとすると、matplotlibは過剰なメモリについて不平を言っています。そこで私は3000ポイントをプロットし、Figureを.png形式で保存し、図をクリアし、保存された.pngをimread()でロードし、次の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

Iが完全に互いの上にオーバーレイするfig1.pngfig2.png両方を期待していました。

答えて

1

私は、6Mポイントの合理的な例として、memory_profilerというメモリプロファイルを作成しました。

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を一緒にプロットできるはずです。

最後に、散布図:

big_scatter_plot

+0

ありがとう!私は再びスクリプトを見ていきます。私は何かを見逃しているかもしれませんが、imshow()を使ってfig1.pngを読み込むときのパディングは、nutsをドライブします。なぜpngが2番目のFigureに完全にオーバーレイされていないのかをfdigureするのですか?プロットのプロットを得ることは私の意図ではありませんでした。 – kabel

+0

私は問題が何であるかは分かりませんが、それはいい考えではありません。私はあなたがそれを違うことをお勧めします。 – Lucas

+0

ご迷惑をおかけして申し訳ありません。私が説明しようとしていたことは、最初に意図したようにplot-save-load-plotをしたいのであれば、2度目の2軸セットを見たくないということです。保存されたFigure(上記の図1)は適切にスケーリングされず、2つの軸セット(PNGからのものと新しく作成されたFigureからのもの)を持つFigure 2で終わります。 imshow()でどのように動作するのか理解できないパディング問題があります。または、あなたの提案通りにスクリプトを修正することができます。ありがとう。 – kabel