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

Posted

技术标签:

【中文标题】Plotly express 与 Altair/Vega-Lite 的交互式绘图【英文标题】:Plotly express vs. Altair/Vega-Lite for interactive plots 【发布时间】:2020-05-07 18:26:24 【问题描述】:

最近我正在学习 Plotly express 和 Altair/Vega-Lite 进行交互式绘图。他们俩都令人印象深刻,我想知道他们的优点和缺点是什么。尤其是制作交互式情节,它们之间有什么大的区别,什么时候比另一个更合适?

【问题讨论】:

【参考方案1】:

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

设计原则

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

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

语法

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

交互性

两者都非常有能力,可以创建通过交互链接在一起的多面板布局,例如更新其他绘图的过滤或悬停事件。目前 Altair 中的所有交互性都是客户端(发生在您的浏览器中,并且在将笔记本导出为 html 时仍然存在),因为 Plotly 具有客户端和服务器端交互性(需要运行 Python 服务器)。因此,如果您使用 Plotly 的仪表板解决方案 Dash,您可以触发自定义函数以执行例如 Plotly 图中的选择,而在 Altair 中,您只能使用此选择更新其他 Altair 图。 Server side interactivity for Altair might be implemented for the dashboarding package streamlit in the future.

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

外观

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

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

附加功能

Plotly 目前支持更多类型的图表,并具有一些针对例如生物图和图像分析的特殊功能。 Plotly 可以使用 WebGL 和 datashader 加速某些类型的绘图的性能,而 Vega 的可扩展性能仍在开发中。 Plotly 是由一家为其某些产品提供企业支持的公司创建的。 Vegalite 是由开发 D3 的同一研究小组开发的。两者都是开源的。

【讨论】:

非常感谢乔,太棒了!感谢您的详细解释,这很有帮助! @roudan 不客气!如果对您有帮助,请接受带有绿色复选标记的答案,以便将此问题标记为已解决。 谢谢提醒,我才接受。

以上是关于Plotly express 与 Altair/Vega-Lite 的交互式绘图的主要内容,如果未能解决你的问题,请参考以下文章

plotly express 情节已经褪色

使用 plotly.express 折线图,线条以奇怪的顺序连接?怎么修? [关闭]

4000字,25张精美交互图表,开启Plotly Express之旅

4000字,25张精美交互图表,开启Plotly Express之旅

如何在 Python 中使用 Plotly Express 仅显示图例的子集(plotly.express,px)?

在 plotly express 中创建 plotly distplot 图表