情节自定义图例

Plotly Custom Legend

我有一个看起来像这样的情节:

我使用的代码如下:

fig = make_subplots(specs=[[{"secondary_y": True}]])
fig.add_trace(go.Scatter( x = pf['Timestamp'], y = pf['Price_A'], name ='<b>A</b>', 
                           mode = 'lines+markers', 
                           marker_color = 'rgba(255, 0, 0, 0.8)', 
                           line = dict(width = 3 ), yaxis = "y1"),  
                           secondary_y=False,)

fig.add_trace(go.Scatter( x = df['Timestamp'], y = df['Price_B'], name='<b>B</b>', 
                           mode = 'lines+markers', 
                           marker_color = 'rgba(0, 196, 128, 0.8)', 
                           line = dict(width = 3 ), yaxis = "y1") , 
                           secondary_y=False,)

for i in pf2['Timestamp']:
   fig.add_vline(x=i, line_width=3, line_dash="dash", line_color="purple", 
                 name='Event')

fig.update_layout( title="<b>Change over Time</b>", font=dict( family="Courier New, 
                    monospace", size=16, color="RebeccaPurple"),
                    legend=dict(
                           yanchor="top",
                           y=0.99,
                           xanchor="left",
                           x=0.01
                    ))

如何在图例中为垂直线表示的事件添加条目?

当您使用 add_vline 时,您正在添加一个没有相应图例条目的注释。

您需要改为使用 go.Scatter 绘制垂直线,将数据中的最小值和最大值(加上或减去一些填充)传递给 y 参数。然后你可以为你的情节设置相同的 y-range 。这将使您看起来像垂直线,同时仍显示整个数据范围。

更新:您可以使用图例组,以便垂直线在图例中显示为单个条目

例如:

from pkg_resources import yield_lines
import plotly.express as px
import plotly.graph_objects as go

fig = go.Figure()

df = px.data.stocks()
for col in ['GOOG','AMZN']:
    fig.add_trace(go.Scatter(
        x=df['date'],
        y=df[col]
    ))

vlines = ["2018-07-01","2019-04-01","2019-07-01"]
min_y,max_y = df[['GOOG','AMZN']].min().min(), df[['GOOG','AMZN']].max().max()
padding = 0.05*(max_y-min_y)
for i,x in enumerate(vlines):
    fig.add_trace(go.Scatter(
        x=[x]*2,
        y=[min_y-padding, max_y+padding],
        mode='lines',
        line=dict(color='purple', dash="dash"),
        name="vertical lines",
        legendgroup="vertical lines",
        showlegend=True if i == 0 else False
    ))

fig.update_yaxes(range=[min_y-padding, max_y+padding])
fig.show()