在不使用 Plotly Express 的情况下向 Plotly 子图添加垂直矩形
Adding Vertical Rectangles to Plotly Subplots Without Using Plotly Express
我正在尝试在具有子图的绘图图表中创建对应于不同日期范围的阴影区域。
理想情况下,我希望每个阴影矩形都适合每个子图,但我发现这很难。这是一些示例代码:
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
df = pd.DataFrame({'A': list(range(25)),
'B': list(range(25, 50)),
'C': list(range(50, 75))}, index=pd.date_range('20200101', periods=25))
fig = make_subplots(rows=3, cols=1)
for idx, col in enumerate(df.columns):
fig.add_trace(go.Scatter(x=df.index, y=df[col]), row=idx + 1, col=1)
shape_dict = {'type':'rect', 'xref':'x', 'yref':'paper', 'x0':'2020-01-03', 'x1':'2020-01-12', 'y0':0, 'y1':1, 'fillcolor': 'LightSalmon', 'layer': 'below', 'opacity': 0.25, 'line_width': 0}
如果我这样做 fig.update_layout(shapes=[shape_dict])
,那么我会得到这个:
还不错,但我更希望将这些形状中的每一个都单独放入它们自己的子图中。
当我尝试使用 add_shape
执行此操作时,阴影区域失去了缩放比例:
for idx, col in enumerate(df.columns):
fig.add_trace(go.Scatter(x=df.index, y=df[col]), row=idx + 1, col=1)
fig.add_shape(shape_dict, row=idx + 1, col=1)
这给了我这个:
我宁愿不要必须单独重新计算坐标轴。
我也无法访问 add_vrect
-- 我不确定为什么,但它作为一种方法不可用,我也无法使用 plotly.express
,而且大多数plot.ly 的文档使用 px
图表及其方法来执行我正在描述的内容。
编辑
为了回应下面的答案,add_vrect
不适用于我的 plotly 版本,即 4.12.0。
例如 r-beginners
returns 中的示例代码 我是这样的:
df = pd.DataFrame({'A': list(range(25)),
'B': list(range(25, 50)),
'C': list(range(50, 75))}, index=pd.date_range('20200101', periods=25))
fig = make_subplots(rows=3, cols=1)
for idx, col in enumerate(df.columns):
fig.add_trace(go.Scatter(x=df.index, y=df[col]), row=idx + 1, col=1)
# shape_dict = {'type':'rect', 'xref':'x', 'yref':'paper', 'x0':'2020-01-03', 'x1':'2020-01-12', 'y0':0, 'y1':1, 'fillcolor': 'LightSalmon', 'layer': 'below', 'opacity': 0.25, 'line_width': 0}
# fig.update_layout(shapes=[shape_dict])
fig.add_vrect(
x0="2020-01-03", x1="2020-01-12",
y0=0, y1=1,
fillcolor="LightSalmon", opacity=0.25,
layer="below", line_width=0)
fig.show()
Returns错误信息:AttributeError: 'Figure' object has no attribute 'add_vrect'
用 add_vrect()
将阴影输出到每个子图。比例也不受影响。这个答案是否符合您的问题意图?
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
df = pd.DataFrame({'A': list(range(25)),
'B': list(range(25, 50)),
'C': list(range(50, 75))}, index=pd.date_range('20200101', periods=25))
fig = make_subplots(rows=3, cols=1)
for idx, col in enumerate(df.columns):
fig.add_trace(go.Scatter(x=df.index, y=df[col]), row=idx + 1, col=1)
# shape_dict = {'type':'rect', 'xref':'x', 'yref':'paper', 'x0':'2020-01-03', 'x1':'2020-01-12', 'y0':0, 'y1':1, 'fillcolor': 'LightSalmon', 'layer': 'below', 'opacity': 0.25, 'line_width': 0}
# fig.update_layout(shapes=[shape_dict])
fig.add_vrect(
x0="2020-01-03", x1="2020-01-12",
y0=0, y1=1,
fillcolor="LightSalmon", opacity=0.25,
layer="below", line_width=0,
)
fig.show()
我无法发表评论,所以将此作为(可能的)答案发布。
你在 Jupyter 中使用它吗?如果是这样,plotly 的 jupyterlab-plotly
扩展是否也更新了?如果不是,这可能解释了为什么您无法访问 add_vrect
方法。我认为 jupyterlab 扩展主要负责渲染,但它仍然可能会抛出找不到方法的错误。
check/update 最快的方法是 jupyter labextension update --all
.
我正在尝试在具有子图的绘图图表中创建对应于不同日期范围的阴影区域。
理想情况下,我希望每个阴影矩形都适合每个子图,但我发现这很难。这是一些示例代码:
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
df = pd.DataFrame({'A': list(range(25)),
'B': list(range(25, 50)),
'C': list(range(50, 75))}, index=pd.date_range('20200101', periods=25))
fig = make_subplots(rows=3, cols=1)
for idx, col in enumerate(df.columns):
fig.add_trace(go.Scatter(x=df.index, y=df[col]), row=idx + 1, col=1)
shape_dict = {'type':'rect', 'xref':'x', 'yref':'paper', 'x0':'2020-01-03', 'x1':'2020-01-12', 'y0':0, 'y1':1, 'fillcolor': 'LightSalmon', 'layer': 'below', 'opacity': 0.25, 'line_width': 0}
如果我这样做 fig.update_layout(shapes=[shape_dict])
,那么我会得到这个:
还不错,但我更希望将这些形状中的每一个都单独放入它们自己的子图中。
当我尝试使用 add_shape
执行此操作时,阴影区域失去了缩放比例:
for idx, col in enumerate(df.columns):
fig.add_trace(go.Scatter(x=df.index, y=df[col]), row=idx + 1, col=1)
fig.add_shape(shape_dict, row=idx + 1, col=1)
这给了我这个:
我宁愿不要必须单独重新计算坐标轴。
我也无法访问 add_vrect
-- 我不确定为什么,但它作为一种方法不可用,我也无法使用 plotly.express
,而且大多数plot.ly 的文档使用 px
图表及其方法来执行我正在描述的内容。
编辑
为了回应下面的答案,add_vrect
不适用于我的 plotly 版本,即 4.12.0。
例如 r-beginners
returns 中的示例代码 我是这样的:
df = pd.DataFrame({'A': list(range(25)),
'B': list(range(25, 50)),
'C': list(range(50, 75))}, index=pd.date_range('20200101', periods=25))
fig = make_subplots(rows=3, cols=1)
for idx, col in enumerate(df.columns):
fig.add_trace(go.Scatter(x=df.index, y=df[col]), row=idx + 1, col=1)
# shape_dict = {'type':'rect', 'xref':'x', 'yref':'paper', 'x0':'2020-01-03', 'x1':'2020-01-12', 'y0':0, 'y1':1, 'fillcolor': 'LightSalmon', 'layer': 'below', 'opacity': 0.25, 'line_width': 0}
# fig.update_layout(shapes=[shape_dict])
fig.add_vrect(
x0="2020-01-03", x1="2020-01-12",
y0=0, y1=1,
fillcolor="LightSalmon", opacity=0.25,
layer="below", line_width=0)
fig.show()
Returns错误信息:AttributeError: 'Figure' object has no attribute 'add_vrect'
用 add_vrect()
将阴影输出到每个子图。比例也不受影响。这个答案是否符合您的问题意图?
import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
df = pd.DataFrame({'A': list(range(25)),
'B': list(range(25, 50)),
'C': list(range(50, 75))}, index=pd.date_range('20200101', periods=25))
fig = make_subplots(rows=3, cols=1)
for idx, col in enumerate(df.columns):
fig.add_trace(go.Scatter(x=df.index, y=df[col]), row=idx + 1, col=1)
# shape_dict = {'type':'rect', 'xref':'x', 'yref':'paper', 'x0':'2020-01-03', 'x1':'2020-01-12', 'y0':0, 'y1':1, 'fillcolor': 'LightSalmon', 'layer': 'below', 'opacity': 0.25, 'line_width': 0}
# fig.update_layout(shapes=[shape_dict])
fig.add_vrect(
x0="2020-01-03", x1="2020-01-12",
y0=0, y1=1,
fillcolor="LightSalmon", opacity=0.25,
layer="below", line_width=0,
)
fig.show()
我无法发表评论,所以将此作为(可能的)答案发布。
你在 Jupyter 中使用它吗?如果是这样,plotly 的 jupyterlab-plotly
扩展是否也更新了?如果不是,这可能解释了为什么您无法访问 add_vrect
方法。我认为 jupyterlab 扩展主要负责渲染,但它仍然可能会抛出找不到方法的错误。
check/update 最快的方法是 jupyter labextension update --all
.