2013-05-31 3 views
7

Ich versuche Matplotlib zu verwenden, um 3D Heatmap mit Ergebnissen meiner Simulationen zu plotten. Ich habe this topic gelesen und versucht, imshow zu verwenden. Leider, wenn ich die Figur in SVG oder EPS-Format speichern, konvertiert es Heatmat in Bild (was für Journal nicht akzeptabel ist). Also, ich habe auch Hexbin versucht - aber das Bild ist so komisch. Ich bin mir nicht sicher, ob es von der Zeitschrift akzeptiert wird. Haben wir etwas anderes oder muss ich Heatmat durch Rechtecke füllen?Heatmap in Matplotlib mit Vektorformat

Zum Beispiel, wenn man diesen Code ausgeführt wird:

import numpy as np 
import numpy.random 
import matplotlib.pyplot as plt 

# Generate some test data 
x = np.random.randn(8873) 
y = np.random.randn(8873) 

heatmap, xedges, yedges = np.histogram2d(x, y, bins=50) 
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]] 

print extent 
print heatmap 
plt.clf() 
surf = plt.imshow(heatmap, extent=extent) 
plt.colorbar(surf, shrink=0.75, aspect=5) 
plt.show() 

und SVG-Datei speichern, wird es Containe PNG-Bild:

<g clip-path="url(#p6def4f5150)"> 
    <image height="347" width="315" x="115.127800906" xlink:href="data:image/png;base64, 

Ich benutze matplotlib, Version 1.1.1 unter OpenSUSE und Ubuntu OS.

+0

@tcaswell Ich habe das Hauptthema – rth

Antwort

9

Verwenden Sie pcolormesh, wo Sie imshow verwenden, wenn Sie Vektorausgabe möchten. Wenn Sie pcolor oder pcolormesh verwenden, können Sie das Bild jedoch nicht interpolieren. Auf der anderen Seite wollen Sie wahrscheinlich keine Interpolation, wenn Sie Vektorausgabe wollen.

Das ist im Grunde der Grund für den Unterschied zwischen imshow und pcolor/pcolormesh. imshow erzeugt ein Raster, während pcolormesh und pcolor rechteckige Patches erzeugen.

Sie müssen auch die Art und Weise, wie Sie die Ausdehnung des Bildes übergeben, geringfügig ändern. Als Beispiel basiert auf Ihnen:

import numpy as np 
import numpy.random 
import matplotlib.pyplot as plt 

# Generate some test data 
x = np.random.randn(8873) 
y = np.random.randn(8873) 

heatmap, xedges, yedges = np.histogram2d(x, y, bins=50) 

surf = plt.pcolormesh(xedges, yedges, heatmap) 
plt.axis('image') 
plt.colorbar(surf, shrink=0.75, aspect=5) 
plt.show() 

enter image description here

Wenn Sie sich als SVG speichern, wird der Ausgangsvektor Patches sein. Z.B.

... 
    <g id="QuadMesh_1"> 
    <defs> 
    <path d=" 
M75.9063 -43.2 
L82.9705 -43.2 
L82.9705 -50.112 
L75.9063 -50.112 
L75.9063 -43.2" id="C0_0_9d1ab33858"/> 
    <path d=" 
M82.9705 -43.2 
L90.0348 -43.2 
L90.0348 -50.112 
L82.9705 -50.112 
L82.9705 -43.2" id="C0_1_d828245e6a"/> 
... 
+0

thanks bearbeitet! Es klappt! :) Kannst du das erklären: 'plt.axis (' image ')'? – rth

+0

Es setzt das Seitenverhältnis des Diagramms auf 1 (d. H. Quadratische Pixel sind quadratisch) und schneidet die Grenzen ein. Es ist nur dort, so dass die Ausgabe ähnlich aussieht wie "imshow". –