Matplotlib 3D绘图,mplot3d工具集是matplotlib
内置的标配,可用来实现3D数据可视化功能。如果生成的图形在单独的窗口中显示,还可以用鼠标旋转三维图形的轴进行查看。本文主要介绍3D曲面图,3D散点图,3D条形图。
mplot3d任然使用Figure对象,Axes
对象要替换为该工具集的Axes3D
对象,使用如下指令导入Axes3D
对象。
from mpl_toolkits.mplot3d import Axes3D
3D 曲面图
前面我们用等值线表示三维曲面,使用mplot3d 可以将表面直接绘制成3D
形状。
计算分隔线坐标后,就可以用plot_surface()
函数绘制曲面,如下所示:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
def f(x, y):
return (1 - y**5 + x**5)*np.exp(-x**2-y**2)
fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(-2, 2, 0.1)
Y = np.arange(-2, 2, 0.1)
X, Y = np.meshgrid(X, Y)
ax.plot_surface(X, Y, f(X,Y), rstride=1, cstride=1)
plt.title("geek-docs.com", fontsize=20, fontname="Times New Roman")
plt.show()
输入结果如下所示:
可以使用cmap
参数指定各颜色,可以用view_init()
函数旋转曲面,它的两个参数:elev
指定从哪个高度查看曲面,azim
参数指定曲面旋转的角度。如下所示:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
def f(x, y):
return (1 - y**5 + x**5)*np.exp(-x**2-y**2)
fig = plt.figure()
ax = Axes3D(fig)
X = np.arange(-2, 2, 0.1)
Y = np.arange(-2, 2, 0.1)
X, Y = np.meshgrid(X, Y)
ax.plot_surface(X, Y, f(X,Y), rstride=1, cstride=1, cmap=plt.cm.hot)
plt.title("geek-docs.com", fontsize=20, fontname="Times New Roman")
ax.view_init(elev=30, azim=125)
plt.show()
输出结果如下:
3D 散点图
通过散点图能够识别数据点的分布是否遵循某种特定趋势,尤其是可以识别它们是否聚集成簇的趋势。
如下所示,我们多少使用Axes3D
对象的scatter()
函数,在同一个3D对象中显示不同的序列。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
xs = np.random.randint(30, 40, 100)
ys = np.random.randint(20, 30, 100)
zs = np.random.randint(10, 20, 100)
xs2 = np.random.randint(50, 60, 100)
ys2 = np.random.randint(30, 40, 100)
zs2 = np.random.randint(50, 70, 100)
xs3 = np.random.randint(10, 30, 100)
ys3 = np.random.randint(40, 50, 100)
zs3 = np.random.randint(40, 50, 100)
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(xs, ys, zs)
ax.scatter(xs2, ys2, zs2, c= 'r', marker='^')
ax.scatter(xs3, ys3, zs3, c='g', marker='*')
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z label')
plt.title("geek-docs.com", fontsize=20, fontname="Times New Roman")
plt.show()
输出结果如下:
3D 条形图
极客教程前面有介绍2D条形图,数据分析常常用到3D
条形图。要绘制这种图表,需要使用Axes3D
对象的bar()
函数。如果定义了多序列,可以在同一个3D对象上多次调用bar()
函数,如下所示:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
x = np.arange(8)
y = np.random.randint(0, 10, 8)
y2 = y + np.random.randint(0, 3, 8)
y3 = y2 + np.random.randint(0, 3, 8)
y4 = y3 + np.random.randint(0, 3, 8)
y5 = y4 + np.random.randint(0, 3, 8)
clr = ['#4bb2c5','#c5b47f','#EAA228','#579575','#839557','#958c12','#953579','#4b5de4']
fig = plt.figure()
ax = Axes3D(fig)
ax.bar(x, y, 0, zdir='y', color=clr)
ax.bar(x, y2, 10, zdir='y', color=clr)
ax.bar(x, y3, 20, zdir='y', color=clr)
ax.bar(x, y4, 30, zdir='y', color=clr)
ax.bar(x, y5, 40, zdir='y', color=clr)
ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z label')
ax.view_init(elev=40)
plt.title("geek-docs.com", fontsize=20, fontname="Times New Roman")
plt.show()
输出结果如下:
极客教程相关文章推荐:
Matplotlib 极区图
Matplotlib 等值线图
Matplotlib 饼图
Matplotlib 水平条形图
Matplotlib 条形图
Matplotlib 直方图
Matplotlib 线性图