Plotly:如何在子图中制作一条无界的垂直线?
Plotly: how to make an unbounded vertical line in a subplot?
目标是在 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)
所以看起来添加具有行和列的形状会覆盖 yref 和 xref 属性,返回线段而不是无限线。
打印前强制 yref 为 "paper"...
for shape in fig.layout.shapes:
shape["yref"]="paper"
...我明白了:
这可以说更糟,一条相对于整个图形而不是子图 y 轴的线。以前有没有人遇到过这个问题?有什么想法吗?
这是你想要的情节吗?
如果是这种情况,那么您必须为每个由位置 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: 未缩放
情节 3: 缩小
希望对您有所帮助!
add_vline
/add_hline
方法在 4.12.0 中添加用于垂直和水平线。其他形状也类似。参见 https://plotly.com/python/horizontal-vertical-shapes/。这些文档中的一个示例:
import plotly.express as px
df = px.data.iris()
fig = px.scatter(df, x="petal_length", y="petal_width")
fig.add_hline(y=0.9)
fig.add_vrect(x0=0.9, x1=2)
fig.show()
目标是在 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)
所以看起来添加具有行和列的形状会覆盖 yref 和 xref 属性,返回线段而不是无限线。 打印前强制 yref 为 "paper"...
for shape in fig.layout.shapes:
shape["yref"]="paper"
...我明白了:
这可以说更糟,一条相对于整个图形而不是子图 y 轴的线。以前有没有人遇到过这个问题?有什么想法吗?
这是你想要的情节吗?
如果是这种情况,那么您必须为每个由位置 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: 未缩放
情节 3: 缩小
希望对您有所帮助!
add_vline
/add_hline
方法在 4.12.0 中添加用于垂直和水平线。其他形状也类似。参见 https://plotly.com/python/horizontal-vertical-shapes/。这些文档中的一个示例:
import plotly.express as px
df = px.data.iris()
fig = px.scatter(df, x="petal_length", y="petal_width")
fig.add_hline(y=0.9)
fig.add_vrect(x0=0.9, x1=2)
fig.show()