2013-05-31 19 views
7

Sto provando a utilizzare matplotlib per tracciare heatmap 3D con i risultati delle mie simulazioni. Ho letto this topic e ho provato a usare imshow. Sfortunatamente, quando salgo la figura nei formati SVG o EPS, converte la termocoppia in immagine (che non è accettabile per il giornale). Quindi, ho provato anche hexbin - ma l'immagine è così strana. Non sono sicuro che sarà accettato dal diario. Abbiamo qualcos'altro o devo riempire la lastra di calore con dei rettangoli?heatmap in matplotlib con formato vettoriale

Per esempio, se si corre questo codice:

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() 

e salvare file in formato SVG, sarà containe immagine PNG:

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

Io uso matplotlib, versione 1.1.1 sotto OpenSUSE e Ubuntu OS.

+0

@tcaswell Ho modificato l'argomento principale – rth

risposta

9

Utilizzare pcolormesh dove si utilizza imshow se si desidera l'output vettoriale.

Quando si utilizza pcolor o pcolormesh non è possibile interpolare l'immagine, tuttavia. D'altra parte, probabilmente non si desidera l'interpolazione se si desidera l'output vettoriale.

Questo è fondamentalmente il motivo della differenza tra imshow e pcolor/pcolormesh. imshow produce un raster, mentre pcolormesh e pcolor producono patch rettangolari.

Avrai anche bisogno di cambiare leggermente il modo in cui passi nella misura dell'immagine. Per fare un esempio basato sul vostro:

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

Quando si salva come SVG, l'uscita sarà patch vettoriali. Per esempio.

... 
    <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

grazie! Funziona! :) Puoi spiegare cosa: 'plt.axis (' image ')'? – rth

+0

Imposta le proporzioni del grafico su 1 (vale a dire che i pixel quadrati saranno quadrati) e taglia i limiti in. È solo lì in modo che l'output sarà simile a 'imshow'. –