最基本的三维图是由(x, y, z)三维坐标点构成的线图与散点图,可以用ax.plot3D和ax.scatter3D函数来创建,默认情况下,散点会自动改变透明度,以在平面上呈现出立体感
三维的线图和散点图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#绘制三角螺旋线
from mpl_toolkits import mplot3d
% matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
ax = plt.axes(projection = '3d' )
#三维线的数据
zline = np.linspace( 0 , 15 , 1000 )
xline = np.sin(zline)
yline = np.cos(zline)
ax.plot3D(xline, yline, zline, 'gray' )
# 三维散点的数据
zdata = 15 * np.random.random( 100 )
xdata = np.sin(zdata) + 0.1 * np.random.randn( 100 )
ydata = np.cos(zdata) + 0.1 * np.random.randn( 100 )
ax.scatter3D(xdata, ydata, zdata, c = zdata, cmap = 'Greens' )
|
三维等高线图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
def f(x, y):
return np.sin(np.sqrt(x * * 2 + y * * 2 ))
x = np.linspace( - 6 , 6 , 30 )
y = np.linspace( - 6 , 6 , 30 )
X, Y = np.meshgrid(x, y)
Z = f(X,Y)
fig = plt.figure()
ax = plt.axes(projection = '3d' )
ax.contour3D(X, Y, Z, 50 , cmap = 'binary' )
ax.set_xlabel( 'x' )
ax.set_ylabel( 'y' )
ax.set_zlabel( 'z' )
#调整观察角度和方位角。这里将俯仰角设为60度,把方位角调整为35度
ax.view_init( 60 , 35 )
|
线框图和全面图
全面图和线框图相似,只不过线框图的每一个面都是由多边形构成。只要增加唉一个配色方案来填充这些多边形,就可以感受到可视化图形表面的拓扑结构了。
1
2
3
4
5
|
#线框图
fig = plt.figure()
ax = plt.axes(projection = '3d' )
ax.plot_wireframe(X, Y, Z, color = 'c' )
ax.set_title( 'wireframe' )
|
1
2
3
4
|
#曲面图
ax = plt.axes(projection = '3d' )
ax.plot_surface(X, Y, Z, rstride = 1 , cstride = 1 , cmap = 'viridis' , edgecolor = 'none' )
ax.set_title( 'surface' )
|
1
2
3
4
5
6
7
8
9
|
#使用极坐标可以获得切片的效果
r = np.linspace( 0 , 6 , 20 )
theta = np.linspace( - 0.9 * np.pi, 0.8 * np.pi, 40 )
r, theta = np.meshgrid(r, theta)
X = r * np.sin(theta)
Y = r * np.cos(theta)
Z = f(X, Y)
ax = plt.axes(projection = '3d' )
ax.plot_surface(X, Y, Z, rstride = 1 , cstride = 1 , cmap = 'viridis' , edgecolor = 'none' )
|
曲面三角剖分
在某些应用场景下,上述这些要求均匀采样的网格数据显得太过严格且不太容易实现。这时就可以使用三角剖分部分图形。
1
2
3
4
5
6
7
8
|
theta = 2 * np.pi * np.random.random( 1000 )
r = 6 * np.random.random( 1000 )
x = np.ravel(r * np.sin(theta))
y = np.ravel(r * np.cos(theta))
z = f(x, y)
ax = plt.axes(projection = '3d' )
ax.scatter(x, y, z, c = z, cmap = 'viridis' , linewidth = 0.5 )
|
1
2
3
|
#上图还有许多地方需要修补,这些工作可以由ax.plot_trisurf函数帮助我们完成。它首先找到一组所有点都连接起来的三角形,然后用这些三角形创建曲面
ax = plt.axes(projection = '3d' )
ax.plot_trisurf(x, y, z, cmap = 'viridis' , edgecolor = 'none' )
|
莫比乌斯带(应用曲面三角剖分)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#绘制莫比乌斯带
#由于它是一条二维带,因此需要两个内在维度。theta维度取值范围是0~2pi,宽度维度w取值范围是-1~1
theta = np.linspace( 0 , 2 * np.pi, 30 )
w = np.linspace( - 0.25 , 0.25 , 8 )
w, theta = np.meshgrid(w, theta)
phi = 0.5 * theta
#x-y平面内的半径
r = 1 + w * np.cos(phi)
x = np.ravel(r * np.cos(theta))
y = np.ravel(r * np.sin(theta))
z = np.ravel(w * np.sin(phi))
#要画出莫比乌斯带,还必须保证三角部分是正确的。最好的方法是首先用基本参数化方法定义三角部分,然后用Matplotlib将
#这个三角剖分映射到莫比乌斯带的三维空间里
from matplotlib.tri import Triangulation
tri = Triangulation(np.ravel(w), np.ravel(theta))
ax = plt.axes(projection = '3d' )
ax.plot_trisurf(x, y, z, triangles = tri.triangles, cmap = 'viridis' , linewidth = 0.2 )
ax.set_xlim( - 1 , 1 );ax.set_ylim( - 1 , 1 );ax.set_zlim( - 1 , 1 )
|
到此这篇关于如何用Matplotlib 画三维图的示例代码的文章就介绍到这了,更多相关Matplotlib 三维图内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/jasonzhoujx/article/details/81780774