如何在Python中绘制密度图?

33 投票
2 回答
82830 浏览
提问于 2025-04-18 09:07

我有一个.txt文件,里面记录了一个二维地图上均匀分布的点的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"`

这样我得到了这幅漂亮的图像:

enter image description here

现在我想用matplotlib也得到同样的效果。

2 个回答

15

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

这里插入图片描述

如果你的数据看起来和这个样本一样,可以用 numpy 这个库来加载数据,使用的命令是 numpy.genfromtext

29

我这里想给出一个更完整的答案,包括如何选择颜色映射和对颜色轴进行对数归一化。

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会更有效率。上面的代码片段会生成下面这张图,跟你想要的效果很接近:

结果图像

撰写回答