2014-06-09 285 views
17

我有一个.txt文件,其中包含2D地图中规则间隔点的x,y值,第3个坐标是该点的密度。如何在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 

当我绘制在gnuplot的这个密度图,用下面的命令:

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

这给了我这个美丽的形象:

enter image description here

现在我想有与matplotlib相同的结果。

+1

请[见这里](http://nbviewer.ipython.org/github/jrjohansson/scientific-python -lectures/blob/master/Lecture-4-Matplotlib.ipynb#pcolor)为例。这些通常在matplotlib中被称为“等高线图”或“热图”。另外一个[堆栈溢出示例](https://stackoverflow.com/questions/9008370/python-2d-contour-plot-from-3-lists-x-y-and-rho)。 – CoryKramer

+0

将每列重新整形为一个M×N数组,并将它们传递给'pcolormesh()'。 – HYRY

回答

18

这里是我的目标是一个更完整的答案,包括选择颜色映射和颜色轴的对数标准化。

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

我在这里假设您的数据可以通过简单的整形转换为2d数组。如果情况不是这样,那么您需要更努力地获取这种形式的数据。如果数据位于网格上(如其似乎那样),使用imshow而不是pcolormesh会更有效。下图中上面的代码片段的结果,自带相当接近你想要的东西:

Resulting image

7

来自@HYRY的评论很好,但一个完整的最小工作答案(带图片!)更好。使用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() 

enter image description here

如果数据看起来像你的样品,numpy的可以使用以下命令numpy.genfromtext加载它。

+0

非常感谢!问题是,meshgrid不能工作,因为数组太大。有没有其他选择meshgrid? – user3722235

+0

@ user3722235 Meshgrid只是为图绘制样本数据。你会从你的数据文件中获得X,Y,Z。但是,如果你的数据很大(例如大于内存),你需要预处理它到更粗粒度的级别。我不认为这是事实,因为GNUplot已经可以处理它了。 – Hooked

+0

我会使用'imshow'而不是'pcolormesh'。当您有不规则形状的像素时,网格调用更加有用。 – tacaswell