用matplotlib绘制3D图形

 

用matplotlib绘制3D图形

制备

  • 导入numpy进行数据处理,导入pyplot进行绘图,以及mpl_toolkits.mplot3d,因为它是3D的。

1 # 导包
2 from mpl_toolkits.mplot3d import Axes3D
3 import matplotlib.pyplot as plt
4 import numpy as np

创建要绘制的数据

  • 要绘制3D,需要准备2D数组以创建网格(2D网格)。

  • 首先,使用range方法将x和y分别划分为一维区域。

x = np.arange(-3,3,0.25)
y = np.arange(-3,3,0.25)
  • 使用meshgrid方法创建二维网格。该函数的返回值是对应于X和Y的矩阵,其中X是行中x的数组,Y是列中y的数组。

1 X, Y = np.meshgrid(x,y)
2 print("x=" ,x)
3 print("X=" ,X)
4 print("y=" ,y)
5 print("Y=" ,Y)
x= [-3.   -2.75 -2.5  -2.25 -2.   -1.75 -1.5  -1.25 -1.   -0.75 -0.5  -0.25
0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
X= [[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
[-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
  0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]]
y= [-3.   -2.75 -2.5 -2.25 -2.   -1.75 -1.5 -1.25 -1.   -0.75 -0.5 -0.25
0.   0.25 0.5   0.75 1.   1.25 1.5   1.75 2.   2.25 2.5   2.75]
Y= [[-3.   -3.   -3.   -3.   -3.   -3.   -3.   -3.   -3.   -3.   -3.   -3.
-3.   -3.   -3.   -3.   -3.   -3.   -3.   -3.   -3.   -3.   -3.   -3. ]
[-2.75 -2.75 -2.75 -2.75 -2.75 -2.75 -2.75 -2.75 -2.75 -2.75 -2.75 -2.75
-2.75 -2.75 -2.75 -2.75 -2.75 -2.75 -2.75 -2.75 -2.75 -2.75 -2.75 -2.75]
[-2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5
-2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 -2.5 ]
[-2.25 -2.25 -2.25 -2.25 -2.25 -2.25 -2.25 -2.25 -2.25 -2.25 -2.25 -2.25
-2.25 -2.25 -2.25 -2.25 -2.25 -2.25 -2.25 -2.25 -2.25 -2.25 -2.25 -2.25]
[-2.   -2.   -2.   -2.   -2.   -2.   -2.   -2.   -2.   -2.   -2.   -2.
-2.   -2.   -2.   -2.   -2.   -2.   -2.   -2.   -2.   -2.   -2.   -2. ]
[-1.75 -1.75 -1.75 -1.75 -1.75 -1.75 -1.75 -1.75 -1.75 -1.75 -1.75 -1.75
-1.75 -1.75 -1.75 -1.75 -1.75 -1.75 -1.75 -1.75 -1.75 -1.75 -1.75 -1.75]
[-1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5
-1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 -1.5 ]
[-1.25 -1.25 -1.25 -1.25 -1.25 -1.25 -1.25 -1.25 -1.25 -1.25 -1.25 -1.25
-1.25 -1.25 -1.25 -1.25 -1.25 -1.25 -1.25 -1.25 -1.25 -1.25 -1.25 -1.25]
[-1.   -1.   -1.   -1.   -1.   -1.   -1.   -1.   -1.   -1.   -1.   -1.
-1.   -1.   -1.   -1.   -1.   -1.   -1.   -1.   -1.   -1.   -1.   -1. ]
[-0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75
-0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75 -0.75]
[-0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5
-0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 ]
[-0.25 -0.25 -0.25 -0.25 -0.25 -0.25 -0.25 -0.25 -0.25 -0.25 -0.25 -0.25
-0.25 -0.25 -0.25 -0.25 -0.25 -0.25 -0.25 -0.25 -0.25 -0.25 -0.25 -0.25]
[ 0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
  0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0. ]
[ 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25
  0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25 0.25]
[ 0.5   0.5   0.5   0.5   0.5   0.5   0.5   0.5   0.5   0.5   0.5   0.5
  0.5   0.5   0.5   0.5   0.5   0.5   0.5   0.5   0.5   0.5   0.5   0.5 ]
[ 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75
  0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75 0.75]
[ 1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.
  1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1.   1. ]
[ 1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25
  1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25]
[ 1.5   1.5   1.5   1.5   1.5   1.5   1.5   1.5   1.5   1.5   1.5   1.5
  1.5   1.5   1.5   1.5   1.5   1.5   1.5   1.5   1.5   1.5   1.5   1.5 ]
[ 1.75 1.75 1.75 1.75 1.75 1.75 1.75 1.75 1.75 1.75 1.75 1.75
  1.75 1.75 1.75 1.75 1.75 1.75 1.75 1.75 1.75 1.75 1.75 1.75]
[ 2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.
  2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2.   2. ]
[ 2.25 2.25 2.25 2.25 2.25 2.25 2.25 2.25 2.25 2.25 2.25 2.25
  2.25 2.25 2.25 2.25 2.25 2.25 2.25 2.25 2.25 2.25 2.25 2.25]
[ 2.5   2.5   2.5   2.5   2.5   2.5   2.5   2.5   2.5   2.5   2.5   2.5
  2.5   2.5   2.5   2.5   2.5   2.5   2.5   2.5   2.5   2.5   2.5   2.5 ]
[ 2.75 2.75 2.75 2.75 2.75 2.75 2.75 2.75 2.75 2.75 2.75 2.75
  2.75 2.75 2.75 2.75 2.75 2.75 2.75 2.75 2.75 2.75 2.75 2.75]]
  • 此XY直接用于计算z。计算结果也是二维数组。

1 x = np.arange(-3, 3, 0.25)
2 y = np.arange(-3, 3, 0.25)
3 X, Y = np.meshgrid(x, y)
4 Z = np.sin(X)+ np.cos(Y)

创建图

  • 首先,使用图形方法生成二维图形。然后使用Axes3D功能将其转换为3D版本。

  • 之后,如果将预先计算的3D点序列X,Y,Z传递给3D图函数(例如plot),则可以


1 fig = plt.figure()
2 ax = Axes3D(fig)
3 ax.plot_wireframe(X,Y,Z)
4 plt.show()

  • 到此为止的处理总结如下。


 1 from mpl_toolkits.mplot3d import Axes3D
 2 import matplotlib.pyplot as plt
 3 import numpy as np
 4  5 x = np.arange(-3, 3, 0.25)
 6 y = np.arange(-3, 3, 0.25)
 7 X, Y = np.meshgrid(x, y)
 8 Z = np.sin(X)+ np.cos(Y)
 9 10 fig = plt.figure()
11 ax = Axes3D(fig)
12 13 # 线框
14 ax.plot_wireframe(X,Y,Z)
15 16 # 表面
17 # ax.plot_surface(X, Y, Z, rstride=1, cstride=1)
18 19 # 3D图
20 # ax.plot3D(np.ravel(X),np.ravel(Y),np.ravel(Z))
21 22 # 轮廓
23 # ax.contour3D(X,Y,Z)
24 # ax.contourf3D(X,Y,Z)
25 26 # 散点图
27 # ax.scatter3D(np.ravel(X),np.ravel(Y),np.ravel(Z))
28 29 plt.show()
  • 除了plot_wireframe,还有几个函数可以让您绘制各种图表。

线框
# ax.plot_wireframe(X,Y,Z)

 

 

表面
# ax.plot_surface(X, Y, Z, rstride=1, cstride=1)
3D图
  • plot3D是一个简单的函数,可以在三个维度上绘制给定的一维数组。由于X,Y,和Z是二维阵列,使用numpy的。拉威尔函数传递作为参数之前,将二维数组转换为一维阵列。如果绘制图形,则可以看到它们全部由一条直线相连。

# ax.plot3D(np.ravel(X),np.ravel(Y),np.ravel(Z))
轮廓
  • 轮廓f3D是一种用相同颜色填充相同高度的函数。

# ax.contour3D(X,Y,Z)
# ax.contourf3D(X,Y,Z)
E:\Anaconda3\lib\site-packages\numpy\core\_asarray.py:136: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray
return array(a, dtype, copy=False, order=order, subok=True)
散点图
  • 此方法绘制的点是三维尺寸而非直线。这也将转换为一维数组,然后传递给参数。

# ax.scatter3D(np.ravel(X),np.ravel(Y),np.ravel(Z))

 

 


posted @ 2020-12-19 17:39  小石小石摩西摩西  阅读(1029)  评论(0编辑  收藏  举报