无法播放?请 点击这里 跳转到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应用于数据可视化领域。