当前位置:网站首页>Matplotlib绘制三维图形
Matplotlib绘制三维图形
2022-07-07 15:38:00 【En^_^Joy】
用Matplotlib画三维图
画三维图需要mplot3d
模块,在创建任意一个普通坐标轴的过程中加入projection='3d'
关键字,从而创建三维坐标轴
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
import numpy as np
fig = plt.figure()
ax = plt.axes(projection='3d')
# 画图代码
# 显示图片
plt.show()
后序代码将这些代码省略了,将后面的代码套入画图代码里面即可
三维数据点与线
用ax.plot3D
与ax.scatter3D
来创建三维坐标的线图与散点图,三维函数的参数与二维函数的参数基本相同
# 三维线的数据
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')
默认情况,散点会自动改变透明度,以在平面上呈现出立体感
三维等高线图
ax.contour3D
要求所有数据都是二维网格数据的格式,由函数计算z轴数值
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)
ax.contour3D(X, Y, Z, 50, cmap='binary')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
view_init
可以调整观察角度和方位角,在这个例子中,将俯仰角调整为60度,方位角调整为35度,在上面的代码基础上加上下面这行代码:
ax.view_init(60, 35)
也可以在图中点击拖拽图形装换角度
线框图和曲面图
ax.plot_wireframe
绘制线框图
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)
ax.plot_wireframe(X, Y, Z, color='black')
ax.set_title('wireframe')
ax.plot_surface
绘制曲面图
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)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='viridis', edgecolor='none')
ax.set_title('surface')
画曲面图的二维数据可以是直角坐标系数据,也可以是极坐标数据,下面是极坐标数据
创建的图
def f(x, y):
return np.sin(np.sqrt(x**2 + y**2))
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.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='viridis', edgecolor='none')
曲面三角剖分
上面哪些要求均匀采样的网格数据显得太过严谨,不容易实现,如果没有笛卡尔或极坐标网格的均匀绘图,可以使用三角剖分图形
ax.scatter
绘制三维采样的曲面图
def f(x, y):
return np.sin(np.sqrt(x**2 + y**2))
r = 6*np.random.random(1000)
theta = 2*np.pi*np.random.random(1000)
X = np.ravel(r * np.sin(theta))
Y = np.ravel(r * np.cos(theta))
Z = f(X, Y)
ax.scatter(X, Y, Z, c=Z, cmap='viridis', linewidth=0.5)
这图还有很多地方需要修补,可以由ax.plot_trisurf
函数来完成,它首先找到一组所有点都连接起来的三角形,然后用这三角形创建曲面
def f(x, y):
return np.sin(np.sqrt(x**2 + y**2))
r = 6*np.random.random(1000)
theta = 2*np.pi*np.random.random(1000)
X = np.ravel(r * np.sin(theta))
Y = np.ravel(r * np.cos(theta))
Z = f(X, Y)
ax.plot_trisurf(X, Y, Z, cmap='viridis', edgecolor='none')
可以用该方法画莫比乌斯带
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))
# 用基本参数化方法定义三角剖分
from matplotlib.tri import Triangulation
tri = Triangulation(np.ravel(w), np.ravel(theta))
ax.plot_trisurf(x, y, z, triangles=tri.triangles, cmap='viridis', linewidths=0.2)
ax.set_xlim(-1,1)
ax.set_ylim(-1,1)
ax.set_zlim(-1,1)
边栏推荐
- SlashData开发者工具榜首等你而定!!!
- 最新高频Android面试题目分享,带你一起探究Android事件分发机制
- LocalStorage和SessionStorage
- Solidity 开发环境搭建
- Rpcms method of obtaining articles under the specified classification
- Reflections on "product managers must read: five classic innovative thinking models"
- 蓝桥杯 决赛 异或变换 100分
- 自定义View必备知识,Android研发岗必问30+道高级面试题
- LeetCode 1626. The best team without contradiction
- First in China! Todesk integrates RTC technology into remote desktop, with clearer image quality and smoother operation
猜你喜欢
QT 图片背景色像素处理法
Sator推出Web3遊戲“Satorspace” ,並上線Huobi
skimage学习(1)
MRS离线数据分析:通过Flink作业处理OBS数据
最新阿里P7技术体系,妈妈再也不用担心我找工作了
应用在温度检测仪中的温度传感芯片
直接上干货,100%好评
Master this promotion path and share interview materials
Sator推出Web3游戏“Satorspace” ,并上线Huobi
User defined view essential knowledge, Android R & D post must ask 30+ advanced interview questions
随机推荐
NeRF:DeepFake的最终替代者?
科普达人丨一文弄懂什么是云计算?
Module VI
Skimage learning (1)
typescript ts 基础知识之类型声明
测试用例管理工具推荐
Leetcode brush questions day49
LeetCode 1477. Find two subarrays with sum as the target value and no overlap
防火墙系统崩溃、文件丢失的修复方法,材料成本0元
LeetCode 1654. The minimum number of jumps to get home one question per day
LeetCode 1986. The minimum working time to complete the task is one question per day
skimage学习(2)——RGB转灰度、RGB 转 HSV、直方图匹配
【饭谈】如何设计好一款测试平台?
QT中自定义控件的创建到封装到工具栏过程(一):自定义控件的创建
LeetCode 1186. Delete once to get the sub array maximum and daily question
On Apache Doris Fe processing query SQL source code analysis
How to add aplayer music player in blog
Sator推出Web3游戏“Satorspace” ,并上线Huobi
QT video transmission
LeetCode 1981. 最小化目标值与所选元素的差 每日一题