【问题标题】:How to plot a density map in python?如何在python中绘制密度图?
【发布时间】:2014-07-29 23:20:00
【问题描述】:

我有一个 .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 得到相同的结果。

【问题讨论】:

  • 请以see here 为例。这些通常在 matplotlib 中称为“等高线图”或“热图”。还有一个stack overflow example
  • 将每一列重新整形为一个 M x N 数组,并将它们传递给pcolormesh()

标签: python matplotlib histogram


【解决方案1】:

我的目标是更完整的答案,包括选择颜色图和颜色轴的对数归一化。

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 会更有效。上面的代码 sn-p 结果如下图,非常接近你想要的:

【讨论】:

    【解决方案2】:

    @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 加载它。

    【讨论】:

    • 非常感谢!问题是 meshgrid 显然无法工作,因为数组太大了。有没有meshgrid的替代品?
    • @user3722235 Meshgrid 只是为绘图创建样本数据。您将从数据文件中获取 X、Y、Z。 但是,如果您的数据很大(例如大于内存),您需要将其预处理到更粗粒度的级别。我认为情况并非如此,因为 GNUplot 已经可以处理它了。
    • 我会使用imshow 而不是pcolormesh。当您有不规则形状的像素时,网格调用会更有用。
    • 好的,我确实在一个粗略的杠杆中处理了我的地图。现在 meshgrid 似乎工作正常。但是如何使密度数组与 X 或 Y 的形状相同?
    猜你喜欢
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 2016-09-26
    • 2015-09-29
    相关资源
    最近更新 更多