我们可以很容易的使用matplotlib绘制三维图。下面我们来学习一些重要且常用的三维图。
本章节的主要内容包括:
- 绘制三维点
- 绘制三维条形图
- 绘制三维曲线
先看下面的示例:
# 导入库
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import style
import numpy as np
# 设置要使用的自定义样式
style.use('ggplot')
# 创建图形
fig = plt.figure()
# 在我们的图上创建一个新的子图,并将投影设置为3D
ax1 = fig.add_subplot(111, projection='3d')
# 定义X、Y、Z坐标
x = np.random.randint(0, 10, size=20)
y = np.random.randint(0, 10, size=20)
z = np.random.randint(0, 10, size=20)
# 绘制子图上的点
ax1.scatter(x, y, z, c='m', marker='o')
# 为轴设置标签
ax1.set_xlabel('x-axis')
ax1.set_ylabel('y-axis')
ax1.set_zlabel('z-axis')
# 显示图
plt.show()
运行后的效果如下:
上面绘制的将是一个可以旋转或放大的视图。
代码解释:
from mpl_toolkits.mplot3d import axes3d
这是在三维空间上绘图所需的模块。
ax1 = fig.add_subplot(111, projection='3d')
在这里,我们在图上创建一个子图,并将投影参数设置为3d。
ax1.scatter(x, y, z, c='m', marker='o')
使用**.scatter()**函数绘制XYZ平面中的点。
先看下面的示例:
# 导入库
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import style
import numpy as np
# 设置要使用的自定义样式
style.use('ggplot')
# 创建图形
fig = plt.figure()
# 在我们的图上创建一个新的子图,并将投影设置为3D
ax1 = fig.add_subplot(111, projection='3d')
# 定义X、Y、Z坐标
x = [1,2,3,4,5,6,7,8,9,10]
y = [4,3,1,6,5,3,7,5,3,7]
z = np.zeros(10)
# 条形图的大小
dx = np.ones(10) # 沿x轴的长度
dy = np.ones(10) # 沿y轴的长度
dz = [1,3,4,2,6,7,5,5,10,9] # bar的高度
# 设置颜色
color = []
for h in dz:
if h > 5:
color.append('r')
else:
color.append('b')
# 绘制条形图
ax1.bar3d(x, y, z, dx, dy, dz, color = color)
# 为轴设置标签
ax1.set_xlabel('x-axis')
ax1.set_ylabel('y-axis')
ax1.set_zlabel('z-axis')
plt.show()
运行后的效果如下:
代码解释:
x = [1,2,3,4,5,6,7,8,9,10]
y = [4,3,1,6,5,3,7,5,3,7]
z = np.zeros(10)
在这里,我们定义条形的基本位置。设置z = 0表示所有条形均从XY平面开始。
dx = np.ones(10) # 沿x轴的长度
dy = np.ones(10) # 沿y轴的长度
dz = [1,3,4,2,6,7,5,5,10,9] # bar的高度
dx,dy,dz表示条形的大小,它是一个长方体,dx,dy,dz分别是沿x,y,z轴的长度。
color = []
for h in dz:
if h > 5:
color.append('r')
else:
color.append('b')
在这里,我们将每个条形图的颜色设置为列表。对于高度大于5的条形图,颜色方案为红色,否则为蓝色。
ax1.bar3d(x,y,z,dx,dy,dz,color = color)
最后,为了绘制条形图,我们使用**.bar3d()**函数。
先看下面的示例:
# 导入所需模块
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
from matplotlib import style
import numpy as np
# 设置要使用的自定义样式
style.use('ggplot')
# 创建新图形
fig = plt.figure()
# 在图上创建一个新的子图
ax1 = fig.add_subplot(111, projection='3d')
# 获取网格点
u, v = np.mgrid[0:2*np.pi:200j, 0:np.pi:100j]
# 设置X、Y、Z坐标
x = np.cos(u)*np.sin(v)
y = np.sin(u)*np.sin(v)
z = np.cos(v)
# 绘制曲线
ax1.plot_wireframe(x, y, z, rstride=5, cstride=5, linewidth=1)
# 显示
plt.show()
程序运行后效果如下:
代码解释:
u, v = np.mgrid[0:2*np.pi:200j, 0:np.pi:100j]
我们使用np.mgrid来获取点,以便我们可以创建一个网格。
x = np.cos(u)*np.sin(v)
y = np.sin(u)*np.sin(v)
z = np.cos(v)
这只不过是球体的参数方程。
ax1.plot_wireframe(x, y, z, rstride=5, cstride=5, linewidth=1)
最后使用plot_wireframe()函数绘制曲线,rstride和cstride参数可用于设置网格密集的程度。
若有疑问,欢迎联系作者(微信:lixu1770105)。