【以下文章4533字,需要阅读5分钟】
Matplotlib,Plotly,GeoViews,Datashader,Panel,hvPlot和Bokeh…python可视化库琳琅满目,让人眼花缭乱,特别对于初学者,多就是难,这里会把可视化库的关系娓娓道来,带你全面了解可视化库。
![2824b1c1aa9da71e726c9c0240673b34.png](https://i-blog.csdnimg.cn/blog_migrate/b823cafcb672ac1df14433a1f8880336.jpeg)
一文带你了解主流python可视化库
接下来,先用一张总体图概述可视化库之间的关系,随后会根据各种可视化库的支持图形类型,支持数据规模等维度对可视化库具体分析,并展开一一道来,让无论初学者还是架构师都能了解可视化库的各种前世今生的关系,利于掌握和架构自己程序。
![24df26c6536fb1380d0ec973b7ad1bda.png](https://i-blog.csdnimg.cn/blog_migrate/fedf03fb929736984625924b7c314a44.jpeg)
python可视化库大阅兵
在图中,您可以看到几个主要的库组,每个库都有不同的起源,历史和焦点。一个明显可分离的组是用于可视化物理数据的“ SciVis ”库(在图的左下方)。这些工具(VisPy,glumpy,GR,Mayavi,ParaView,VTK和yt)主要基于1992年OpenGL图形标准,提供三维或四维物理过程的图形可视化(3D随时间变化),用于常规或不规则网格化数据。这些库早于HTML5对Web应用程序的支持,通常侧重于工程或科学环境中的高性能桌面GUI应用程序。
其他几乎所有的库都属于“ InfoVis ”,专注于任意空间中信息的可视化,而不一定是三维物理世界。InfoVis库使用打印页面或计算机屏幕的两个维度来使抽象空间可解释,通常使用轴和标签。InfoVis库可以进一步细分为多个子组:
Matplotlib
![d0be070764b386f2d362d06c70a75ae1.png](https://i-blog.csdnimg.cn/blog_migrate/904939ea87dd7b00156449f7d3cfbd6c.jpeg)
Matplotlib
2003年发布的最古老,最受欢迎的InfoVis库之一,具有广泛的2D绘图类型和输出格式。Matplotlib还早于HTML5对丰富的Web应用程序的支持,而是使用桌面GUI工具包(如Qt和GTK)将重点放在静态图像上以及交互式图形上。Matplotlib包含一些3D支持,但比SciVis库提供的限制更多。
基于Matplotlib
多年来,Matplotlib的2D绘图功能构建了各种工具,可以将其用作特定类型数据的渲染引擎,也可以用于特定领域(pandas,NetworkX,Cartopy,yt等),或提供更高级别的API可以简化绘图创建(ggplot,plotnine,HoloViews,GeoViews),或者使用其他类型的绘图(seaborn等)扩展它。
JavaScript
![f0d8095ddc5e5720a068eef30bc3ade1.png](https://i-blog.csdnimg.cn/blog_migrate/7257e28107642f1ef284a6de34ca6239.jpeg)
JavaScript
一旦HTML5在浏览器中实现了丰富的交互性,许多库就开始为网页和Jupyter笔记本提供交互式2D图,使用自定义JS(Bokeh,Toyplot)或主要包装现有的JS库,如D3(Plotly,bqplot)。包装现有的JS可以轻松添加为JS应用创建的图库(就像Plotly一样),而使用自定义JS可以定义更低级的JS基元,这些基元可以在Python中组合成全新的绘图类型(对于Bokeh)。
JSON
![b9b9dda8b83a0581ef3c3836b0113dde.png](https://i-blog.csdnimg.cn/blog_migrate/5c764d812be1359da62dd5b84469ecba.jpeg)
json
由于像D3这样的JavaScript库已经成熟,它们的功能已经在声明性JSON规范(Vega,Vega-Lite)中捕获,因此可以轻松地从任何语言生成JavaScript,现在包括Python(通过Altair和以前通过vincent)。将完整的绘图规范作为可移植JSON提供,允许集成到多种类型的工具中。
WebGL
就像HTML5用于2D JavaScript绘图一样,WebGL标准在浏览器和Jupyter中实现了3D交互性,从而导致基于three.js(pythreejs,ipyvolume),vtk.js(itk-jupyter-widgets)构建的3D浏览器内绘图或者regl(Plotly)。这些基于Web的新3D方法都没有接近桌面SciVis 3D库的广度和深度,但它们确实允许与Jupyter笔记本完全集成,并通过Web轻松共享和远程使用。因此,即使WebGL工具与SciVis工具有一些共同的应用程序,它们也可能与其他InfoVis工具更紧密地联系在一起。
其他
许多其他库,甚至超出了Jake图中列出的库,提供了其他补充功能(例如用于可视化网络的graphviz)。
可视化工具之间的区别
按历史和技术进行的上述细分有助于解释我们如何获得当前丰富的Python viz包,但它也有助于解释为什么各种包之间的用户级功能存在如此重大差异。具体而言,支持的绘图类型,数据大小,用户界面和API类型之间存在重大差异,这使得库的选择不仅仅是个人偏好或方便性,因此了解它们非常重要:
绘图类型
最基本的绘图类型在多个库之间共享,但其他库仅在某些库中可用。考虑到库的数量,绘图类型及其随时间的变化,很难精确地描述每个库中支持的内容,但是如果查看每个库的示例库,通常很清楚重点是什么。
以下简略的分类下:
统计图(散点图,线条,面积,条形图,直方图):
几乎所有InfoVis库都很好地支持,特别是 Seaborn,bqplot,Altair,ggplot2,plotnine的主要功能支持。
图像,常规网格,矩形网格:
得到Bokeh,Datashader,HoloViews,Matplotlib,Plotly以及大多数SciVis库的支持
不规则的二维网格(三角网格):
SciVis库以及Matplotlib,Bokeh,Datashader,HoloViews的良好支持
地理数据:
Matplotlib(有Cartopy),GeoViews,ipyleaflet,Plotly
网络/图表:
NetworkX,Plotly,Bokeh,HoloViews,Datashader
3D(网格,散点等):
SciVis库完全支持,还有Plotly,Matplotlib,HoloViews和ipyvolume的一些支持。
数据规模
每个库的体系结构和基础技术决定了所支持的数据大小,因此该库是否适用于大型图像,电影,多维数组,长时间序列,网格或其他相当大的数据集:
SciVis:通常可以使用编译数据库和本机GUI应用程序处理非常大的网格数据集,千兆字节或更大。
基于Matplotlib:通常可以处理数十万个具有合理性能的点,或者在某些特殊情况下处理更多(例如,取决于后端)。
JSON:由于需要文件大小和文本处理,JSON基于文本的数据编码在没有特殊处理的情况下将基于JSON的规范限制为几千个点到几十万个点。
JavaScript:ipywidgets,Bokeh和Plotly都使用JSON,但使用额外的二进制数据传输机制来增强它,以便它们可以处理数十万到数百万个数据点。
WebGL:使用HTML Canvas的JavaScript库限制为最多数十万个点,以获得良好的性能,但WebGL(通过ipyvolume,Plotly,在某些情况下为Bokeh)允许高达数百万。
服务器端呈现:Datashader或Vaex的外部InfoVis服务器端呈现允许在Web浏览器中提供数十亿,数万亿或更多数据点,方法是将任意大的分布式或核外数据集转换为固定大小的图像以嵌入客户端浏览器。
由于这些类型的库支持的数据大小范围广泛(因此在某种程度上数据类型),需要使用大尺寸的用户需要在一开始就选择合适的库。
用户界面和发布方式
各种库在可以使用图的方式上有很大不同。
静态图像:大多数图书馆现在可以无头操作来创建静态图像,至少在PNG中,通常采用平滑的矢量格式,如SVG或PDF。
原生GUI应用程序:SciVis库以及Matplotlib和Vaex可以创建特定于操作系统的GUI窗口,它提供高性能,支持大型数据集以及与其他桌面应用程序集成,但与特定操作系统绑定,通常需要在本地运行而不是通过网络。在某些情况下,嵌入基于JavaScript的工具也可以通过嵌入Web浏览器嵌入到本机应用程序中。
导出为HTML:大多数JavaScript和JSON库都可以在无服务器模式下运行,生成交互式绘图(缩放,平移等),可以通过电子邮件发送或发布到Web服务器上,而无需Python。
Jupyter笔记本:大多数InfoVis库现在支持Jupyter笔记本中的交互式使用,基于JavaScript的Python支持。基于ipywidgets的项目提供与Jupyter更紧密的集成,而其他一些方法在Jupyter中仅提供有限的交互性(例如,当与Matplotlib而不是Bokeh一起使用时,HoloViews)。
独立的基于Web的仪表板和应用程序:Plotly图表可以在具有Dash的单独可部署应用程序中使用,Bokeh,HoloViews和GeoViews可以使用Bokeh Server进行部署。大多数其他InfoVis库可以使用新的Panel库部署为仪表板,至少包括Matplotlib,Altair,Plotly,Datashader,hvPlot,Seaborn,plotnine和yt。然而,尽管基于Web的交互性,基于ipywidgets的库(ipyleaflet,pythreejs,ipyvolume,bqplot)很难部署为面向公众的应用程序,因为Jupyter协议允许任意代码执行(但请参阅已解散的Jupyter仪表板项目和烧瓶-ipywidgets为潜在的解决方案)。
因此,用户需要考虑给定的库是否将涵盖他们对其可视化所期望的使用范围。
API类型
各种InfoVis库提供了大量的编程接口,适用于不同类型的用户以及创建可视化的不同方式。这些API的不同之处在于执行常见任务需要多少代码,以及它们为用户提供多少控制来处理不常见的任务以及将基元组合成新类型的图:
面向对象的Matplotlib API:Matplotlib的主要API,允许完全控制和组合,但复杂和高度冗长的一些常见任务,如创建子图。
命令式Pyplot API:Matplotlib的基本界面允许使用Matlab风格的命令式命令,这些命令对于简单的情况而言是简明但不是组合的,因此主要限于一组特定的受支持选项。
势在必行的Pandas .plot()API:以数据框为中心,用户将主要在Pandas中准备数据,然后选择一个子集进行绘图。正如将在本系列的下一篇文章中讨论的那样,现在支持广泛的图表库以及其他数据结构,使它们成为广泛支持的基本绘图命令的基本集合。不是直接组合,但可以从底层绘图库返回可组合对象(如hvPlot)。
声明性图形API:图形语法 -灵感库,如ggplot,plotnine,Altair和(在某种程度上)Bokeh提供了一种自然的方式来组合图形基元,如轴和字形,以创建完整的图。
声明性数据API:基于其他库的本机API,HoloViews和GeoViews提供了更高级别的声明和组合API,专注于注释,描述和处理可视化数据,而不是绘图元素。
这些API中的每一个都适合具有不同背景和目标的用户,使一些任务变得简单和简洁,而其他任务则更加困难。除了Matplotlib之外,大多数库都支持一个或最多两个备用API,因此选择一个适合每个用户的技术背景和首选工作流程的库非常重要。
可视化发展趋势
正如您所看到的,Python提供了大量可视化功能,其方法和重点的多样性体现在大量可用的库中。方法之间的差异仍然很重要,并且具有深远的影响,这意味着用户需要在深入应用任何特定方法之前考虑这些差异。老规矩,有问题和资料关注公众号“python_dada"。