在Python中绘制热力图

3
我有两个列表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]代表二维平面上的一个点。此外,我还有一个列表z,代表每个(x,y)点的“热值”。例如,z = [0.77, 0.88, 0.65, 0.55, 0.89, 0.9, 0.8,0.95]。当然,x、y和z的维度比这个例子高得多。
现在我想在二维平面上绘制一个热力图,其中x和y表示坐标轴,z表示颜色。如何在Python中实现呢?

2
查看matplotlib中的tricontour。以下是他们库中的一个示例:http://matplotlib.org/examples/pylab_examples/tricontour_demo.html - Brian
2个回答

5

这段代码生成了一个热度图。当有更多的数据点时,绘图看起来非常好,并且我发现它通常非常快,即使对于超过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()

生成这张图片:

enter image description here

如果你想要更渐进的颜色变化,可以将tricontourf行改为以下内容:

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

然后情节将发生变化,如下图所示:

enter image description here


2

参考这个答案,您可能想要这样做:

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会很好!谢谢 - Agape Gal'lo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接