Plotly express 与 Altair/Vega-Lite 的交互图

Plotly express vs. Altair/Vega-Lite for interactive plots

最近我正在学习 Plotly express and Altair/Vega-Lite 交互式绘图。他们两个都令人印象深刻,我想知道他们的优点和缺点是什么。尤其是创建互动剧情,两者有什么大的区别,什么时候一个比另一个更合适?

尽量不涉及个人喜好和太多细节,以下是据我所知两者之间的一些主要异同。

设计原则

Plotly express 和 Altair 都是高级声明性库,这意味着您可以根据数据和关系(例如在 seaborn、holoviews 和 ggplot 中)而不是根据较低级别的绘图机制(例如在 matplotlib 中)来表达自己和散景)。这需要更少的输入,让您的注意力集中在数据上,但您对图中确切细节的控制也更少。

两者都是基于底层 javascript 库的交互式绘图包。 Plotly express 位于 plotly.py 之上,它是 plotly.js 的 Python 包装器,而 Altair 是 VegaLite.js 的包装器,后者又基于 Vega.js。 plotly.js和Vega都是基于D3可视化库,是标准的js可视化库

语法

更根本的区别之一是语法。 Plotly 的语法更侧重于为每个绘图提供单独的函数,然后该函数采用多个参数来控制其行为。例如,violinplot 函数有一个参数,用于确定是否还应包含带状图。 Altair 专注于拥有一个图形语法,您可以在其中从各个图形语法单元组成图表,就像您从单词组成句子一样。例如,如果我想在 Altair 中组合两个图表,我会单独创建它们并通过图层运算符将它们添加在一起(这在 Plotly 中也可以扩展,但使用 Plotly express 并不总是那么简单)。所以 Altair 的语法原则与 ggplot 非常相似,而 Plotly express 在语法上更像(但不完全)像 seaborn。

互动性

两者都非常有能力,可以创建通过交互链接在一起的图的多面板布局,例如更新其他图的过滤或悬停事件。核心库本身的所有交互都是客户端的(发生在您的浏览器中,并且在将笔记本导出到 HTML 时仍然存在)。服务器端交互(需要 运行 Python 服务器)可以通过与外部仪表板解决方案配对来实现,它允许您触发自定义函数以在图中选择的点上执行。对于 Plotly,这是 their own solution Dash and for Altair this has (and it might be implemented for Streamlit in the future).

Altair 是我所知道的唯一具有交互语法的可视化包,它允许您根据与通过图形语法创建绘图时类似的原则来组合小部件和绘图之间的交互。这使得创建情节的体验保持一致,并且可以在设计交互时增加创造力和灵活性。 Plotly 以直观的方式支持动画,如果您的数据是时间序列或类似数据,这将非常有用。

外观

请查看 Altair and Plotly express 画廊以确定您喜欢哪种美学。许多默认值(背景颜色、标记大小、轴号等)当然是可以更改的(单独或通过主题),但是您仍然可以通过在画廊中花费时间来大致了解您的绘图的外观。

一个显着的区别是 Altair 将保持绘图元素和间距不变,同时调整绘图大小以适应例如更多分类条目,而 Plotly 将修改绘图中元素的间距和大小以适应整体绘图大小。对于分面子图,Altair 将使每个子图保持恒定大小并随着添加更多子图而扩大图表的总大小,而 Plotly 将使子图适合图的整体大小并随着添加更多子图使每个图变小。您可以调整这两个库以创建所需大小的图,但这就是它们开箱即用的方式。

额外内容

Plotly 目前支持更多类型的图表,并具有一些针对例如生物图和图像分析的特殊功能。 Plotly can accelerate performance with WebGL for certain types of plots, whereas Altair's performance can be scaled with VegaFusion。两者都可以在某种程度上与 Datashader 一起使用,但不如与 Bokeh/Holoviews.

一起使用时那样无缝

Plotly 由一家为其部分产品提供企业支持的公司创建。 Vegalite 是由开发 D3 的同一个研究小组开发的。两者都是开源的。