简体   繁体   中英

Is it possible to create a subplot with plotly.express?

I would like to create a subplot with 2 plot generated with the function plotly.express.line , is it possible? Given the 2 plot:

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

fig2 = px.line(df, x=df.index, y='Volume')
fig2.show()

I would like to generate an unique plot formed by 2 subplot (in the example fig1 and fig2)

No, not directly (as DerekO has concisely described). But since plotly express can do some pretty amazing stuff with fairly complicated datasets, I see no reason why you should not stumple upon cases where you would like to use elements of a plotly express figure as a source for a subplot. And that is very possible.

Below is an example where I've built to plotly express figures using px.line on the px.data.stocks() dataset. Then I go on to extract some elements of interest using add_trace and go.Scatter in a For Loop to build a subplot setup. You could certainly argue that you could just as easily do this directly on the data source. But then again, as initially stated, plotly express can be an excellent data handler in itself.

Subplot using plotly express figures as source:

在此处输入图像描述

Complete code:

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()

From the documentation, Plotly expressdoes not support arbitrary subplot capabilities . You can instead use graph objects and traces (note that go.Scatter is equivalent):

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()

在此处输入图像描述

There is no need to use graph_objects module if you have just already generated px figures for making subplots. Here is the full code.

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)

fig.add_trace(fig1['data'][0], row=1, col=1)
fig.add_trace(fig1['data'][1], row=1, col=1)
fig.add_trace(fig2['data'][0], row=2, col=1)
fig.add_trace(fig2['data'][1], row=2, col=1)
    
fig.show()

绘制图

If there are more than two variables in each plot, one can use for loop also to add the traces using fig.add_trace method.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM