本文探讨如何通过python的matplotlib.画出我们所需要的三维图。
主要会使用到maplotlib 的3D绘图工具The mplot3d Toolkit中的各种函数。
包括
函数 | 图形 |
---|---|
Axes3D.plot | 三维曲线 |
Axes3D.scatter | 三维散点图 |
Axes3D.plot_wireframe | 三维线框图 |
Axes3D.plot_surface | 三维曲面图 |
Axes3D.plot_trisurf | 三角面 |
Axes3D.contour | 三维等高线 |
Axes3D.contour | 三维等高面 |
Axes3D.add_collection3d | 三维峰值图 |
Axes3D.bar | 三维柱形图 |
Axes3D.quiver | 三维矢量图 |
Axes3D.text | 词条分布图 |
2D plots in 3D | 含二维图的三维图 |
3D plots as subplots | 包含子图的三维图 |
以Himmelblau曲面为例。
H i m m e l b l a u ( x , y ) = ( x 2 + y − 11 ) 2 + ( x + y 2 − 7 ) 2 . \ Himmelblau(x,y) =(x^2+y-11)^2+(x+y^2-7)^2 . Himmelblau(x,y)=(x2+y−11)2+(x+y2−7)2.
下图包含四个子图,每个子图都为三维图。图1,2,3都是三维曲面图,使用了ax.plot_surface()函数,但有所不同。
import numpy as np
import matplotlib.pyplot as plt
#有时候找不到Axes3D,需要加载一下
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.font_manager import FontProperties
#himmelblu函数为 f(x,y)=(x^2+y-11)^2+(x+y^2-7)^2
def himmelblau(x):
return (x[0]**2 + x[1] - 11)**2 +(x[0] + x[1]**2 - 7)**2
x = np.arange(-6, 6, 0.1)
y = np.arange(-6, 6, 0.1)
X,Y=np.meshgrid(x, y)
Z = himmelblau([X, Y])
# 绘制himmelblau曲面
#plot_surface(X,Y,Z)中X,Y,Z必须是二维数组
fig = plt.figure('Himmelblau_surfaceFig',figsize=(15,15))
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=16) #导入本地汉字字库
plt.title('Himmelblau曲面', fontproperties=font)
plt.axis('off')#关闭坐标刻度
#图1
#ax = fig.gca(projection = '3d')
ax = fig.add_subplot(2,2,1,projection = '3d')
surf = ax.plot_surface(X, Y, Z, alpha = 0.8, color ='blue',
rstride=5, cstride=5,
cmap = 'rainbow')
ax.view_init(45, -30)
plt.title("cmap = 'rainbow'")
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f(x,y)')
#色阶栏
fig.colorbar(surf, shrink=0.5, aspect=2)
#图2
ax = fig.add_subplot(2,2,2,projection='3d')
surf3=ax.plot_surface(X, Y, Z, alpha = 0.8, color ='blue',
rstride=5, cstride=5,
cmap = plt.cm.coolwarm)
plt.title("cmap = plt.cm.coolwarm")
ax.view_init(45, -30)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f(x,y)')
#色阶栏
fig.colorbar(surf3, shrink=0.5, aspect=3)
#图3
ax = fig.add_subplot(2,2,3,projection='3d')
ax.plot_surface(X, Y, Z, alpha = 0.8, color ='blue',
rstride=20, cstride=20,
cmap = plt.cm.hot)
plt.title("plt.cm.hot")
ax.view_init(45, -30)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f(x,y)')
#图4
ax = fig.add_subplot(2,2,4,projection='3d')
ax.plot_wireframe(X, Y, Z, color ='blue',
rstride=20, cstride=20)
plt.title("3Dwireframe")
ax.view_init(45, -30)
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('f(x,y)')
plt.show()