作者:潮汐

来源:Python技术

欢迎来到编程教室~

我们之前的文章中有讲解过不少 Matplotlib 的用法,比如:

  • 完成这50个Matplotlib代码,你也能画出优秀的图表

  • 25个常用Matplotlib图的Python代码,收藏了!

之前我们基本都是用它来绘制二维的数据图表。而今天文章中,我们将教大家如何用不到 30 行代码绘制 Matplotlib 3D 图形。

回顾 2D 作图

用赛贝尔曲线作 2d 图。此图是用基于 Matplotlib 的 Path 通过赛贝尔曲线实现的,有对赛贝尔曲线感兴趣的朋友们可以深入了解一下。在 matplotlib 中,figure 为画布,axes 为绘图区,fig.add_subplot()、plt.subplot() 方法均可以创建子图。以下是作图实践。

import matplotlib.path as mpathimport matplotlib.patches as mpatchesimport matplotlib.pyplot as plt

fig, ax = plt.subplots()#定义绘图指令与控制点坐标Path = mpath.Path# Path 控制坐标点绘制贝塞尔曲线# 图形数据构造

# MOVETO表示将绘制起点移动到指定坐标# CURVE4表示使用4个控制点绘制3次贝塞尔曲线# CURVE3表示使用3个控制点绘制2次贝塞尔曲线# LINETO表示从当前位置绘制直线到指定位置# CLOSEPOLY表示从当前位置绘制直线到指定位置,并闭合多边形path_data = [    (Path.MOVETO, (1.88, -2.57)),    (Path.CURVE4, (0.35, -1.1)),    (Path.CURVE4, (-1.75, 1.5)),    (Path.CURVE4, (0.375, 2.0)),    (Path.LINETO, (0.85, 1.15)),    (Path.CURVE4, (2.2, 3.2)),    (Path.CURVE4, (3, 0.05)),    (Path.CURVE4, (2.0, -1.5)),    (Path.CLOSEPOLY, (1.58, -2.57)),    ]codes,verts = zip(*path_data)path = mpath.Path(verts, codes)patch = mpatches.PathPatch(path, facecolor='r', alpha=0.5)ax.add_patch(patch)# plot control points and connecting linesx, y = zip(*path.vertices)line, = ax.plot(x, y, 'go-')ax.grid()ax.axis('equal')plt.show()

心型效果图

3D 帽子图1

Matplotlib 绘制 3D 图形使用的是 mplot3d Toolkit,即 mplot3d 工具包。绘制 3D 图可以通过创建子图,然后指定 projection 参数 为 3d 即可,返回的 ax 为 Axes3D 对象。

导入包:

from matplotlib import cmfrom matplotlib.ticker import LinearLocator, FormatStrFormatterfrom mpl_toolkits.mplot3d import Axes3D

绘图全过程:

import matplotlib.pyplot as pltfrom matplotlib import cmfrom matplotlib.ticker import LinearLocator, FormatStrFormatterfrom mpl_toolkits.mplot3d import Axes3Dimport numpy as np

fig = plt.figure()

# 指定图形类型是 3d 类型ax = fig.add_subplot(projection='3d')

# 构造数据X = np.arange(-5, 5, 0.25)Y = np.arange(-5, 5, 0.25)X, Y = np.meshgrid(X, Y)R = np.sqrt(X**2 + Y**2)Z = np.sin(R)

# Plot the surface.surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm,                       linewidth=0, antialiased=False)# Customize the z axis.ax.set_zlim(-1.01, 1.01)ax.zaxis.set_major_locator(LinearLocator(10))ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))# Add a color bar which maps values to colors.fig.colorbar(surf, shrink=0.5, aspect=5)

plt.show()

呈现效果:

帽子图1

3D 帽子图2

import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()# 指定图形类型为 3d 类型ax = fig.add_subplot(111, projection='3d')# X, Y valueX = np.arange(-5, 5, 0.25)Y = np.arange(-5, 5, 0.25)

# 设置 x-y 平面的网格X, Y = np.meshgrid(X, Y)R = np.sqrt(X ** 2 + Y ** 2)# height valueZ = np.sin(R)

# rstride:行之间的跨度  cstride:列之间的跨度# rcount:设置间隔个数,默认50个,ccount:列的间隔个数  不能与上面两个参数同时出现#vmax和vmin  颜色的最大值和最小值ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))

# zdir : 'z' | 'x' | 'y' 表示把等高线图投射到哪个面# offset : 表示等高线图投射到指定页面的某个刻度ax.contourf(X,Y,Z,zdir='z',offset=-2)

# 设置图像z轴的显示范围,x、y轴设置方式相同ax.set_zlim(-2,2)

plt.show()

帽子图2

3D 线性图

3D 线性图使用 Axes3D.plot来绘制。绘画的基本方法:Axes3D.plot(xs, ys[, zs, zdir='z', *args, **kwargs])

参数说明:

参数 描述
xs 一维数组,点的 x 轴坐标
ys 一维数组,点的 y 轴坐标
zs 一维数组,可选项,点的 z 轴坐标
zdir 可选项,在 3D 轴上绘制 2D 数据时,数据必须以 xs,ys 的形式传递,若此时将 zdir 设置为 ‘y’,数据将会被绘制到 x-z 轴平面上,默认为 ‘z’
**kwargs 其他关键字参数,可选项,可参见 matplotlib.axes.Axes.plot
import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D

# 依次获取画布和绘图区并创建 Axes3D 对象fig = plt.figure()ax = fig.gca(projection='3d')

# 第一条3D线性图数据theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)z1 = np.linspace(-2, 2, 100)r = z1**2 + 1x1 = r * np.sin(theta)y1 = r * np.cos(theta)

# 第二条3D线性图数据z2 = np.linspace(-3, 3, 100)x2 = np.sin(z2)y2 = np.cos(z2)

# 绘制3D线性图ax.plot(x1, y1, z1, color='b', label='3D Line1')ax.plot(x2, y2, z2, color='r', label='3D Line2')

# 设置标题、轴标签、图例,也可以直接使用 plt.title、plt.xlabel、plt.legend...ax.set_title('3D Line View', pad=15, fontsize='10')ax.set_xlabel('x ', color='r', fontsize='14')ax.set_ylabel('y ', color='g', fontsize='14')ax.set_zlabel('z ', color='b', fontsize='14')ax.legend()plt.show()

结果显示:

线性图

3D 散点图

绘制 3D 散点图的基本方法是:Axes3D.scatter(xs, ys[, zs=0, zdir='z', s=20, c=None, depthshade=True, *args, **kwargs])

参数详解:

参数 描述
xs 一维数组,点的 x 轴坐标
ys 一维数组,点的 y 轴坐标
zs 一维数组,可选项,点的 z 轴坐标
zdir 可选项,在 3D 轴上绘制 2D 数据时,数据必须以 xs,ys 的形式传递,若此时将 zdir 设置为 ‘y’,数据将会被绘制到 x-z 轴平面上,默认为 ‘z’
s 标量或数组类型,可选项,标记的大小,默认 20
c 标记的颜色,可选项,可以是单个颜色或者一个颜色列表支持英文颜色名称及其简写、十六进制颜色码等,更多颜色示例参见官网 Color Demo
depthshade bool 值,可选项,默认 True,是否为散点标记着色以提供深度外观
**kwargs 其他关键字
import matplotlib.pyplot as pltimport numpy as npfrom mpl_toolkits.mplot3d import Axes3D

def randrange(n, vmin, vmax):

    return (vmax - vmin) * np.random.rand(n) + vmin

fig = plt.figure()ax = fig.add_subplot(111, projection='3d')

n = 100

# For each set of style and range settings, plot n random points in the box# defined by x in [23, 32], y in [0, 100], z in [zlow, zhigh].for c, m, zlow, zhigh in [('r', 'o', -50, -25), ('b', '^', -30, -5)]:    xs = randrange(n, 23, 32)    ys = randrange(n, 0, 100)    zs = randrange(n, zlow, zhigh)    ax.scatter(xs, ys, zs, c=c, marker=m)

ax.set_title('3D Diagram View', pad=15, fontsize='10')ax.set_xlabel('x ', color='r', fontsize='14')ax.set_ylabel('y ', color='g', fontsize='14')ax.set_zlabel('z ', color='b', fontsize='14')

plt.show()

结果显示为:

散点图

总结

本文主要是介绍使用 Python 第三方库 Matplotlib 来绘制 3D 图形,当然除了上面演示的这几种,还有更多丰富的图形和功能等待你去挖掘。相比于 2D 图形,3D 图形可以多展现一个维度的数据特征,在可视化时会有更加直观的效果。在实际的数据可视化过程中,我们要根据具体需求来决定用怎样的形式来展现,而多了解一些工具就可以更加游刃有余。这些强大的工具也正是 Python 在数据分析和可视化方面的一大优势之一。

本文相关代码下载地址:

https://github.com/JustDoPython/python-examples/tree/master/chaoxi/Matplotlib_3D


_往期文章推荐_

150年前,他对拿破仑做数据可视化


plot参数详解python_30行Python代码实现3D数据可视化相关推荐

  1. 30行python代码设计_30行Python代码实现3D数据可视化

    原标题:30行Python代码实现3D数据可视化 作者:潮汐 来源:Python技术 欢迎来到 编程教室~ 我们之前的文章中有讲解过不少 Matplotlib 的用法,比如: 之前我们基本都是用它来绘 ...

  2. pandas to_csv参数详解_【Python基础】Pandas数据可视化原来也这么厉害

    一.可视化概述 在Python中,常见的数据可视化库有3个: matplotlib:最常用的库,可以算作可视化的必备技能库,比较底层,api多,学起来不太容易. seaborn:是建构于matplot ...

  3. 详解200行Python代码实现控制台版2048【总有一款坑适合你】【超详细】

    跟着实验楼学习了2048的Python实现,先丢个地址 200行Python代码实现2048 我接触Python时间不长,只了解一些基本的语法和容器,在学习的过程中遇到不少问题,这里做一个记录. cu ...

  4. matplotlib.pyplot.plot()参数详解、线形图、条形图、散点图、饼状图、画布大小、位置、颜色、标题、图例、坐标轴刻度设置 实例详解

    文章目录 matplotlib.pyplot.plot()绘图文档 1. plot函数的一般的调用形式: 2. 参数fmt,以及一些常用参数举例 3.一些图形的绘制 1.线形图plt 2. 柱形图/条 ...

  5. 关于康托展开和逆康托展开详解,及python代码

    在LeetCode上有这样一道题: 60. 第k个排列 给出集合 [1,2,3,-,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: ...

  6. 数字水印技术:LSB加密详解(附python代码)

    概要 数字水印是一种将标识信息嵌入到载体当中,且不影响载体使用的一种技术,主要分为时域水印嵌入算法(将水印嵌入到时域采样数据中)和变换域水印嵌入算法(先对音频做变换,将水印嵌入到变换域系数中).本文主 ...

  7. 有人说Python是青铜?我用50行Python代码绘制3D机场分布图

    绘制一款的3D图形,不仅可以直观的展示数据分析的结果,也更方便数据化运营,同时也让工作成果更容易被大众理解.本文就基于python绘制一款基础的3D地图,用于直观展示全国机场的分布情况,以及该机场出发 ...

  8. python画50个图-有人说Python是青铜?我用50行Python代码绘制3D机场分布图

    绘制一款的3D图形,不仅可以直观的展示数据分析的结果,也更方便数据化运营,同时也让工作成果更容易被大众理解.本文就基于python绘制一款基础的3D地图,用于直观展示全国机场的分布情况,以及该机场出发 ...

  9. 50 行 Python 代码制作一个数据大屏

    今天给大家分享一个制作数据大屏的工具,非常的好用,100行左右的Python代码就可以制作出来一个完整的数据大屏,并且代码的逻辑非常容易理解. PywebIO介绍 Python当中的PywebIO模块 ...

最新文章

  1. JS字符串的下划线命名和驼峰命名转换
  2. 【转】推荐计算机科学类的经典书籍 3
  3. mysql providername,c#访问各数据库的providerName各驱动
  4. 单例模式懒汉式(线程安全写法)
  5. java short后缀_自学java的新手问个问题,为什么写个代码中的int能自动转
  6. mysql vfp_用 VFP 连接 MYSQL 数据库
  7. MySQL 查询数据
  8. windows上的一些命令和工具
  9. 大数据平台设计哲学的重构
  10. 金融数据安全分类分级解决方案
  11. 更新显卡驱动后,Windows重启卡在Logo页面
  12. INDEX函数,隔行提取数据
  13. lucene 学习笔记之飞龙在天
  14. php 分表帝国,帝国cms附表如何分表
  15. 周口女子职专计算机分为哪些专业,周口女子职业中专学校
  16. CSS颜色属性、文本文字属性、属性继承
  17. Kinect for Windows SDK v2.0 开发笔记 (十三) 高清面部帧(4) 面部模型构建器
  18. iPhone销量下降,这两种方法可以把Android和iPhone手机投屏到电脑上!
  19. 金大侠的亲属与剑桥大学最厉害的三个学院
  20. axure7.0下载安装教程

热门文章

  1. 机器学习实践中的10个小秘诀!
  2. BF法-字符模式匹配
  3. 正则表达式re模块使用介绍
  4. 汇编语言学习-寄存器(CPU工作原理)
  5. 2011-2012年《软件工程》本科期末试卷
  6. ACMNO.22 C语言-公约公倍2 写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。 输入 两个数 输出 最大公约数 最小公倍数
  7. 什么??听说Python要凉!
  8. 【学术相关】什么是核心期刊?国家级期刊、省级期刊、国际级期刊又是啥?...
  9. 大数据背后的神秘定理:贝叶斯公式
  10. 如何用 OpenCV、Python 和深度学习实现面部识别?