js 处理十万条数据_Python数据可视化2018:为什么这么多的库?
在奧斯汀舉行的SciPy2018特別會議上,許多開源Python可視化工具的代表分享了他們對于Python數(shù)據(jù)可視化未來發(fā)展的不同觀點。我們聽到了關于Matplotlib,Plotly以及VisPy等的更新。我作為PyViz,GeoViews,Datashader,Panel,hvPlot和Boken的代表參加了SciPy2018特別會議,我Anaconda的同事Jean-Luc Stevens 代表HoloViews參加了該會議。本文調(diào)查了當前可用的軟件包并展示了他們之間的聯(lián)系方式,后續(xù)的文章將會討論近年來這些工具如何發(fā)展以及未來如何發(fā)展。
當前的景觀
為了表達清楚,我展示了Jake VanderPlas對于當前Python中不同庫之間如何相互聯(lián)系的概述:
在這里,你能看到幾個主要的庫組,每一個庫都有不同的起點,歷史以及著重點。“SciVis”是一個可分離的庫組,主要用于物理位置數(shù)據(jù)的可視化(在圖的左下方)。這些工具(VisPy,glummpy,GR,Mayavi,paraView,VTK以及yt)主要是基于1992年OpenGL圖形標準而建立,以三維或四維(3D隨時間變化)形式對物理進程進行圖形密集型的可視化,用于常規(guī)或非常規(guī)的格網(wǎng)數(shù)據(jù)。這些庫出現(xiàn)的時間早于HTML5對豐富的網(wǎng)絡應用程序的支持,通常側重于工程領域或科學背景下的高性能桌面GUI應用程序。
其它的庫幾乎都來自于“InfoVis”庫組,主要側重在任意空間信息的可視化,并非必需來自于三維物理世界。InfoVis庫使用打印頁面或計算機屏幕的兩個維度解譯抽象空間,通常使用軸和標簽。InfoVis庫可以被細分成許多的子庫:
Matplotlib
Matplotlib于2003年發(fā)布,擁有非常廣泛的2D繪圖類型和輸出格式,是最古老以及到目前為止最受歡迎的InfoVis庫之一。Matplotlib也出現(xiàn)于HTML5對豐富的網(wǎng)絡應用支持之前,側重于使用桌面GUI工具包(如Qt和GTK)的靜態(tài)圖像以及圖形交互。Matplotlib提供一些3D支持功能,但是相較于SciVis庫提供的3D支持功能而言受到更多的限制。
Matplotlib-based
近年來,基于Matplotlib的2D繪圖能力已經(jīng)建立了多樣化的工具,既可以作為一個渲染引擎針對特定的數(shù)據(jù)類型或特定的領域(pandas,NetworkX,Cartopy以及yt等)使用,也可以提供一個更高級別的API簡化繪圖創(chuàng)造(ggplot,plotnine,HoloViews,GeoViews),或是用其它的繪圖類型(seaborn等)對其進行擴展。
JavaScript
一旦HTML5在瀏覽器之間實現(xiàn)了豐富的交互性,許多庫就能夠開始在網(wǎng)頁或Jupyter筆記本上提供交互性的2D繪圖,也可以使用自定義的JS(Boken,Toyplot)或封裝好的現(xiàn)有的JS庫,如D3(Plotly,bqplot)。封裝現(xiàn)有的JS使得添加為大型JS市場(如Plotly)創(chuàng)造的新圖變得十分容易,而使用自定義Js可以定義低級別的Js基原,這些基原在Python中可以被組合成全新的繪圖類型(對于Bokeh而言)。
JSON
隨著JavaScript庫如D3逐漸發(fā)展完善,他們的功能也出現(xiàn)在聲明型JSON規(guī)范中(Vega,Vega-Lite),從而使得在任何語言中生成JavaScript圖形變得更加簡單,現(xiàn)在也包括Python語言(通過Altair,以前通過vincent)。完整的繪圖規(guī)范可以作為可移植JSON使用,從而支持跨多種工具的集成。
WebGL
就像HTML5用于2D JavaScript繪圖一樣,WebGL標準實現(xiàn)了瀏覽器和Jupyter的3D交互,致使基于three.js(pythreejs,ipyvolume),vtk.js(itk-jupyter-widgets)或regl(Plotly)建立了3D瀏覽器內(nèi)置繪圖。這些基于網(wǎng)絡的新的3D方法都沒有接近桌面SciVis 3D庫的廣度和深度,但是他們允許與Jupyter筆記本的深度融合,并通過網(wǎng)絡實現(xiàn)簡單的共享以及使用。因此,即使WebGL工具有一些應用與SciVis工具相同,但他們可能與其他的InfoVis工具聯(lián)系更緊密。
其它
許多其他的庫,甚至在Jake的表格之外的庫,提供了其它的補充性的功能(例如用于可視化網(wǎng)絡的graphviz)。
Viz 工具之間的區(qū)別
上述按照歷史和技術分類的方法有助于解釋我們?nèi)绾潍@得Python viz包的當前數(shù)量,但是它也有助于解釋為什么不同的包之間用戶水平的差異如此巨大。具體來說,主要的差異存在于所支持的繪圖類型、數(shù)據(jù)規(guī)模、用戶界面,這些差異使得庫的選擇不僅僅是個人喜好或方便的問題,因此理解他們非常重要:
繪圖類型
最基本的繪圖類型在多個庫之間共享,但是其它的繪圖類型僅在某些庫中可用。考慮到庫的數(shù)量、繪圖類型以及他們隨時間的變化,精確的描繪出每一個庫所支持的內(nèi)容是十分困難的,但是如果你查看每一個庫的范例,你通常可以清楚的看到其重點是什么。
作為一個粗略的指南:
統(tǒng)計圖(散點圖、直線圖、區(qū)域圖、條形圖、直方圖):幾乎所有的InfoVis庫都覆蓋了這些圖,但這些圖是Seaborn、bqplot、Altair、廣告牌咯他、plot9的主要關注點。
圖像,規(guī)則格網(wǎng),矩形網(wǎng)格:Boken,Datashader,HoloViews,Matplotlib,Plotly以及大多數(shù)的SciVis庫都能夠很好的支持。
不規(guī)則的二維網(wǎng)格(三角形網(wǎng)格):由SciVis庫和Matplotlib,Bokeh,data hader,HoloViews支持。
地理數(shù)據(jù):Matplotlib(附帶Cartopy),GeoViews,ipyleaflet,plot
網(wǎng)絡/圖形:NetworkX,,Plotly, Bokeh, HoloViews, Datashader
3D(網(wǎng)格,散點等):SciVis庫完全支持,并在Plotly,Matplotlib,HoloViews和ipyvolume中提供一些支持。
數(shù)據(jù)大小
每個庫的架構和底層技術決定了其所支持的數(shù)據(jù)規(guī)模大小,從而決定了該庫是否適合于大型圖像、電影、多維數(shù)組、長時間序列、網(wǎng)格或其他大型數(shù)據(jù)集:
SciVIs:使用匯編的數(shù)據(jù)庫和本地GUI應用程序通常可以處理非常大的網(wǎng)格數(shù)據(jù)集,千兆字節(jié)或更大。
基于matplotlib:通常可以平穩(wěn)的處理數(shù)十萬個點,在某些特殊情況下甚至更多(例如,取決于后端)。
JSON:沒有特殊處理,JSON基于文本的數(shù)據(jù)編碼將基于JSON的規(guī)范限制在幾千點到幾十萬點,這是由于所需的文件大小和文本處理。
JavaScript:ipywidgets,Bokeh和Plotly都使用JSON,但使用額外的二進制數(shù)據(jù)傳輸機制來增強它,以便它們可以處理數(shù)十萬到數(shù)百萬個數(shù)據(jù)點。
WebGL:使用HTML畫布的JavaScript庫為了獲得良好的性能,最多只能提供幾十萬個點,但是WebGL(通過ipyvolume,Plotly和在某些情況下Bokeh)允許提供數(shù)百萬個點。
服務器端渲染:Datashader或Vaex的外部外部InfoVis服務器端呈現(xiàn)通過將任意大的分布式或非核心數(shù)據(jù)集轉換為固定大小的圖像嵌入客戶端瀏覽器,允許web瀏覽器中的數(shù)十億、數(shù)萬億或更多數(shù)據(jù)點。
由于這些類型的庫支持的數(shù)據(jù)大小范圍很廣(從而在某種程度上支持數(shù)據(jù)類型),需要處理大數(shù)據(jù)的用戶需要在一開始就選擇合適的庫。
用戶界面及發(fā)布
不同的庫在使用繪圖的方式上有很大的不同。
靜態(tài)圖像:大多數(shù)庫現(xiàn)在可以輕松地創(chuàng)建靜態(tài)圖像,至少在PNG中是這樣,通常在SVG或PDF等平滑矢量格式中也是如此。
本地GUI應用程序:SciVis庫加上Matplotlib和Vaex可以創(chuàng)建特定操作系統(tǒng)的GUI窗口,這些窗口可以提供高性能,支持大型數(shù)據(jù)集以及與其他桌面應用程序的集成,但是它們綁定在特定的操作系統(tǒng)上,通常需要在本地運行而并非在網(wǎng)絡上。在某些情況下,基于javascript的工具也可以通過嵌入網(wǎng)絡瀏覽器嵌入到本地應用程序當中。
導出到HTML:大多數(shù)JavaScript和JSON庫都可以在無服務器模式下運行,該模式生成交互式繪圖(縮放、平移等),可以通過電子郵件發(fā)布在web服務器上,而不需要Python。
Jupyter記事本:大多數(shù)InfoVis庫現(xiàn)在都支持在Jupyter記事本中進行交互式使用,并且Python支持基于JavaScript的繪圖。基于ipywidgets的項目提供了與Jupyter更緊密的集成,而其他一些方法只提供了Jupyter中有限的交互性(例如,與Matplotlib而不是Bokeh一起使用全息視圖)。
獨立的基于Web的儀表板和應用程序:Plotly圖表可以用在帶有Dash的單獨可部署應用程序中,而Bokeh,HoloViews以及geoview可以使用Bokeh服務器部署。大多數(shù)其他的InfoVis庫可以使用新的Panel庫作為儀表板部署,至少包括Matplotlib、Altair、Plotly、Datashader、hvPlot、Seaborn、plotnine和yt。然而,盡管基于web的交互性很好,但是基于ipywidgets的庫(ipyleaflet,pythreejs,ipyvolume,bqplot)作為面向公眾的應用程序很難部署,因為Jupyter服務器允許任意代碼執(zhí)行(但是請參閱失效的Jupyter指示版項目和flask-ipywidgets來尋找潛在的解決方案)。
因此,用戶需要考慮給定的庫是否涵蓋了他們期望的可視化使用范圍。
API 類型
各種InfoVis庫提供了大量的編程接口,適用于不同類型的用戶以及創(chuàng)建可視化的不同方式。這些API在需要多少代碼來完成常見任務以及它們?yōu)橛脩籼幚聿怀R娙蝿蘸蛯⒒M成新類型圖表時提供多少控件方面有所不同:
面向對象的Matplotlib API :對于一些常見的任務,例如創(chuàng)建子數(shù)據(jù)Matplotlib的主API,允許完全控制和合成,但是復雜且高度冗長。
命令式Pyplot API:Matplotlib的基本界面允許使用Matplotlib風格的命令式命令,這些命令對簡單的情況而言非常簡潔,但并不是組合的。因此,很大程度上只支持一組特定的選項。
Imperative Pandas.plot APIs:以數(shù)據(jù)框架為中心,用戶將主要在Pandas中準備數(shù)據(jù),然后選擇一個子集進行繪圖。正如本系列的下一篇文章中討論的那樣,現(xiàn)在廣泛的圖表庫和其它數(shù)據(jù)結構都支持它們,這使它們成為一組廣泛支持的基本繪圖命令。不是直接組合,但是可以從底層繪圖庫返回可組合對象(對于hvPlot)。
聲明性圖形API:The Grammar of Graphics-inspired 庫如ggplot,plotnine,Altair和Bokeh(在某種程度上)提供了一種自然的方式來組合圖形原語(如軸和符號),以創(chuàng)建完整的圖形。
聲明性數(shù)據(jù)API:基于其他庫的本地API的基礎上,HoloViews和GeoViews提供了一個更高級別的聲明性和組合性API,專注于注釋、描述和處理可視化數(shù)據(jù),而不是繪制元素。
這些API都適合于具有不同背景和目標的用戶,使得一些任務簡單明了,而另一些則更加困難。除了Matplotlib之外,大多數(shù)庫支持一個或最多兩個可選API,因此選擇一個適合每個用戶的技術背景和首選工作流程的庫非常重要。
新興趨勢
正如您所見,Python提供了大量可視化功能,其方法和重點的多樣性體現(xiàn)在大量的可用的庫中。方法之間的差異仍然十分重要,并且具有深遠的影響,這意味著用戶在對任何一種特別的方法進行深度探究之前都需要考慮到這些差異。但是正如我們在SciPy2018特別會議上看到的那樣,融合趨勢有助于降低用戶選擇庫的重要性。了解更多有關新型趨勢的信息,請繼續(xù)關注本系列的第2部分,Python數(shù)據(jù)可視化2018:走向融合。
英文原文:https://www.anaconda.com/blog/developer-blog/python-data-visualization-2018-why-so-many-libraries/譯者:Lyx
總結
以上是生活随笔為你收集整理的js 处理十万条数据_Python数据可视化2018:为什么这么多的库?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: a*算法流程图_如何从0开始,搭建A/B
- 下一篇: fortran的gui开发 python