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,一经查实,立即删除!

相关文章

Oulipo (KMP出现次数)

The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter e. He was a member of the Oulipo group. A quote from the book: Tout avait Pair normal, mais tout s’affirmait faux. Tout avait Fair normal, d’abord, puis su…

从夫妻吵架中看项目管理

从夫妻吵架中看项目管理(很有意思的文章) 首先要说明:和老婆吵架无论原因如何,无论结果如何你都是错的,老婆永远是对的。但是我不是神仙,偶尔也要吵架。但是如何让吵架也发挥作用,增进夫妻感情&…

SpringMVC工作原理

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

Android应用开发—如何解决handler的警告:Handler Class Should be Static or Leaks Occur

转自android handler的警告Handler Class Should be Static or Leaks Occur 在使用Handler更新UI的时候,我是这样写的: public class SampleActivity extends Activity {private final Handler mLeakyHandler new Handler() {Overridepublic void hand…

从远程(包括ftp,http等协议)地址获取文件流信息

URL url new URL("ftp://172.18.251.155:8010/recordsImg/2019-01-28/000008_1548649813267.jpg"); MultipartFile multipartFile new MockMultipartFile(fileName,fileName,"", url.openStream());转载于:https://www.cnblogs.com/baihaojie/p/10331134…

shell 数组

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

nodejs 实现文件拷贝

通过4中不通的方式实现对一个文件的拷贝 方式一:readFile 异步一次性读取文件再写入 //异步形式读取文件 function copyFile(url){const extName path.extname(url)const fileName path.basename(url)const dirName path.dirname(url)fs.readFile(url, (err, dat…

国家部委对4G调研:未定给中电信联通发放牌照

一场有关4G牌照发放的论战正在发酵,矛盾的核心在于,除了中移动外,政府是否也会向中电信和联通发放TD-LTE(中国主导的4G标准)牌照 记者 王云辉 雍忠玮 一场围绕4G的新博弈已经白热化。 “多个国家部委正在对4G展开全面调研,但最终如…

Luogu4735 最大异或和

题目蓝链 Description 给你一个序列,你需要支持以下两个操作: A x: 在序列尾部添加一个整数\(x\),序列的长度增加\(1\)Q l r x: 询问操作,你需要找到一个位置\(p \in [l, r]\),使得:\(x \bigoplus a_p \big…

Spring-jdbc:JdbcTemplate使用简介

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

Java多线程编程:变量共享分析(Thread)

Java多线程编程:变量共享分析(Thread) Java 创建线程的两种方法 此处只简单讲下自己对java多线程变量共享的理解: 按照进程和多线程的原理,同一进程内的多个线程之间的地址空间是共享的(除去ThreadLocal&a…

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

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

[WPF]xml序列化以及反序列化数据

代码 XML序列化工具类 public static class XMLHelper{/// <summary>/// 将对象序列化为指定的文件名/// </summary>/// <typeparam name"T"></typeparam>/// <param name"obj"></param>/// <param name"fil…

多线程的那点儿事

1. 多线程的那点儿事&#xff08;基础篇&#xff09; 多线程编程是现代软件技术中很重要的一个环节。要弄懂多线程&#xff0c;这就要牵涉到多进程&#xff1f;当然&#xff0c;要了解到多进程&#xff0c;就要涉及到操作系统。不过大家也不要紧张&#xff0c;听我慢慢道来。…

Android应用开发—AsyncTask

摘录自 Android 多线程—–AsyncTask详解 AsyncTask AsyncTask&#xff1a;异步任务&#xff0c;从字面上来说&#xff0c;就是在我们的UI主线程运行的时候&#xff0c;异步的完成一些操作。AsyncTask允许我们的执行一个异步的任务在后台。我们可以将耗时的操作放在异步任务当…

std::shared_ptr之deleter的巧妙应用

本文由作者邹启文授权网易云社区发布。std::shared_ptr一次创建&#xff0c;多处共享&#xff0c;通过引用计数控制生命周期。 实例 在邮箱大师PC版中&#xff0c;我们在实现搜索时&#xff0c;大致思路是这样的&#xff1a; 每一个账号都有一个SearchFlow&#xff0c;搜索开始…

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

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

Spring之JDBCTemplate

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

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

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