前面已经学习了如何输出二维图和三维图,部分文章详见下述链接:
python画图|极坐标下的3D surface-CSDN博客
python画图|垂线标记系列_如何用pyplot画垂直x轴的线-CSDN博客
有时候也需要同时输出二位和三维图,因此有必要学习一下。
【1】官网教程
首先我们打开官网教程,链接如下。
https://matplotlib.org/stable/gallery/mplot3d/mixed_subplots.html
我们把代码复制出来运行一下,获得的结果图很漂亮。
因此我们对代码做了解读。
【2】代码解读
首先是numpy和matplotlib引入。
import matplotlib.pyplot as plt #引入matplotlib模块画图 import numpy as np #引入numpy模块做数学计算
然后迅速定义了一个函数:
def f(t): #定义函数f(t) return np.cos(2*np.pi*t) * np.exp(-t)
之后定义了要画2行一列图形:
# Set up a figure twice as tall as it is wide fig = plt.figure(figsize=plt.figaspect(2.)) #定义图的大小 fig.suptitle('A tale of 2 subplots') #定义图名
进入画图阶段,先定义二维图画法:
# First subplot ax = fig.add_subplot(2, 1, 1) #定义2行一列图 t1 = np.arange(0.0, 5.0, 0.1) #定义变量 t2 = np.arange(0.0, 5.0, 0.02) #定义变量 t3 = np.arange(0.0, 2.0, 0.01) #定义变量 ax.plot(t1, f(t1), 'bo', #输出第一个二维图 t2, f(t2), 'k--', markerfacecolor='green') ax.grid(True) #画网格 ax.set_ylabel('Damped oscillation') #定义Y轴
在定义三维图画法:
# Second subplot ax = fig.add_subplot(2, 1, 2, projection='3d') #定义第二个图为3D图 X = np.arange(-5, 5, 0.25)#定义变量 Y = np.arange(-5, 5, 0.25)#定义变量 X, Y = np.meshgrid(X, Y) #定义变量,让XY充分组合 R = np.sqrt(X**2 + Y**2) ##定义变量 Z = np.sin(R) #定义变量 surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, #输出surface图 linewidth=0, antialiased=False) ax.set_zlim(-1, 1) #设置Z轴
最后一步,将图形稳稳输出:
plt.show() #输出图形
【3】修改代码
首先考虑到二维图中自变量是重合的,将其拆分后:
t1 = np.arange(0.0, 2.0, 0.1) #定义变量 t2 = np.arange(2.0, 5.0, 0.02) #定义变量 t3 = np.arange(5.0,7.0, 0.01) #定义变量
现在自变量变成连续的区间。
然后将不同自变量对应的因变量用不同的颜色和线型区分:
ax.plot(t1, f(t1), 'bo', #输出第一个二维图 t2, f(t2), 'k--', t3,f(t3),markerfacecolor='red')
此时的输出结果为:
图2
由图2氪可见,上面的子图输出了连续但不同线型不同颜色的二维图,下面输出了三维图。
【4】改写代码
首先考虑到将surface图改成好看的渐变色,增加cmap设置:
surf = ax.plot_surface(X, Y, Z, cmap=plt.cm.PuBuGn,rstride=1, cstride=1, #输出surface图 linewidth=0, antialiased=False)
然后在增加一个surface图:
ax = fig.add_subplot(1, 3, 3, projection='3d') #定义第二个图为3D图 X1 = np.arange(5, 15, 0.25)#定义变量 Y1 = np.arange(5, 15, 0.25)#定义变量 X1, Y1 = np.meshgrid(X1, Y1) #定义变量,让XY充分组合 R1 = np.sqrt(X1**2 + Y1**2) ##定义变量 Z1= np.sin(R1) #定义变量 surf1 = ax.plot_surface(X1, Y1, Z1, cmap='summer_r',rstride=1, cstride=1, #输出surface图 linewidth=0, antialiased=False) ax.set_zlim(-1, 1) #设置Z轴
为了让图形好看,我们提前将图形设置成了1行3列:
ax = fig.add_subplot(1, 3, 1) #定义1行3列图
运行结果为:
图3
由图3可见,横向输出了二维和三维图。
【5】总结
学习了同时输出二维和三维图,掌握了图形坐标和颜色设置。