[英]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 和外部參照屬性,返回一條線段而不是無限線。 在打印前強制 yref 為“紙”...
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
方法是在add_hline
中為垂直和水平線添加的。 其他形狀也類似。 參見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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.