2014-06-09 22 views
17

Bir 2D haritadaki düzenli aralıklı noktaların x, y değerlerini içeren bir .txt dosyası var, 3. koordinat o noktadaki yoğunluk.Python'da yoğunluk haritası nasıl çizilir?

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 

aşağıdaki komutlarla gnuplot bu yoğunluk haritası, çizmek Ne zaman:

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"` 

bana bu güzel görüntüyü verir:

enter image description here

Şimdi istiyorum matplotlib ile aynı sonuç.

+1

([Buraya bakınız] Lütfen http://nbviewer.ipython.org/github/jrjohansson/scientific-python Bir örnek için -eskiler/blob/usta/Ders-4-Matplotlib.ipynb # pcolor). Bunlar genellikle matplotlib'de "kontur parselleri" veya "ısı haritaları" olarak adlandırılır. Ayrıca bir [yığın taşma örneği] (https://stackoverflow.com/questions/9008370/python-2d-contour-plot-from-3-lists-x-y-and-rho). – CoryKramer

+0

her sütunu bir M x N dizisine yeniden düzenleyin ve bunları "pcolormesh()" öğesine iletin. – HYRY

cevap

18

Renk haritasının seçilmesi ve renk ekseninin logaritmik bir şekilde normalleştirilmesi dahil olmak üzere daha eksiksiz bir cevabı hedefliyorum.

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

Verilerinizin basit bir yeniden şekillendirme ile 2d dizisine dönüştürülebildiğini varsayalım. Eğer durum bu değilse, bu formdaki verileri almak için biraz daha fazla çalışmanız gerekir. Eğer veri bir ızgara üzerinde (eğer göründüğü gibi) yatıyorsa, imhow ve değil pcolormesh kullanarak daha verimli. Aşağıdaki resimde yukarıdaki kod parçacığı sonuçları, sen öyle istiyorsun oldukça yakın gelir:

Resulting image

7

@HYRY'den gelen yorum iyidir, ancak tam bir minimum çalışma yanıtı (resimle!) Daha iyidir.

enter image description here

verileri numunenin benziyorsa plt.pcolormesh

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() 
kullanarak, numpy komutunu numpy.genfromtext kullanarak yükleyebilirsiniz.

+0

Çok teşekkür ederim! Sorun şu ki, kafesler çok büyük olduğu için meshgrid işe yaramayacaktır. Meshgrid'e alternatif var mı? – user3722235

+0

@ user3722235 Meshgrid, basitçe çizim için örnek verileri oluşturuyordu. Veri dosyanızdan X, Y, Z alacaksınız. _However_, verileriniz büyükse (ör., Bellekten büyükse), daha kaba taneli bir düzeye önceden işlem yapmanız gerekir. GNUplot'ın zaten halledebileceğinden beri durum böyle değil. – Hooked

+0

"pcolormesh" yerine "imshow" kullanırım. Örgü aramalar, düzensiz şekilli pikselleriniz olduğunda daha kullanışlıdır. – tacaswell

İlgili konular