Matplotlib画几种三维图

本文探讨如何通过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+y11)2+(x+y27)2.
下图包含四个子图,每个子图都为三维图。图1,2,3都是三维曲面图,使用了ax.plot_surface()函数,但有所不同。

  1. cmap的参数不同。
  2. 图1和图2,色阶指示栏的长度不同。
  3. 图2和图3,图形网格大小不同。
  4. 图4线框模型使用了ax.plot_wireframe()函数
    Matplotlib画几种三维图_第1张图片

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()

Matplotlib画几种三维图_第2张图片
(未完待续)Matplotlib画几种三维图_第3张图片
Matplotlib画几种三维图_第4张图片

你可能感兴趣的:(数据可视化)