无法播放?请 点击这里 跳转到Youtube
切换视频源:

上一章我们学习了箱形图和饼图,这一章我们来学习热力图和3D图。首先导入我们需要的库:

import matplotlib.pyplot as plt
import numpy as np

热力图 Heat map

热力图是一种通过对色块着色,来显示数据的统计图表。通常热力图中的方格是按照特定的规则着色的,要么数值大小和颜色深浅成正比,要么成反比。

如果想要画热力图,我们首先把x和y轴的标记定义好,然后使用numpy创建一个2D的矩阵,再使用imshow来画出热力图:

fig, axe = plt.subplots(figsize = (8, 5))

x_labels = ["x1", "x2", "x3", "x4", "x5"]
y_labels = ["y1", "y2", "y3", "y4", "y5"]
axe.set_xticks(np.arange(len(x_labels)))
axe.set_yticks(np.arange(len(y_labels)))
axe.set_xticklabels(x_labels)
axe.set_yticklabels(y_labels)

values = np.array([[0.2, 0.3, 1.5, 0.5, 0.6],
                   [2.5, 0.7, 0.7, 1.8, 0.9],
                   [0.5, 1.4, 2.5, 0.5, 1.5],
                   [0.4, 1.9, 2.0, 0.5, 0.5],
                   [1.0, 2.4, 0.1, 0.0, 1.5]])
im = axe.imshow(values)

plt.show()

如果想在图中显示每个方块的数值,可以使用axe.text函数来显示数值:

fig, axe = plt.subplots(figsize = (8, 5))

axe.set_xticks(np.arange(len(x_labels)))
axe.set_yticks(np.arange(len(y_labels)))
axe.set_xticklabels(x_labels)
axe.set_yticklabels(y_labels)
im = axe.imshow(values)

for i in range(len(x_labels)):
    for j in range(len(y_labels)):
        text = axe.text(i, j, values[i, j],
                        horizontalalignment="center", 
                        verticalalignment="center", 
                        color="w")

plt.show()

如果要使用颜色条作为参照,可以使用colorbar函数来实现:

fig, axe = plt.subplots(figsize = (8, 5))

axe.set_xticks(np.arange(len(x_labels)))
axe.set_yticks(np.arange(len(y_labels)))
axe.set_xticklabels(x_labels)
axe.set_yticklabels(y_labels)
im = axe.imshow(values)

for i in range(len(x_labels)):
    for j in range(len(y_labels)):
        text = axe.text(i, j, values[i, j],
                       horizontalalignment="center", verticalalignment="center", color="w")
axe.figure.colorbar(im, ax=axe)

plt.show()

3D图 3D Plot

接下来我们来学习如何画3D图,首先导入相关的库:

from mpl_toolkits.mplot3d import Axes3D

如果要构建一个3D散点图,可以使用scatter3D来实现:

fig = plt.figure(figsize = (8, 6))

x = np.random.randint(10, size = 50)
y = np.random.randint(20, size = 50)
z = np.random.randint(30, size = 50)

axes = plt.axes(projection = "3d")
axes.scatter3D(x, y, z, color="red")

plt.show()

如果要画3D图,首先定义一些X,Y轴上的点,然后使用meshgrid生成(x,y)组成的格点,并计算出每对(x,y)对应的高度Z,最后使用plot_surface来实现:

fig = plt.figure(figsize = (8, 6))

X = np.linspace(-4, 4, 400)
Y = np.linspace(-4, 4, 400)
X, Y = np.meshgrid(X, Y) # meshgrid帮助我们生成(x,y)数值对
Z = np.cos(np.sqrt(X**2 + Y**2)) # cos(sqrt(x^2 + y^2))

axes = plt.axes(projection = "3d")
axes.plot_surface(X, Y, Z)
plt.show()

如果想画colorbar为图形标注颜色深浅,可以使用colorbar函数实现:

fig = plt.figure(figsize = (8, 5))
axes = plt.axes(projection = "3d")

X = np.linspace(-4, 4, 400)
Y = np.linspace(-4, 4, 400)
X, Y = np.meshgrid(X, Y)
Z = np.cos(np.sqrt(X**2 + Y**2))

surf = axes.plot_surface(X, Y, Z, cmap=plt.get_cmap("plasma")) # 使用get_cmap拿到提前定义好的color map
plt.colorbar(surf)
plt.show()

以上就是和热力图和3D图相关的内容了,也恭喜大家完成了《Matplotlib入门教程》,希望大家能借助这些知识,更好地将Matplotlib应用于数据可视化领域。