Plotly Express与Altair/Vega-Lite的交互式图表比较

37

最近我在学习Plotly expressAltair/Vega-Lite用于交互式绘图。它们都非常出色,我想知道它们的优点和缺点是什么。特别是在创建交互式图时,它们之间是否有很大的区别,何时使用其中一个比另一个更合适?

2个回答

68

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

设计原则

Plotly Express 和Altair都是高级声明性库,这意味着你可以用数据和关系来表达自己(就像在seaborn、holoviews和ggplot中一样),而不是用较低级别的绘图机制(就像在matplotlib和bokeh中)。这样可以减少输入量,让你专注于数据,但你对绘图中的确切细节控制较少。

它们都是基于底层javascript库的交互式绘图包。Plotly Express 基于 plotly.py,后者是 plotly.js 的 Python 封装;而 Altair 是 VegaLite.js 的封装,后者又基于 Vega.js。Plotly.js 和 Vega 都基于 D3 可视化库,这是标准的 JavaScript 可视化库。

语法

其中一个更基本的区别在于语法。Plotly的语法更侧重于为每个绘图功能提供单独的函数,然后该函数接受多个参数来控制其行为。例如,violinplot函数有一个参数,用于确定是否还应包括条带图。而Altair则侧重于具有图形语法,其中您可以从单个图形语法单元组合图表,就像您从单词组合句子一样。例如,如果我想在Altair中组合两个图表,则会分别创建它们,然后通过层运算符将它们相加(这在Plotly中也是可能的,但不总是直截了当的)。因此,Altair的语法原则与ggplot非常相似,而Plotly express在其语法上更像(但不完全)seaborn。

交互性

两者都非常强大,可以创建多面板布局的图表,并通过交互(例如过滤或悬停事件)将它们链接在一起,以更新其他图表。核心库本身的所有交互都是客户端(即在您的浏览器中发生,并在导出笔记本到HTML时仍然存在)。可以通过与外部仪表板解决方案配对实现服务器端交互(需要运行Python服务器),这允许您触发自定义函数以在图表中的某些点上执行操作。对于Plotly,这是他们自己的Dash解决方案,对于Altair,则最近在Panel仪表板库中添加了此功能(并且可能会在未来实现为Streamlit)。

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

外观

请查看 AltairPlotly express 图库,以决定您更喜欢哪种美学效果。当然,默认值(背景颜色、标记大小、坐标轴数等)都是可以更改的(可以通过主题单独更改),但是在图库中花费时间仍然可以获得有关绘图外观的良好总体印象。
一个显着的区别是,在调整绘图大小以适应更多分类条目时,Altair将保持绘图元素和间距固定,而Plotly将修改绘图中的间距和元素大小以适应整体绘图大小。对于分面子图,Altair将保持每个子图恒定大小并随着添加更多子图而扩大图表的总大小,而Plotly将将子图适合到整个绘图的大小中,并随着添加更多子图,使每个子图变小。您可以调整这两个库以创建所需大小的图,但这就是它们默认行为的方式。

Extras

Plotly目前支持更多类型的图表,并且具有一些特殊功能,例如针对生物学和图像分析等领域。对于某些类型的图表,Plotly可以使用WebGL加速性能,而Altair的性能可以通过VegaFusion进行扩展。两者都可以在某种程度上与Datashader配合使用,但无法像使用Bokeh/Holoviews时那样无缝运行。

Plotly是由一家公司创建的,该公司为其某些产品提供企业支持。Vegalite是由开发D3的同一研究团队开发的。两者都是开源的。


2
对于某些场景,一个库可能比另一个库更方便。例如,对于绘制宽格式数据,我个人认为使用 Plotly express 更容易,因为 Altair 要求先将数据转换为长格式,而在 Plotly 中,您可以直接传递要绘制的列的列表。我也认为,在 Plotly 中绘制索引和居中标题更容易。以下是一个示例,将三者都包含在内,以便您看到差异:
Altair:
alt.Chart(
    df.melt(['observed', 'predicted'], var_name='category', value_name='data').reset_index(),
    title=alt.TitleParams('Product 1', anchor='middle')
).mark_line().encode(
    alt.X("index"),
    alt.Y("data"),
    alt.Color("category")
)

Plotly express:

fig = px.line(df, x=df.index, y=["observed", "predicted"])
fig.update_layout(
    title={"text": "Product 1", "x": 0.5, "xanchor": "center"},
    yaxis_title="data",
    legend_title_text="category"
)

我个人更喜欢 Plotly 的文档,尽管 Altair 最近也更新了文档,这些文档现在有了显著的改进。以下是两者中关于长格式数据和宽格式数据的详细阅读链接:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接