2013-05-31 14 views
7

Próbuję użyć matplotlib do wykreślenia 3D mapy cieplnej z wynikami moich symulacji. Przeczytałem this topic i próbowałem użyć imshow. Niestety, kiedy zapisuję figurę w formatach SVG lub EPS, konwertuje ona obraz ciepła na obraz (co jest nie do przyjęcia dla dziennika). Więc wypróbowałem także hexbin - ale obraz jest taki dziwny. Nie jestem pewien, czy zostanie przyjęty przez dziennik. Czy mamy coś innego, czy też muszę wypełnić termos przez prostokąty?Mapa termiczna w matplotlib z formatem wektorowym

Na przykład, jeśli ktoś prowadzi ten kod:

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

i zapisać plik SVG, będzie kontener PNG:

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

używam matplotlib, wersja 1.1.1 pod OpenSUSE i Ubuntu OS.

+0

@tcaswell Edytowałem główny temat – rth

Odpowiedz

9

Użyj pcolormesh gdzie używasz imshow, jeśli chcesz uzyskać wyjście wektorowe.

Podczas korzystania z pcolor lub pcolormesh nie można jednak interpolować obrazu. Z drugiej strony prawdopodobnie nie chcesz interpolacji, jeśli chcesz uzyskać wyjście wektorowe.

Zasadniczo jest to przyczyną różnicy między imshow i pcolor/pcolormesh. imshow tworzy raster, a pcolormesh i pcolor tworzą prostokątne łaty.

Musisz także nieznacznie zmienić sposób, w jaki przechodzisz w zakresie obrazu. Jako przykład opartego na Ciebie:

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

Po zapisaniu jako SVG, wyjście będzie łatki wektorowej. Na przykład.

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

dzięki! to działa! :) Czy możesz wyjaśnić, co to: "plt.axis (" obraz ")"? – rth

+0

Ustawia współczynnik kształtu wydruku na 1 (tzn. Kwadratowe piksele będą kwadratowe) i przycina granice. Jest tam, aby wynik wyglądał podobnie do "imshow". –

Powiązane problemy