gpt4 book ai didi

python - Plotly:如何在子图中制作无界垂直线?

转载 作者:行者123 更新时间:2023-12-01 06:46:11 25 4
gpt4 key购买 nike

目标是在 x=1 处的每个子图中获得垂直无限线。在此示例中,我将在第一行第一列中尝试使用 type="line"的单个绘图形状

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


fig = make_subplots(
rows=2,
cols=2,
subplot_titles=list(map(str, range(4))),
shared_xaxes=True,
shared_yaxes=False,
)

time = np.linspace(-np.pi, np.pi, 1000)

for i in range(4):
data = np.sin((i+1) * time)
fig.add_trace(
go.Scatter(y=data,x=time, name=str(i)),
row=1 if i in [0, 1] else 2,
col=1 if i in [0, 2] else 2,
)

fig.add_shape(
go.layout.Shape(
type="line",
yref="paper",
xref="x",
x0=1,
y0=0,
x1=1,
y1=1,
line=dict(color="RoyalBlue", width=3),
),row=1,col=1)

fig.write_image("1.png",width=800, height=600, scale=1)

Plot1

所以看起来添加一个带有行和列的形状会覆盖 yref 和 xref 属性,返回一段线而不是一条无限线。在打印之前强制 yref 为“纸张”...

for shape in fig.layout.shapes:
shape["yref"]="paper"

...我明白了: Plot2

这可以说更糟糕,一条相对于整个图而不是子图 y 轴的线。以前有人遇到过这个问题吗?有什么想法吗?

最佳答案

这是你想要的 plotly 吗?

enter image description here

如果是这种情况,那么您必须向由位置 row=i,col=j 定义的每个子图插入一个形状。下面的代码片段将为您做到这一点。如果您更改子图的总数,您只需要对网格的行数和列数进行一些监督即可。

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


fig = make_subplots(
rows=2,
cols=2,
subplot_titles=list(map(str, range(4))),
shared_xaxes=True,
shared_yaxes=False,
)

time = np.linspace(-np.pi, np.pi, 1000)

for i in range(4):
data = np.sin((i+1) * time)
fig.add_trace(
go.Scatter(y=data,x=time, name=str(i)),
row=1 if i in [0, 1] else 2,
col=1 if i in [0, 2] else 2,
)

colors = ['blue', 'firebrick', 'green', 'purple']
rows = 2
cols = 2

# add traces
counter=0 # for colors
for i in range(1,3):
for j in range(1,3):
fig.add_shape(go.layout.Shape(type="line",
yref="paper",
xref="x",
x0=1,
y0=-2,
x1=1,
y1=2,
#line=dict(color="RoyalBlue", width=3),),
line=dict(color=colors[counter], width=3),),
row=i,
col=j)
counter = counter + 1

fig.show()

评论后编辑:

据我所知,您不能直接定义无界。但是,只要您定义的轴限制远远超出您想要可视化的数据,您想要完成的任务就会效果很好。因为与您的评论相反,您可以像这样设置每个子图的轴限制:

# Set y ranges for each subplot
for i in range(1,3):
for j in range(1,3):
fig.update_yaxes(range=[-4, 4], row=i, col=j)

您可以从数据集中找到正确的最大值和最小值,而不是预定义的限制。

图 2:未缩放

enter image description here

图 3:缩小

enter image description here

希望这对您有所帮助!

关于python - Plotly:如何在子图中制作无界垂直线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59214406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com