The goal is to get vertical infinite lines in every subplot, at x=1. In this example, I'll just try a single plotly shape of type="line" in the first row, first column
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)
So it looks like adding a shape with row and column overrides the yref and xref properties, returning a segment of a line instead of an infinite line. Forcing yref to be "paper" before printing...
for shape in fig.layout.shapes:
shape["yref"]="paper"
This is arguably worse, a line that's relative to the whole figure instead of the subplot y axis. Has anyone stumbled with this problem before? Any ideas?