2014-06-09 15 views
17

Ich habe eine TXT-Datei, die die x, y-Werte von Punkten mit regelmäßigem Abstand in einer 2D-Karte enthält, wobei die dritte Koordinate die Dichte an diesem Punkt ist.Wie zeichne ich eine Dichtekarte in Python?

4.882812500000000E-004 4.882812500000000E-004 0.9072267 
1.464843750000000E-003 4.882812500000000E-004 1.405174 
2.441406250000000E-003 4.882812500000000E-004 24.32851 
3.417968750000000E-003 4.882812500000000E-004 101.4136 
4.394531250000000E-003 4.882812500000000E-004 199.1388 
5.371093750000000E-003 4.882812500000000E-004 1278.898 
6.347656250000000E-003 4.882812500000000E-004 1636.955 
7.324218750000000E-003 4.882812500000000E-004 1504.590 
8.300781250000000E-003 4.882812500000000E-004 814.6337 
9.277343750000000E-003 4.882812500000000E-004 273.8610 

Wenn ich diese Dichtekarte plotten in gnuplot, mit den folgenden Befehlen:

set palette rgbformulae 34,35,0 
set size square 
set pm3d map 
splot "dens_map.map" u 1:2:(log10($3+10.)) title "Density map"` 

Welche mir dieses schöne Bild gibt:

enter image description here

Nun möchte Ich mag haben das gleiche Ergebnis mit Matplotlib.

+1

Bitte [siehe hier] (http://nbviewer.ipython.org/github/jrjohansson/scientific-python -lectures/blob/master/Lecture-4-Matplotlib.ipynb # pcolor) für ein Beispiel. Diese werden in Matplotlib typischerweise als "Konturplots" oder "Heatmaps" bezeichnet. Auch ein [Stack-Überlauf-Beispiel] (https://stackoverflow.com/questions/9008370/python-2d-contour-plot-from-3-lists-x-y-and-rho). – CoryKramer

+0

jede Spalte zu einem M x N-Array umformen und an 'pcolormesh()' übergeben. – HYRY

Antwort

18

Hier ist mein Ziel eine umfassendere Antwort einschließlich der Wahl der Farbkarte und eine logarithmische Normalisierung der Farbachse.

import matplotlib.pyplot as plt 
import matplotlib.cm as cm 
from matplotlib.colors import LogNorm 
import numpy as np 
x, y, z = np.loadtxt('data.txt', unpack=True) 
N = int(len(z)**.5) 
z = z.reshape(N, N) 
plt.imshow(z+10, extent=(np.amin(x), np.amax(x), np.amin(y), np.amax(y)), 
     cmap=cm.hot, norm=LogNorm()) 
plt.colorbar() 
plt.show() 

Ich gehe hier davon aus, dass Ihre Daten durch eine einfache Umformung in ein 2D-Array umgewandelt werden können. Wenn dies nicht der Fall ist, müssen Sie etwas mehr arbeiten, um die Daten in diesem Formular zu erhalten. Die Verwendung von Imshow und nicht von Pcolormesh ist hier effizienter, wenn Ihre Daten auf einem Raster liegen (so wie es scheint). Die obige Codeausschnitt Ergebnisse im folgende Bild, das kommt ziemlich nah an, was man wollte:

Resulting image

7

Der Kommentar von @HYRY ist gut, aber eine komplette minimal funktionierende Antwort (mit einem Bild!) Ist besser. plt.pcolormesh Mit

import pylab as plt 
import numpy as np 

# Sample data 
side = np.linspace(-2,2,15) 
X,Y = np.meshgrid(side,side) 
Z = np.exp(-((X-1)**2+Y**2)) 

# Plot the density map using nearest-neighbor interpolation 
plt.pcolormesh(X,Y,Z) 
plt.show() 

enter image description here

Wenn die Daten wie Ihre Probe aussieht, numpy kann es laden numpy.genfromtext Befehl.

+0

Vielen Dank! Das Problem ist, dass Meshgrid anscheinend nicht funktioniert, weil die Arrays zu groß sind. Gibt es eine Alternative zu Meshgrid? – user3722235

+0

@ user3722235 Meshgrid wurde einfach erstellt, um die Beispieldaten für das Diagramm zu erstellen. Sie erhalten X, Y, Z aus Ihrer Datendatei. Wenn Ihre Daten jedoch groß sind (z. B. größer als der Speicher), müssen Sie sie auf eine grobkörnigere Ebene vorverarbeiten. Ich denke nicht, dass dies der Fall ist, da GNUplot es aber schon verarbeiten kann. – Hooked

+0

Ich würde "imshow" anstelle von "pcolormesh" verwenden. Die Mesh-Aufrufe sind sinnvoller, wenn Sie unregelmäßig geformte Pixel haben. – tacaswell

Verwandte Themen