Python数据可视化2018:数据可视化库为什么这么多?

本文最初发布于Anaconda开发者博客,经原作者授权由InfoQ中文站翻译并分享。

在奥斯汀举行的SciPy 2018年特别会议上,大量开源Python可视化工具的代表分享了他们对Python数据可视化未来的展望。我们看到了Matplotlib、Plotly、VisPy等许多库的更新。我作为PyViz、GeoViews、Datashader、Panel、hvPlot和Bokeh的代表参加了SciPy 2018大会,我在Anaconda的同事Jean-Luc Stevens则代表HoloViews参加。本文介绍了当前可用的软件包以及它们之间的关系。

当前生态

作为背景介绍,我先展示Jake VanderPlas的概览图,其中有许多不同而又相互关联的Python可视化库:

\"image\"

从中可以看到,这些库主要可以分成几组,每个组都有不同的起源、历史和关注点。显然,可视化物理位置数据的“SciVis”库(在图左下方)可以单独分成一组。这些工具(VisPy、glumpy、GR、Mayavi、ParaView、VTK和yt)主要是基于1992年OpenGL图形标准构建的,为规则或不规则网格数据提供了三维或四维(3D加上时间维度)物理过程图形密集可视化。这些库对富Web应用程序的支持早于HTML5,通常侧重于工程或科学环境中的高性能桌面GUI应用程序。

其他库几乎都属于“InfoVis”组,侧重于空间的信息可视化,而不一定是三维的物理世界。InfoVis库使用打印页面或计算机屏幕的两个维度来解释抽象空间,通常使用轴和标签。InfoVis库可以进一步细分为许多子组。

Matplotlib

2003年发布的最古老也最受流行的InfoVis库之一,具有非常广泛的2D绘图类型和输出格式。Matplotlib对富Web应用程序的支持也早于HTML5,而其侧重点放在了静态图像和使用桌面GUI工具包(如Qt和GTK)的交互式图形上。Matplotlib提供了一些3D支持,但比SciVis库提供的支持要有限得多。

基于Matplotlib的库

多年来,许多工具都是基于Matplotlib的2D绘图功能构建的,要么将它作为某类数据或某一领域(pandas、NetworkX、Cartopy、yt等)的渲染引擎,要么提供一个更高级的API来简化图形绘制(ggplot、plotnine、HoloViews、GeoViews等),要么添加了额外的图形类型(seaborn等)。

JavaScript

在HTML5为浏览器带来丰富的交互性之后,许多库就开始为网页和Jupyter Notebook提供交互式2D绘图,要么使用定制的JS(Bokeh、Toyplot) ,要么像D3一样以封装现有的JS库为主(Plotly、bqplot)。通过封装现有的JS库,很容易在巨大的JS市场引入新的图形,而使用自定义JS则允许定义较底层的JS原语,这些原语可以在Python中组合成全新的图形类型(如Bokeh)。

JSON

随着D3这样的JavaScript库日趋成熟,它们的功能已经被纳入声明性JSON规范(Vega、Vega-Lite),使得适用任何语言生成JavaScript图形变得更简单,现在也包括了Python(通过Altair,之前是通过vincent)。具有可移植JSON形式的完整绘图规范允许跨多种工具进行集成。

WebGL

就像HTML5对JavaScript 2D绘图所做的那样,WebGL标准为浏览器3D交互和Jupyter带来了可能性,这导致了基于three.js(pythreejs、ipyvolume) 、vtk.js(itk-jupyter-widgets) 或regl (Plotly)的浏览器3D绘图。这些新的基于Web的3D方法没有一种能够达到桌面库SciVis 3D的广度和深度,但是,它们确实可以与Jupyter Notebook完全集成,并且可以通过Web进行共享和远程使用。因此,尽管WebGL工具与SciVis工具有一些共同的应用,但它们与其他InfoVis工具的关系更为紧密。

其他

还有其他很多库,尽管没有出现在Jake的图中,但它们确实提供了其他补充功能(例如graphviz用于可视化网络)。

不同可视化工具的差异化特质

以上基于历史和技术的分类有助于解释我们当前为什么有大量Python可视化程序包,同时,它也有助于解释为什么不同包之间在用户功能方面存在着如此大的差异。具体来说,它们的主要差别在于支持的绘图类型、数据规模、用户界面和API类型,因此在选择库时不能只是出于个人喜好或便利性,而是需要考虑到以下一些因素。

绘图类型

最基本的绘图类型许多库都有,但其他的绘图类型只有某些库会提供。考虑到库的数量、绘图类型及它们在随时间变化,很难精确地描述每个库都支持什么。但是,如果你看一下每个库的示例,通常就可以弄清楚它们各自的侧重点是什么。下面是一个粗略的指南:

  • 统计绘图(散点图、线、区域、条形图、直方图):几乎所有的InfoVis库都可以很好地覆盖这些图形,但Seaborn、bqplot、Altair、ggplot2、plotnine会比较侧重这些;
  • 图像、规则网格、矩形网格:Bokeh、Datashader、HoloViews、Matplotlib、Plotly及大多数SciVis库都提供了很好的支持;
  • 不规格2D网格(三角网格):SciVis库以及Matplotlib、Bokeh、Datashader、HoloViews提供了很好的支持;
  • 地理数据:Matplotlib(和Cartopy一起)、GeoViews、ipyleaflet、Plotly;
  • 网络/图:NetworkX、Plotly、Bokeh、HoloViews、Datashader;
  • 3D(网格、散点等):SciVis库完全支持,Plotly、Matplotlib、HoloViews和ipyvolume部分支持。

数据规模

每个库的架构和底层技术决定了它们所支持的数据规模,这样就可以知道该库是否适用于大图片、电影、多维数组、长时间序列、网格或其他大型数据集:

  • SciVis:通常可以处理非常大的网格数据集,GB级别或更大,它使用编译过的“数据库(data libraries)”和原生GUI应用程序;
  • 基于Matplotlib:通常可以处理几十万个点,并提供合理的性能,在某些特殊情况下可以处理更多的点;
  • JSON:如果没有特殊处理,基于JSON文本的数据编码会将基于JSON的规范限制在几千个点到几十万个点之间,这取决于文件大小和所需的文本处理;
  • JavaScript:ipywidgets、Bokeh和Plotly都使用JSON,但增加了额外的二进制数据传输机制,以便能够处理数十万到数百万个数据点;
  • WebGL:为了获得良好的性能,使用HTML Canvas的JavaScript库限制在最多几十万个点,但是WebGL(通过ipyvolume、Plotly或Bokeh)最多支持数百万个点;
  • 服务器端渲染:来自Datashader或Vaex的外部InfoVis服务器端渲染支持数十亿、数万亿或更多数据点进入Web浏览器,通过将任意大小的分布式数据集或非核心数据集转换为固定大小的图像嵌入到客户端浏览器中。

由于这些类型的库所支持的数据规模(在某种程度上可以说是数据类型)范围很大,因此,需要使用大型数据集的用户首先需要选择合适的库。

用户界面和发布

各种类型的库在图形的使用方式方面存在巨大差异。

  • 静态图像:大多数库现在支持通过“headless”的方式来创建静态图像,至少对于PNG和平滑矢量格式(如SVG或PDF)来说是这样的。
  • 原生GUI应用程序:SciVis库加上Matplotlib和Vaex可以创建特定于操作系统的GUI窗口,这些窗口提供了很高的性能,支持大型数据集,并与其他桌面应用程序集成。但是,它们与特定的操作系统绑定在一起,通常需要在本地运行,而不是在Web上。在某些情况下,基于JavaScript的工具也可以通过嵌入Web浏览器嵌入到本地应用程序中。
  • 导出到HTML:大多数JavaScript和JSON库都可以在无服务器模式下运行,生成交互式图形(缩放、平移等),可以通过电子邮件或在Web服务器上发布,而不需要依赖Python。
  • Jupyter Notebook:大多数InfoVis库现在都支持Jupyter Notebook交互式应用,借助Python提供的基于JavaScript的绘图。基于ipywidgets的项目提供了与Jupyter更紧密的集成,而其他一些方法只提供了有限的Jupyter交互性。
  • 基于Web的仪表盘和应用程序:借助Dash,Plotly图形可以用于单独部署的应用程序,Bokeh、HoloViews和GeoViews可以使用Bokeh服务器部署。大多数其他InfoVis库可以使用新的Panel库部署成仪表盘,比如Matplotlib、Altair、Plotly、Datashader、hvPlot、Seaborn、plotnine和yt。然而,尽管它们提供了基于Web的交互性,但基于ipywidgets的库(ipyleaflet、pythreejs、ipyvolume、bqplot)很难部署成面向公众的应用程序,因为Jupyter协议允许执行任意代码(请参考Jupyter仪表盘和flask-ipywidgets,它们或许可以作为潜在的解决方案)。

因此,用户需要考虑给定的库是否涵盖了他们对可视化的预期使用范围。

API类型

各种InfoVis库提供了大量的编程接口,适用于各种差别很大的用户,并提供了不同创建可视化的方式。在执行普通任务所需的代码量、为用户处理不常见任务提供多大的控制自由度以及将原语组合成新类型图形方面,这些API存在巨大的差别。

  • 面向对象的Matplotlib API:Matplotlib的主要API,允许完全控制和组合,但对于一些常见的任务,如创建子图,则非常复杂和繁琐。
  • 命令式Pyplot API:Matplotlib的基本接口,允许使用Matplotlib风格的命令式命令,对于比较简单的情况,这些命令很简洁,但不可组合。因此,它们在很大程度上仅限于一组特定的支持选项。
  • 命令式Pandas .plot() API:以dataframe为中心,用户将主要通过Pandas来准备数据,然后选择一个子集进行绘图。它们现在支持各种图形库及其他数据结构。不是直接组合,但可以从底层绘图库(如hvPlot)返回可组合的对象。
  • 声明式图形API:受“图形语法( Grammar of Graphics)”启发的库(如ggplot、plotnine、Altair)和Bokeh提供了一种自然的方式来组合图形原语(如坐标轴和符号),用来创建完整的图形。
  • 声明式数据API:构建在其他库的原生API的基础上,HoloViews和GeoViews提供了一个更高级的声明式复合API,主要关注注解、描述和使用可视化数据,而不是绘图元素。

这些API都适用于具有不同背景和目标的用户,这使得处理一些任务变得更简单,而另一些任务则变得更加困难。除了Matplotlib之外,大多数库都支持一种或至多两种备选API。因此,选择一个符合每个用户技术背景和首选工作流的库显得非常重要。

最新趋势

如你所见,Python有大量的可视化功能库,大量可用的库反映出了方法和侧重点的多样性。方法之间的差异仍然很重要,并且具有深远的影响,这意味着用户在特定的方法上大幅投入之前需要考虑这些差异。但是,正如我们在SciPy 2018上看到的那样,趋同趋势降低了用户选择的关键性。

查看英文原文:https://www.anaconda.com/blog/developer-blog/python-data-visualization-2018-why-so-many-libraries

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC工作原理

大家好,我是IT修真院深圳分院第十一期学员,一枚正直纯洁善良的JAVA程序员。 今天给大家分享一下,修真院官网JAVA任务二的一个知识点:SpringMVC工作原理 1、背景介绍 一:背景介绍 JavaWeb经历的几个变化: 1:…

shell 数组

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 1)定义数组: my_array(1 2 3 4) 也可这样赋值:my_array[4]爱 读取: echo ${my_array[2]…

Spring-jdbc:JdbcTemplate使用简介

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 为了使 JDBC 更加易于使用,Spring 在 JDBCAPI 上定义了一个抽象层, 以此建立一个JDBC存取框架. 作为 SpringJDBC 框架的核心, JDBC 模板…

嘉益仕(Litns)带您读懂MES系统:选型篇

自从智能制造概念提出以来,制造执行系统MES在国内掀起了新一波的热潮。众多企业在技术发展、政策导向和自身需要的推动下,纷纷上马MES请添加链接描述项目。 由此也带动了MES软件开发企业的快速发展。一夜之间MES软件开发企业遍地开花,MES产品…

js - 执行上下文和作用域以及闭包

首先,咱们通常被"执行上下文","执行上下文环境","上下文环境","执行上下文栈"这些名词搞混。那我们一一来揭秘这些名字的含义。 这一块一直比较晦涩难懂,还是需要仔细去斟酌斟…

Spring之JDBCTemplate

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 一、Spring对不同的持久化支持: Spring为各种支持的持久化技术,都提供了简单操作的模板和回调 ORM持久化技术模…

从蚂蚁金服实践入手,带你深入了解 Service Mesh

本文整理自蚂蚁金服高级技术专家敖小剑在 QCon 上海 2018 上的演讲。我是来自蚂蚁金服中间件团队的敖小剑,目前是蚂蚁金服 Service Mesh 项目的 PD。我同时也是 Servicemesher 中国技术社区的创始人,是 Service Mesh 技术在国内最早的布道师。我今天给大…

线程组之间的JMeter传递变量

下面,我们将看看如何在线程组之间共享和传递变量。在开发高级JMeter脚本时,很可能您将拥有多个线程组。每个线程组将执行不同的请求。一个很好的例子是我们需要使用Bearer Tokens对用户进行身份验证。一个线程组执行身份验证并保存令牌。另一个线程组需要…

python第九天(9-33)

一:进程 进程概念 进程就是一个程序运行在一个数据集上的一次动态执行过程进程一般由程序,数据集,进程控制块组成进程控制块: 进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控…

Python 数据类型--Bytes类型

一、Bytes类型 在Python3以后,字符串和bytes类型彻底分开了。字符串是以字符为单位进行处理的,bytes类型是以字节为单位处理的。 bytes数据类型在所有的操作和使用甚至内置方法上和字符串数据类型基本一样,也是不可变的序列对象。 bytes对象只…

文件结构

C语言文件名命名的规则 1、文件标识符分为两部分,即文件名前缀和后缀。文件名前缀的最前面要使用范围限定符——模块名(文件名)缩写。 2、采用小写字母命名文件,避免使用一些比较通俗的文件名,如:publi…

POJ 1187 陨石的秘密 (线性DP)

题意: 公元11380年,一颗巨大的陨石坠落在南极。于是,灾难降临了,地球上出现了一系列反常的现象。当人们焦急万分的时候,一支中国科学家组成的南极考察队赶到了出事地点。经过一番侦察,科学家们发现陨石上刻…

bzoj2561 最小生成树

题意:给你无向图,给定一条边,求至少在原图中删去多少边才能使它同时在某个最大生成树和某个最小生成树中。 解: 假装我们把边排序了,然后把所有边权小于给定边的边都加进去了。 那么我们要删的就是s到t的一个割。 最大…

robotframework基础学习(8)

变量的使用 在 Edit 标签页中主要分:加载外部文件、定义内部变量、定义元数据等三个部分。 (1):加载外部文件Add Library:加载测试库,主要是[PYTHON 目录]\Lib\site-packages 里的测试库 Add Resource&…

[蓝桥杯]ALGO-188.算法训练_P0504

Anagrams指的是具有如下特性的两个单词:在这两个单词当中,每一个英文字母(不区分大小写)所出现的次数都是相同的。例如,Unclear和Nuclear、Rimon和MinOR都是Anagrams。编写一个程序,输入两个单词&#xff0…

beta第二天

团队成员 郑西坤 031602542 (队长) 陈俊杰 031602504陈顺兴 031602505张胜男 031602540廖钰萍 031602323雷光游 031602319吴志鸿 0316206341.昨天的困难 陈顺兴:无 廖钰萍:无 吴志鸿:没有 雷光游:无 郑西坤…

C语言符号

C语言运算符的优先级 一、运算符的优先级表 C 语言的符号众多,由这些符号又组合成了各种各样的运算符。既然是运算符就一定有其特定的优先级,下表就是C 语言运算符的优先级表: 注:同一优先级的运算符,运算次序由结合…

burp过期了,换一个

先从吾爱破解论坛下载工具:https://down.52pojie.cn/Tools/Network_Analyzer/Burp_Suite_Pro_v1.7.37_Loader_Keygen.zip 工具运行需要Java环境,请自行安装,此处不赘述。解压完后双击keygen 填一下License Text(随意),然后点击Run…

hbase 概念

在hbase里面有几个通俗的名称会经常出现 1)Hregion region 2)Hregionserver regionserver 3)Hmaster master 4)Hmamstore memstore 5)Hfile storeFile 1、什么是hbase? 1)它是基于稀疏的、…

beta冲刺第三天

团队成员 郑西坤 031602542 (队长) 陈俊杰 031602504陈顺兴 031602505张胜男 031602540廖钰萍 031602323雷光游 031602319吴志鸿 0316206341.昨天的困难 陈顺兴:理解别人的代码 廖钰萍: 吴志鸿:无 雷光游: …