Yes,您可以使用plotlyexpress构建子图。任何一个
1.直接通过参数facet_row
and facet_colums
(在这种情况下我们经常谈论面图 https://plotly.com/python/facet-plots/,但它们是同一件事),或者
2.间接地通过从使用plotlyexpress构建的图形中“窃取”元素并在标准中使用它们make_subplots() https://plotly.com/python-api-reference/generated/plotly.subplots.make_subplots.html设置为fig.add_traces() https://plotly.com/python/creating-and-updating-figures/
方法一:Python 中的分面图和网格图 https://plotly.com/python/facet-plots/
尽管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
然后你可以通过以下方式构建你的子图:
fig = px.line(df, x='Date', y = 'value', facet_row = 'variable')
Plot 1:
默认情况下,px.line()
将对两条线应用相同的颜色,但您可以通过以下方式轻松处理:
fig.update_traces(line_color)
这个完整的代码片段向您展示了如何:
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()
方法二:make_subplots
由于plotlyexpress可以用相当复杂的数据集做一些非常惊人的事情,我认为你没有理由不应该在你想使用的情况下绊倒elements一个情节表达的图形作为source对于一个次要情节。这很有可能。
下面是一个例子,我用它来绘制图形px.line
on the px.data.stocks()
数据集。然后我继续使用提取一些感兴趣的元素add_trace
and go.Scatter
in 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()