python如何用matplotlib创建三维图表


Posted in Python onJanuary 26, 2021

Matplotlib 最开始被设计为仅支持二维的图表。到 1.0 版本发布左右,一些三维图表的工具在二维展示的基础上被创建了出来,结果就是 Matplotlib 提供了一个方便的(同时也是有限的)的可用于三维数据可视化的一套工具。三维图表可以使用载入mplot3d工具包来激活,这个包会随着 Matplotlib 自动安装:

from mpl_toolkits import mplot3d

一旦模块被导入,三维 axes 就可以像其他普通 axes 一样通过关键字参数projection='3d'来创建:

import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = plt.axes(projection='3d')
plt.show()

python如何用matplotlib创建三维图表

三维 axes 激活后,我们可以在上面绘制不同的三维图表类型。三维图表在 notebook 中使用交互式图表展示会优于使用静态展示;回忆我们前面介绍过,你可以使用%matplotlib notebook而不是%matplotlib inline来激活交互式展示模式。

三维的点和线

三维图表中最基础的是使用(x, y, z)坐标定义的一根线或散点的集合。前面介绍过普通的二维图表,作为类比,使用ax.plot3D和ax.scatter3D函数可以创建三维折线和散点图。这两个函数的签名与二维的版本基本一致,你可以参考[简单折线图]和[简单散点图]来复习一下这部分的内容。下面我们绘制一个三维中的三角螺旋,在线的附近在绘制一些随机的点:

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');

python如何用matplotlib创建三维图表

注意默认情况下,图中的散点会有透明度的区别,用于体现在图中散点的深度。虽然三维效果在静态图像中难以显示,你可以使用交互式的视图来获得更佳的三维直观效果。

三维轮廓图

类似于我们在[密度和轮廓图]中介绍的内容,mplot3d也包含着能够创建三维浮雕图像的工具。就像二维的ax.contour图表,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)
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');

python如何用matplotlib创建三维图表

有时候默认的视角角度不是最理想的,在这种情况下我们可以使用view_init函数来设置水平角和方位角。在下面的例子中,我们使用的是 60° 的水平角(即以 60° 俯视 x-y 平面)和 35° 的方位角(即将 z 轴逆时针旋转 35°):

ax.view_init(60, 35)
fig

python如何用matplotlib创建三维图表

同样,注意到当使用 Matplotlib 交互式展示是,这样的旋转可以通过鼠标点击和拖拽来实现。

框线图和表面图

使用网格数据生成的三维图表还有框线图和表面图。这两种图表将网格数据投射到特定的三维表面,能够使得结果图像非常直观和具有说服力。下面是一个框线图的例子:

fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot_wireframe(X, Y, Z, color='black')
ax.set_title('wireframe');

python如何用matplotlib创建三维图表

表面图类似框线图,区别在于每个框线构成的多边形都使用颜色进行了填充。添加色图用于填充多边形能够让图形表面展示出来:

ax = plt.axes(projection='3d')
ax.plot_surface(X, Y, Z, rstride=1, cstride=1,
        cmap='viridis', edgecolor='none')
ax.set_title('surface');

python如何用matplotlib创建三维图表

注意虽然每个颜色填充的表面都是二维的,但是表面的边缘不需要是直线构成的。下面的例子使用surface3D绘制了一个部分极坐标网格,能够让我们切入到函数内部观察效果:

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');

python如何用matplotlib创建三维图表

表面三角剖分

在一些应用场合中,上面的这种均匀网格绘制的图表方式太过于局限和不方便。在这些情况下,三角剖分的图表可以派上用场。如果我们并不是使用笛卡尔坐标系或极坐标系的网格来绘制三维图表,而是使用一组随机的点来绘制三维图表呢?

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

python如何用matplotlib创建三维图表

上图并未形象的表示出表面情况。这种情况下我们可以使用ax.plot_trisurf函数,它能首先根据我们的数据输入找到各点内在的三角函数形式,然后绘制表面(注意的是这里的 x,y,z 是一维的数组):

ax = plt.axes(projection='3d')
ax.plot_trisurf(x, y, z,
        cmap='viridis', edgecolor='none');

python如何用matplotlib创建三维图表

上图的结果很显然没有使用网格绘制表面图那么清晰,但是对于我们并不是使用函数构建数据样本(数据样本通常来自真实世界的采样)的情况下,这能提供很大的帮助。例如我们下面会看到,能使用这种方法绘制一条三维的莫比乌斯环。

例子:绘制莫比乌斯环

python如何用matplotlib创建三维图表

theta = np.linspace(0, 2 * np.pi, 30)
w = np.linspace(-0.25, 0.25, 8)
w, theta = np.meshgrid(w, theta)

python如何用matplotlib创建三维图表

phi = 0.5 * theta

现在我们已经有了所有需要获得三维坐标值的参数了。我们定义  为每个坐标点距离环形中间的位置,使用它来计算最终(x,y,z)  三维坐标系的坐标值:

# r是坐标点距离环形中心的距离值
r = 1 + w * np.cos(phi)
# 利用简单的三角函数知识算得x,y,z坐标值
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', linewidths=0.2);

ax.set_xlim(-1, 1); ax.set_ylim(-1, 1); ax.set_zlim(-1, 1);

python如何用matplotlib创建三维图表

 结合这些技巧,能够为你提供在 Matplotlib 创建和展现大量三维对象和模式的能力。

以上就是python如何用matplotlib创建三维图表的详细内容,更多关于python用matplotlib创建三维图表的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
sublime text 3配置使用python操作方法
Jun 11 Python
python中使用PIL制作并验证图片验证码
Mar 15 Python
PyCharm代码提示忽略大小写设置方法
Oct 28 Python
Python高级特性与几种函数的讲解
Mar 08 Python
由Python编写的MySQL管理工具代码实例
Apr 09 Python
零基础使用Python读写处理Excel表格的方法
May 02 Python
在Python中COM口的调用方法
Jul 03 Python
Python实现K折交叉验证法的方法步骤
Jul 11 Python
Python中Flask-RESTful编写API接口(小白入门)
Dec 11 Python
Python如何将装饰器定义为类
Jul 30 Python
Pycharm安装Qt Design快捷工具的详细教程
Nov 18 Python
Python 实现绘制子图及子图刻度的变换等问题
May 31 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
Jan 26 #Python
Python数据模型与Python对象模型的相关总结
Jan 26 #Python
使用豆瓣源来安装python中的第三方库方法
Jan 26 #Python
详解用selenium来下载小姐姐图片并保存
Jan 26 #Python
selenium与xpath之获取指定位置的元素的实现
Jan 26 #Python
详解Python中的Lock和Rlock
Jan 26 #Python
5分钟快速掌握Python定时任务框架的实现
Jan 26 #Python
You might like
PHP insert语法详解
2008/06/07 PHP
php ckeditor上传图片文件名乱码解决方法
2013/11/15 PHP
PHP 前加at符合@的作用解析
2015/07/31 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
PHP操作路由器实现方法示例
2019/04/27 PHP
父元素与子iframe相互获取变量和元素对象的具体实现
2013/10/15 Javascript
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
跟我学Nodejs(三)--- Node.js模块
2014/05/25 NodeJs
node.js中的querystring.escape方法使用说明
2014/12/10 Javascript
node.js中的fs.chown方法使用说明
2014/12/16 Javascript
实例代码讲解jquery easyui动态tab页
2015/11/17 Javascript
javascript从定义到执行 你不知道的那些事
2016/01/04 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
JS实现获取自定义属性data值的方法示例
2018/12/19 Javascript
nodejs 使用http进行post或get请求的实例(携带cookie)
2019/01/03 NodeJs
使用element-ui +Vue 解决 table 里包含表单验证的问题
2020/07/17 Javascript
[02:17]《辉夜杯》TRG战队巡礼
2015/10/26 DOTA
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
pygame学习笔记(1):矩形、圆型画图实例
2015/04/15 Python
Django中间件工作流程及写法实例代码
2018/02/06 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
在Python中实现函数重载的示例代码
2019/12/12 Python
如何基于python实现画不同品种的樱花树
2020/01/03 Python
浅谈django 模型类使用save()方法的好处与注意事项
2020/03/28 Python
阿迪达斯意大利在线商店:adidas意大利
2016/09/19 全球购物
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
英国现代家具和照明购物网站:Heal’s
2019/10/30 全球购物
团员学习总结的自我评价范文
2013/10/14 职场文书
监理员的岗位职责
2013/11/13 职场文书
群众路线党课主持词
2014/04/01 职场文书
运动会广播稿200字
2014/10/18 职场文书
2014年信息技术工作总结
2014/12/16 职场文书
2014年机关工会工作总结
2014/12/19 职场文书
离婚案件上诉状
2015/05/23 职场文书
全陪导游词开场白
2015/05/29 职场文书