当前位置: 首页 > news >正文

《Python数据可视化编程实战》——5.2 创建3D柱状图

本节书摘来自异步社区《Python数据可视化编程实战》一书中的第5章,第5.2节,作者[爱尔兰]Igor Milovanović ,颛青山 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

5.2 创建3D柱状图

虽然matplotlib主要专注于绘图,并且主要是二维的图形,但是它也有一些不同的扩展,能让我们在地理图上绘图,让我们把Excel和3D图表结合起来。在matplotlib的世界里,这些扩展叫做工具包(toolkits)。工具包是一些关注在某个话题(如3D绘图)的特定函数的集合。

比较流行的工具包有Basemap、GTK 工具、Excel工具、Natgrid、AxesGrid和mplot3d。

本节将探索关于mplot3d的更多功能。mpl_toolkits.mplot3工具包提供了一些基本的3D绘图功能,其支持的图表类型包括散点图(scatter)、曲面图(surf)、线图(line)和网格图(mesh)。虽然mplot3d不是一个最好的3D图形绘制库,但是它是伴随着matplotlib产生的,因此我们对其接口已经很熟悉了。

5.2.1 准备工作

基本来讲,我们仍然需要创建一个图表并把想要的坐标轴添加到上面。但不同的是我们为图表指定的是3D视图,并且添加的坐标轴是Axes3D。

现在,我们可以使用几乎相同的函数来绘图了。当然,函数的参数是不同的,需要为3个坐标轴提供数据。

例如,我们要为函数mpl_toolkits.mplot3d.Axes3D.plot指定xs、ys、zs和zdir参数。其他的参数则直接传给matplotlib.axes.Axes.plot。下面来解释一下这些特定的参数。

1.xs和ys:x轴和y轴坐标。

2.zs:这是z轴的坐标值,可以是所有点对应一个值,或者是每个点对应一个值。

3.zdir:决定哪个坐标轴作为z轴的维度(通常是zs,但是也可以是xs或者ys)。

提示模块mpl_toolkits.mplot3d.art3d包含了3D artist代码和将2D artists转化为3D版本的函数。在该模块中有一个rotate_axes方法,该方法可以被添加到Axes3D中来对坐标重新排序,这样坐标轴就与zdir一起旋转了。zdir默认值为z。在坐标轴前加一个'``-``'会进行反转转换,这样一来,zdir的值就可以是x、-x、y、-y、z或者-z。

5.2.2 操作步骤

以下代码演示了我们所解释的概念。

import random

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

from mpl_toolkits.mplot3d import Axes3D

mpl.rcParams['font.size'] = 10

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

for z in [2011, 2012, 2013, 2014]:
     xs = xrange(1,13)
     ys = 1000 * np.random.rand(12)

     color =plt.cm.Set2(random.choice(xrange(plt.cm.Set2.N)))
     ax.bar(xs, ys, zs=z, zdir='y', color=color, alpha=0.8)

ax.xaxis.set_major_locator(mpl.ticker.FixedLocator(xs))
ax.yaxis.set_major_locator(mpl.ticker.FixedLocator(ys))

ax.set_xlabel('Month')
ax.set_ylabel('Year')
ax.set_zlabel('Sales Net [usd]')

plt.show()

上述代码生成如图5-1所示的图表。


screenshot

5.2.3 工作原理

我们需要像在2D世界中那样做相同的准备工作。不同的是,在这里需要指定后端(backend)的种类。然后生成了一些随机数据,例如4年的销售额(2011-2014)。

我们需要为3D坐标轴指定相同的Z值。

从颜色映射集合中随机选择一种颜色,然后把它和每一个Z-order集合的xs、ys对关联起来。最后,用xs、ys对渲染出柱状条序列。

5.2.4 补充说明

其他的一些matplotlib的2D绘图函数在这里也是可以用的,例如scatter()和plot()有着相似的接口,但有额外的点标记大小参数。我们对contour、contourf和bar也非常熟悉。

仅在3D中出现的新图表类型有线框图(wireframe)、曲面图(surface)和三翼面图(tri-surface)。

在下面的示例代码中,我们绘制了著名的Pringle函数的三翼面图,数学专业上的叫法是双曲面抛物线(hyperbolic paraboloid)。

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np

n_angles = 36
n_radii = 8

# An array of radii
# Does not include radius r=0, this is to eliminate duplicate points
radii = np.linspace(0.125, 1.0, n_radii)

# An array of angles
angles = np.linspace(0, 2 * np.pi, n_angles, endpoint=False)

# Repeat all angles for each radius
angles = np.repeat(angles[..., np.newaxis], n_radii, axis=1)

# Convert polar (radii, angles) coords to cartesian (x, y) coords
# (0, 0) is added here. There are no duplicate points in the (x, y)
plane
x = np.append(0, (radii * np.cos(angles)).flatten())
y = np.append(0, (radii * np.sin(angles)).flatten())

# Pringle surface

z = np.sin(-x * y)

fig = plt.figure()
ax = fig.gca(projection='3d')

ax.plot_trisurf(x, y, z, cmap=cm.jet, linewidth=0.2)

plt.show()

上面的代码生成如图5-2所示的图形。


screenshot

相关文章:

  • c#.net中参数修饰符ref,out ,params的区别
  • 《JavaScript设计模式》——9.10 Factory(工厂)模式
  • 以太网帧格式、IP数据报格式、TCP段格式+UDP段格式 详解
  • webgis实现技术分析
  • 《Oracle数据库性能优化方法论和最佳实践》——第3章 流程分析之数据库登录流程 3.1 数据库登录导致业务系统性能恶化案例分享...
  • 《Cisco BGP-4 命令与配置手册》——导读
  • 《Tableau 8权威指南》—— 导读
  • 《Python和Pygame游戏开发指南》——2.8 关于函数、方法、构造函数和模块中的函数(及其差别)的一些提示...
  • DataFormatString 属性语法
  • 《树莓派渗透测试实战》——1.6 树莓派的优点和缺点
  • 在HttpHandlers中使用Session
  • 《机器人爱好者(第3辑)》——导读
  • 《Android 应用案例开发大全(第3版)》——第2章,第2.4节壁纸的实现
  • c#学习网址
  • 《敏捷软件开发:原则、模式与实践(C#版.修订版)》一1.4 参考文献
  • __proto__ 和 prototype的关系
  • 《剑指offer》分解让复杂问题更简单
  • 【Linux系统编程】快速查找errno错误码信息
  • ECMAScript入门(七)--Module语法
  • FineReport中如何实现自动滚屏效果
  • Java应用性能调优
  • k8s 面向应用开发者的基础命令
  • nfs客户端进程变D,延伸linux的lock
  • Python语法速览与机器学习开发环境搭建
  • Xmanager 远程桌面 CentOS 7
  • Zepto.js源码学习之二
  • 初探 Vue 生命周期和钩子函数
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 前端路由实现-history
  • 如何解决微信端直接跳WAP端
  • 实现简单的正则表达式引擎
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • # Java NIO(一)FileChannel
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • (1)(1.13) SiK无线电高级配置(六)
  • (1)SpringCloud 整合Python
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (图)IntelliTrace Tools 跟踪云端程序
  • (一)Linux+Windows下安装ffmpeg
  • (转)EXC_BREAKPOINT僵尸错误
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • ******IT公司面试题汇总+优秀技术博客汇总
  • *Django中的Ajax 纯js的书写样式1
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .net的socket示例
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理