绘制2D热力图

261
使用Matplotlib,我想绘制一个二维热力图。我的数据是一个 n×n 的Numpy数组,每个元素的值介于0和1之间。因此,对于该数组的(i, j)元素,我希望在我的热力图中绘制一个正方形,在该坐标处的颜色与数组中该元素的值成比例。

我该如何做到这一点?

7个回答

332
使用参数interpolation='nearest'cmap='hot'imshow()函数应该可以实现您想要的效果。
请查看interpolation参数的详细信息,并参考imshow的插值方法图像抗锯齿
import matplotlib.pyplot as plt
import numpy as np

a = np.random.random((16, 16))
plt.imshow(a, cmap='hot', interpolation='nearest')
plt.show()

A sample color map produced by the example code


134

Seaborn 是一个针对 matplotlib 的高级 API,它可以自动处理许多手动工作。

seaborn.heatmap 可以自动在图表侧面绘制渐变色等。

import numpy as np
import seaborn as sns
import matplotlib.pylab as plt

uniform_data = np.random.rand(10, 12)
ax = sns.heatmap(uniform_data, linewidth=0.5)
plt.show()

输入图像描述

您甚至可以绘制正方形矩阵的上/下左/右三角形。例如,相关矩阵是正方形和对称的,因此绘制所有值将是冗余的。

corr = np.corrcoef(np.random.randn(10, 200))
mask = np.zeros_like(corr)
mask[np.triu_indices_from(mask)] = True
with sns.axes_style("white"):
    ax = sns.heatmap(corr, mask=mask, vmax=.3, square=True,  cmap="YlGnBu")
    plt.show()

输入图像描述


80
我会使用matplotlib的pcolor/pcolormesh函数,因为它允许数据的非均匀间距。
示例取自matplotlib
import matplotlib.pyplot as plt
import numpy as np

# generate 2 2d grids for the x & y bounds
y, x = np.meshgrid(np.linspace(-3, 3, 100), np.linspace(-3, 3, 100))

z = (1 - x / 2. + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)
# x and y are bounds, so z should be the value *inside* those bounds.
# Therefore, remove the last value from the z array.
z = z[:-1, :-1]
z_min, z_max = -np.abs(z).max(), np.abs(z).max()

fig, ax = plt.subplots()

c = ax.pcolormesh(x, y, z, cmap='RdBu', vmin=z_min, vmax=z_max)
ax.set_title('pcolormesh')
# set the limits of the plot to the limits of the data
ax.axis([x.min(), x.max(), y.min(), y.max()])
fig.colorbar(c, ax=ax)

plt.show()

pcolormesh plot output


45

如果你有一个2d的numpy数组,可以简单地使用imshow()函数帮助你:

import matplotlib.pyplot as plt
import numpy as np


def heatmap2d(arr: np.ndarray):
    plt.imshow(arr, cmap='viridis')
    plt.colorbar()
    plt.show()


test_array = np.arange(100 * 100).reshape(100, 100)
heatmap2d(test_array)

示例代码的热力图

这段代码生成一个连续的热力图。

您可以从此处选择另一个内置的colormap


16

这是如何从CSV文件中进行操作的:

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata

# Load data from CSV
dat = np.genfromtxt('dat.xyz', delimiter=' ',skip_header=0)
X_dat = dat[:,0]
Y_dat = dat[:,1]
Z_dat = dat[:,2]

# Convert from pandas dataframes to numpy arrays
X, Y, Z, = np.array([]), np.array([]), np.array([])
for i in range(len(X_dat)):
        X = np.append(X, X_dat[i])
        Y = np.append(Y, Y_dat[i])
        Z = np.append(Z, Z_dat[i])

# create x-y points to be used in heatmap
xi = np.linspace(X.min(), X.max(), 1000)
yi = np.linspace(Y.min(), Y.max(), 1000)

# Interpolate for plotting
zi = griddata((X, Y), Z, (xi[None,:], yi[:,None]), method='cubic')

# I control the range of my colorbar by removing data 
# outside of my range of interest
zmin = 3
zmax = 12
zi[(zi<zmin) | (zi>zmax)] = None

# Create the contour plot
CS = plt.contourf(xi, yi, zi, 15, cmap=plt.cm.rainbow,
                  vmax=zmax, vmin=zmin)
plt.colorbar()  
plt.show()

其中dat.xyz的形式为

x1 y1 z1
x2 y2 z2
...

6
使用matshow()函数,它是对imshow()的封装,可以设置一些有用的默认参数来显示矩阵。
a = np.diag(range(15))
plt.matshow(a)

在此输入图像描述

https://matplotlib.org/stable/api/_as-gen/matplotlib.axes.Axes.matshow.html

这只是一个方便函数,用于包装imshow以设置用于显示矩阵的有用默认值。 特别是:

  • 设置origin ='upper'
  • 设置interpolation ='nearest'
  • 设置aspect ='equal'
  • 刻度线位于左侧和上方。
  • 格式化刻度线以显示整数索引。

如果你只需要稀疏模式,你也可以使用spy()函数。 - undefined

0

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