繁体   English   中英

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)

情节 1

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

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

...我明白了: 情节2

这可以说更糟,一条相对于整个图形而不是子图 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/horizo​​ntal-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM