Plotly:如何使用 Plotly Express 组合散点图和线图?

Plotly: How to combine scatter and line plots using Plotly Express?

Plotly Express 有一种直观的方式,可以用最少的代码行提供预格式化的 plotly 图; Seaborn 如何为 matplotlib 做这件事。

可以在 Plotly 上添加绘图的痕迹,以在现有的线图上获得散点图。但是,我在 Plotly Express 中找不到这样的功能。

是否可以在 Plotly Express 中组合散点图和折线图?

您可以使用:

fig3 = go.Figure(data=fig1.data + fig2.data)

其中 fig1fig2 是使用 px.line() and px.scatter(), respectively. And fig3 is, as you can see, built using plotly.graph_objects 构建的。

一些细节:

我经常使用的一种方法是使用 plotly.express 构建两个图形 fig1fig2,然后使用它们的数据属性将它们与 go.Figure / plotly.graph_objects 对象组合在一起,例如这个:

import plotly.express as px
import plotly.graph_objects as go
df = px.data.iris()

fig1 = px.line(df, x="sepal_width", y="sepal_length")
fig1.update_traces(line=dict(color = 'rgba(50,50,50,0.2)'))

fig2 = px.scatter(df, x="sepal_width", y="sepal_length", color="species")

fig3 = go.Figure(data=fig1.data + fig2.data)
fig3.show()

剧情:

如果你想缩放apporach

fig3 = go.Figure(data=fig1.data + fig2.data)

如其他答案所述,这里有一些提示。

fig1.datafig2.data 是常见的元组,包含绘图所需的所有信息,而 + 只是将它们连接起来。

# this will hold all figures until they are combined
all_figures = []

# data_collection: dictionary with Pandas dataframes
 
for df_label in data_collection:

    df = data_collection[df_label]
    fig = px.line(df, x='Date', y=['Value'])
    all_figures.append(fig)

import operator
import functools

# now you can concatenate all the data tuples
# by using the programmatic add operator 
fig3 = go.Figure(data=functools.reduce(operator.add, [_.data for _ in all_figures]))
fig3.show()

编辑:修正错别字。

这非常有效,并且对于 flipSTAR 关于向组合图添加全局布局的说明更加有用。然而,有时全局布局并不能涵盖所有内容。例如,在我的例子中(一个堆积条和两条散点图线),我的全局布局导致我丢失了散点图图例。幸运的是,您可以通过定位特定数字来向组合的无花果添加额外的参数。例如,假设:

fig1 = px.bar(...)
fig2 = px.line(...)
fig3 = px.line(...)
all_fig = go.Figure(data=fig1.data + fig2.data + fig3.data, layout = fig1.layout)

这是一个条形图和两个散点图,每个都有一条线,您可以为每条线添加图例:

all_fig['data'][1]['showlegend']=True
all_fig['data'][1]['name']='Line 1 Name'
all_fig['data'][1]['hovertemplate']='Line 1 Name<br>x=%{x}<br>y=%{y}<extra></extra>'
all_fig['data'][2]['showlegend']=True
all_fig['data'][2]['name']='Line 2 Name'
all_fig['data'][2]['hovertemplate']='Line 2 Name<br>x=%{x}<br>y=%{y}<extra></extra>'

(柱子是 all_fig['data'][0])。

出于某种原因,悬停时不会显示名称,除非您明确将其添加到 'hovertemplate.'