【问题标题】:Drawing heat map in python在python中绘制热图
【发布时间】:2017-06-17 03:49:12
【问题描述】:

我有两个列表 x,y 代表二维坐标。例如x = [1,4,0.5,2,5,10,33,0.04]y = [2,5,44,0.33,2,14,20,0.03]x[i]y[i] 代表 2D 中的一个点。现在我还有一个代表每个 (x,y) 点的“热”值的列表,例如z = [0.77, 0.88, 0.65, 0.55, 0.89, 0.9, 0.8,0.95]。当然 x,y 和 z 的维度比示例高得多。

现在我想在 2D 中绘制热图,其中 x 和 y 代表轴坐标,z 代表颜色。这在python中怎么做?

【问题讨论】:

标签: python matplotlib heatmap


【解决方案1】:

此代码生成热图。有了更多的数据点,绘图开始看起来非常漂亮,而且我发现它通常非常快,即使对于 >100k 点也是如此。

import matplotlib.pyplot as plt
import matplotlib.tri as tri
import numpy as np
import math

x = [1,4,0.5,2,5,10,33,0.04]
y = [2,5,44,0.33,2,14,20,0.03]
z = [0.77, 0.88, 0.65, 0.55, 0.89, 0.9, 0.8, 0.95]
levels = [0.7, 0.75, 0.8, 0.85, 0.9]

plt.figure()
ax = plt.gca()
ax.set_aspect('equal')
CS = ax.tricontourf(x, y, z, levels, cmap=plt.get_cmap('jet'))
cbar = plt.colorbar(CS, ticks=np.sort(np.array(levels)),ax=ax, orientation='horizontal', shrink=.75, pad=.09, aspect=40,fraction=0.05)
cbar.ax.set_xticklabels(list(map(str,np.sort(np.array(levels)))))  # horizontal colorbar
cbar.ax.tick_params(labelsize=8) 
plt.title('Heat Map')
plt.xlabel('X Label')
plt.ylabel('Y Label')

plt.show()

生成此图像:

或者,如果您正在寻找更渐变的颜色变化,请将 tricontourf 线更改为:

CS = ax.tricontourf(x, y, z, np.linspace(min(levels),max(levels),256), cmap=cmap)

然后情节将变为:

【讨论】:

    【解决方案2】:

    基于this answer,您可能想要执行以下操作:

    import numpy as np
    from matplotlib.mlab import griddata
    import matplotlib.pyplot as plt 
    xs0 = [1,4,0.5,2,5,10,33,0.04]
    ys0 = [2,5,44,0.33,2,14,20,0.03]
    zs0 = [0.77, 0.88, 0.65, 0.55, 0.89, 0.9, 0.8,0.95]   
    N = 30j
    extent = (np.min(xs0),np.max(xs0),np.min(ys0),np.max(ys0))  
    xs,ys = np.mgrid[extent[0]:extent[1]:N, extent[2]:extent[3]:N]    
    resampled = griddata(xs0, ys0, zs0, xs, ys, interp='linear')   
    plt.imshow(np.fliplr(resampled).T, extent=extent,interpolation='none')
    plt.colorbar()
    

    这里的例子也可能有帮助:http://matplotlib.org/examples/pylab_examples/griddata_demo.html

    【讨论】:

    • 非常好的回答!但是我想知道一些细节:当我绘制它时,我不能移动 x 长度关于他们赢了。他们保持堆叠到“数学”比例(我希望清楚......)。如果 x 和 y 有几个数量级的差异,这可能会很成问题。而且,你能用一个我们可以作为变量改变的普通数字来代替“N”吗? Nx 和 NY 会很好!谢谢
    猜你喜欢
    • 2021-07-24
    • 2020-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2017-11-12
    • 2021-06-07
    相关资源
    最近更新 更多