2016-10-11 5 views
1

Ich versuche gerade, die Dateigröße eines Streudiagramms zu reduzieren. Mein Code sieht so aus:Dateigröße des Streudiagramms reduzieren

plt.scatter(a1,b1) 
plt.savefig('test.ps') 

wobei a1, b1 sind Arrays der Größe 400.000 oder so, und es gibt eine Dateigröße von 7,8MB.

Ich habe versucht,

plt.rcParams['path.simplify'] = True 

vor diesem Stück Code hinzufügen, aber die Datei ist noch 7,8MB. Ist dies ein Problem mit der Speicherung als ".ps" -Datei oder einem anderen Problem?

Antwort

1

Ein Ansatz ist plot statt scatter (Sie noch Streudiagramme unter Verwendung des 'o' Argument plot produzieren kann) zu verwenden, und verwenden Sie das rasterized Schlüsselwort-Argument, etwa so:

import numpy as np 
import matplotlib.pyplot as plt 

a1,b1 = np.random.randn(400000,2).T #mock data of similar size to yours 
plt.plot(a1,b1,'o',rasterized=True) 
plt.savefig("test.ps") 

Diese deutlich reduzieren sollte die Größe der Ausgabedatei. Der Text und die Strichgrafik bleiben Vektor, nur die Punkte sind gerastert, also ist es ein schöner Kompromiss.

Je nachdem, was Sie erreichen möchten, ist es jedoch möglicherweise besser, Ihre Daten zu histogrammieren und stattdessen zu plotten (z. B. pyplot.hist2d oder pyplot.hexbin).

+0

Aber diese Lösung verliert alle Vorteile in erster Linie ein vektorbasiertes Format wie Postscript verwendet wird, nicht wahr? – Schmuddi

+1

Dieser Ansatz rasterisiert nur die Punkte, den Text und den Vektor der Liniengrafik. Es ist wahr, dass Sie nicht beliebig zoomen können, aber ich denke, es muss ein Kompromiss zwischen dem Informationsgehalt der Grafik und ihrer Größe im Speicher bestehen. Für mich ist das oft ein nützlicher Kompromiss. –

0

Ich würde denken, dass dies auf das PostScript-Format zurückzuführen ist, und nichts, das geändert werden kann. Lassen Sie uns die Mathematik tun:

7.8MB ist etwas wie 7,8 * 1024 * 1024 = 8.178.892,8. Angenommen, Sie haben 400.000 Punkte in Ihrem Streudiagramm, bedeutet dies, dass Ihre Datei jedem Punkt in Ihrem Streudiagramm etwa 20 Byte zuweisen würde, wenn sich nichts anderes in Ihrer Datei befindet (d. H. Keine Legenden, keine Anmerkungen usw.).

Nun, ich bin kein Postscript-Experte, aber Blick auf den Ausgang test.ps, verwendet der Befehl Kreise zeichnen in Postscript wie folgt aussieht:

[x] [y] o 

wobei x und y die Koordinaten jedes Punktes sind . Da es sich um Float-Werte handelt, addieren sich die Informationen tatsächlich zu 15 Bytes, was meiner obigen Annahme nicht zu weit voraus ist.

Also, die Dateigröße wird durch die Art der PostScript-Datei verursacht, die ziemlich viele Informationen für jeden der 400.000 Punkte in Ihrem Streudiagramm speichert.

Sie können das Streudiagramm als gerastertes Bild speichern, wie in der Antwort von @AngusWilliams vorgeschlagen. Dies führt zu einer kleineren Dateigröße. Sie verlieren jedoch den Vorteil eines vektorbasierten Dateiformats: verlustfreie Skalierung bei jeder Auflösung.

Wenn Sie diese Vorteile von vektorbasierten Dateiformaten nicht benötigen, können Sie mit einem anderen Dateiformat wie .png besser arbeiten, das das Bild normalerweise besser komprimiert als PostScript mit gerasterten Informationen.

1

Sie könnten überlegen, z. hexbin - Ich mag besonders, wenn Sie eine dichte Sammlung von Punkten haben, da es besser anzeigt, wo Ihre Daten konzentriert sind.Zum Beispiel:

import numpy as np 
import matplotlib.pylab as pl 

x = np.random.normal(size=40000) 
y = np.random.normal(size=40000) 

pl.figure() 

pl.subplot(121) 
pl.scatter(x, y) 
pl.xlim(-4,4) 
pl.ylim(-4,4) 

pl.subplot(122) 
pl.hexbin(x, y, gridsize=40) 
pl.xlim(-4,4) 
pl.ylim(-4,4) 

enter image description here

Von der Abbildung links, würde ich Schluss gekommen, dass die Verteilung der Punkte zwischen x,y = {-3,3} in etwa gleich ist, was eindeutig nicht der Fall ist.

(http://matplotlib.org/examples/pylab_examples/hexbin_demo.html)

+0

Ich habe das bereits in meiner Antwort vorgeschlagen ... –

+0

Hoppla, verpasst das .. Wie auch immer, ich werde es hier als Beispiel dafür lassen, wie es die Visualisierung einer dichten Sammlung von Punkten verdeutlichen kann. – Bart

Verwandte Themen