是否可以使用 Plotly Express 创建子图?

dom*_*ano 5 python plotly

我想创建一个带有 2 个由函数生成的图的子图plotly.express.line,这可能吗?鉴于 2 情节:

fig1 =px.line(df, x=df.index, y='average')
fig1.show()

fig2 = px.line(df, x=df.index, y='Volume')
fig2.show()
Run Code Online (Sandbox Code Playgroud)

我想生成一个由 2 个子图组成的独特图(在示例Fig1和Fig2中)

ves*_*and 8

是的,您可以使用plotlyexpress构建子图。任何一个

1.直接通过参数facet_rowfacet_colums(在这种情况下我们经常谈论分面图,但它们是同一件事),或者

2.间接地通过从使用plotlyexpress构建的图形中“窃取”元素并在标准make_subplots()设置中使用它们fig.add_traces()


方法 1:Python 中的分面图和网格图

尽管plotly.express支持宽格式和长格式的数据,但我通常更喜欢从后者构建分面图。如果您有这样的数据集:

    Date variable  value
0  2019-11-04  average      4
1  2019-11-04  average      2
.
.
8  2019-12-30   volume      5
9  2019-12-30   volume      2
Run Code Online (Sandbox Code Playgroud)

然后你可以通过以下方式构建你的子图:

fig = px.line(df, x='Date', y = 'value', facet_row = 'variable')
Run Code Online (Sandbox Code Playgroud)

地块 1:

在此输入图像描述

默认情况下,px.line()将对两条线应用相同的颜色,但您可以通过以下方式轻松处理:

fig.update_traces(line_color)
Run Code Online (Sandbox Code Playgroud)

这个完整的代码片段向您展示了如何:

import plotly.graph_objects as go
import plotly.express as px
import pandas as pd

df = pd.DataFrame({'Date': ['2019-11-04', '2019-11-04', '2019-11-18', '2019-11-18', '2019-12-16', '2019-12-16', '2019-12-30', '2019-12-30'],
                  'variable':['average', 'volume', 'average', 'volume', 'average','volume','average','volume'],
                  'value': [4,2,6,5,6,7,5,2]})

fig = px.line(df, x='Date', y = 'value', facet_row = 'variable')

fig.update_traces(line_color = 'red', row = 2)

fig.show()
Run Code Online (Sandbox Code Playgroud)

方法二:make_subplots

由于plotlyexpress可以用相当复杂的数据集做一些非常惊人的事情,所以我认为您没有理由不应该遇到想要使用plotlyexpress图形的元素作为图源的情况。这很有可能。

下面是我构建的一个示例,用于px.linepx.data.stocks()数据集上使用绘图来表达数字。然后我继续使用add_tracego.Scatterin a提取一些感兴趣的元素For Loop来构建子图设置。您当然可以争辩说,您可以直接在数据源上轻松地执行此操作。但话又说回来,正如最初所说,plotlyexpress 本身就是一个优秀的数据处理程序。

图 2:使用绘图表达数字作为源的子图:

在此输入图像描述

完整代码:

import plotly.graph_objects as go
import plotly.express as px
import pandas as pd

from plotly.subplots import make_subplots

df = px.data.stocks().set_index('date')

fig1 = px.line(df[['GOOG', 'AAPL']])
fig2 = px.line(df[['AMZN', 'MSFT']])

fig = make_subplots(rows=2, cols=1)

for d in fig1.data:
    fig.add_trace((go.Scatter(x=d['x'], y=d['y'], name = d['name'])), row=1, col=1)
        
for d in fig2.data:
    fig.add_trace((go.Scatter(x=d['x'], y=d['y'],  name = d['name'])), row=2, col=1)
    
fig.show()
Run Code Online (Sandbox Code Playgroud)


Der*_*k O 2

从文档来看,Plotly express不支持任意子图功能。您可以改为使用图形对象和跟踪(请注意,这go.Scatter是等效的):

import pandas as pd

from plotly.subplots import make_subplots
import plotly.graph_objects as go

## create some random data
df = pd.DataFrame(
    data={'average':[1,2,3], 'Volume':[7,3,6]}, 
    index=['a','b','c']
)

fig = make_subplots(rows=1, cols=2)

fig.add_trace(
    go.Scatter(x=df.index, y=df.average, name='average'),
    row=1, col=1
)

fig.add_trace(
    go.Scatter(x=df.index, y=df.Volume, name='Volume'),
    row=1, col=2
)

fig.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述