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 相关文章推荐
使用 Python 实现微信公众号粉丝迁移流程
Jan 03 Python
用十张图详解TensorFlow数据读取机制(附代码)
Feb 06 Python
python smtplib模块自动收发邮件功能(二)
May 22 Python
tensorflow 获取变量&打印权值的实例讲解
Jun 14 Python
Windows下python3.6.4安装教程
Jul 31 Python
python 执行文件时额外参数获取的实例
Dec 18 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
Nov 11 Python
Python中格式化字符串的四种实现
May 26 Python
Python3爬虫关于识别检验滑动验证码的实例
Jul 30 Python
Python 在 VSCode 中使用 IPython Kernel 的方法详解
Sep 05 Python
PyCharm上安装Package的实现(以pandas为例)
Sep 18 Python
python pyg2plot的原理知识点总结
Feb 28 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 ctype函数中文翻译和示例
2014/03/21 PHP
php防止伪造数据从地址栏URL提交的方法
2014/08/24 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
2018/07/21 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
2019/07/26 PHP
微信小程序发送订阅消息的方法(php 为例)
2019/10/30 PHP
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
2009/07/14 Javascript
document.createElement()用法及注意事项(ff下不兼容)
2013/03/13 Javascript
JavaScript图片放大技术(放大镜)实现代码分享
2013/11/14 Javascript
js数组方法扩展实现数组统计函数
2014/04/09 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
2016/06/07 Javascript
大型JavaScript应用程序架构设计模式
2016/06/29 Javascript
JavaScript ES2019中的8个新特性详解
2019/02/20 Javascript
NodeJs之word文件生成与解析的实现代码
2019/04/01 NodeJs
html+vue.js 实现漂亮分页功能可兼容IE
2020/11/07 Javascript
pyqt4教程之实现半透明的天气预报界面示例
2014/03/02 Python
结合Python的SimpleHTTPServer源码来解析socket通信
2016/06/27 Python
Python的collections模块中namedtuple结构使用示例
2016/07/07 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
解决pycharm界面不能显示中文的问题
2018/05/23 Python
详解python之heapq模块及排序操作
2019/04/04 Python
python global关键字的用法详解
2019/09/05 Python
Python模块/包/库安装的六种方法及区别
2020/02/24 Python
CSS3实现莲花绽放的动画效果
2020/11/06 HTML / CSS
HTML5是什么 HTML5是什么意思 HTML5简介
2012/10/26 HTML / CSS
Java中compareTo和compare的区别
2016/04/12 面试题
护理专业的自荐信
2013/10/22 职场文书
机关会计岗位职责
2014/04/08 职场文书
出国留学计划书
2014/04/27 职场文书
文秘专业应届生求职信
2014/05/26 职场文书
多媒体编辑专业毕业生求职信
2014/06/13 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书
2015新学期家长寄语
2015/02/26 职场文书
建房合同协议书
2016/03/21 职场文书
建国70周年的心得体会(2篇)
2019/09/20 职场文书
浅谈Python基础之列表那些事儿
2021/05/11 Python
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle