最近我在学习Plotly express和Altair/Vega-Lite用于交互式绘图。它们都非常出色,我想知道它们的优点和缺点是什么。特别是在创建交互式图时,它们之间是否有很大的区别,何时使用其中一个比另一个更合适?
最近我在学习Plotly express和Altair/Vega-Lite用于交互式绘图。它们都非常出色,我想知道它们的优点和缺点是什么。特别是在创建交互式图时,它们之间是否有很大的区别,何时使用其中一个比另一个更合适?
尽量不涉及个人偏好和太多细节,以下是我所知道的两者之间的一些主要相似点和不同点。
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以直观的方式支持动画,如果您的数据是时间序列或类似数据,则可以使用此功能。
Plotly目前支持更多类型的图表,并且具有一些特殊功能,例如针对生物学和图像分析等领域。对于某些类型的图表,Plotly可以使用WebGL加速性能,而Altair的性能可以通过VegaFusion进行扩展。两者都可以在某种程度上与Datashader配合使用,但无法像使用Bokeh/Holoviews时那样无缝运行。
Plotly是由一家公司创建的,该公司为其某些产品提供企业支持。Vegalite是由开发D3的同一研究团队开发的。两者都是开源的。
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 最近也更新了文档,这些文档现在有了显著的改进。以下是两者中关于长格式数据和宽格式数据的详细阅读链接: