如何在python中绘制密度贴图?

如何在python中绘制密度贴图?,python,matplotlib,histogram,Python,Matplotlib,Histogram,我有一个.txt文件,其中包含2D地图中规则间隔点的x,y值,第三个坐标是该点的密度 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.8828125

我有一个.txt文件,其中包含2D地图中规则间隔点的x,y值,第三个坐标是该点的密度

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"`
这给了我一个美丽的形象:


现在我想用matplotlib得到同样的结果

来自@HYRY的评论是好的,但是一个完整的最小工作答案(带图片!)更好。使用


如果数据看起来像您的样本,numpy可以使用命令加载它。

我的目标是找到一个更完整的答案,包括选择颜色贴图和颜色轴的对数标准化

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()
我在这里假设,您的数据可以通过一个简单的重塑转换为二维数组。如果不是这样,那么您需要更加努力地获取此表单中的数据。如果数据位于网格上(看起来是这样),那么在这里使用imshow而不是pcolormesh会更有效。上面的代码片段生成了下图,与您想要的非常接近:


请举例说明。这些在matplotlib中通常称为“等高线图”或“热图”。另外a.将每一列重新整形为一个M x N数组,并将它们传递给
pcolormesh()
。非常感谢!问题是网格网格显然无法工作,因为阵列太大了。是否有其他方法可以替代meshgrid?@user3722235 meshgrid只是为了创建绘图的样本数据。您将从数据文件中获取X,Y,Z。但是,如果数据很大(例如,大于内存),则需要将其预处理到更粗粒度的级别。我认为情况并非如此,因为GNUplot已经可以处理它了。我将使用
imshow
而不是
pcolormesh
。当你有不规则形状的像素时,网格调用更有用。现在网格似乎工作得很好。但是如何使密度数组的形状与X或Y相同呢?
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()