简体   繁体   English

Python:在 Plotly 的子图中共享图例

[英]Python: Share legend among subplots in Plotly

I am trying to plot a graph with two subplots, however i am getting separate legends with same names.我试图用两个子图绘制一个图形,但是我得到了具有相同名称的单独图例。

import plotly as py
import plotly.graph_objs as go

trace0 = go.Scatter(
    x=[1, 2, 3, 4, 5],
    y=[1, 2, 3, 4, 5],
    xaxis='x1', yaxis='y1',
    name='legend'
)

trace1 = go.Scatter(
    x=[1, 2, 3, 4, 5],
    y=[5, 4, 3, 2, 1],
    xaxis='x2', yaxis='y2',
    name='legend'
)

data = [trace0, trace1]
layout = go.Layout(
    legend=dict(
        x=0,
        y=1,
        traceorder='normal',
        font=dict(
            family='sans-serif',
            size=12,
            color='#000'
        ),
        bgcolor='#E2E2E2',
        bordercolor='#FFFFFF',
        borderwidth=2
    ),
    annotations=[
        dict(
            x=0,
            y=1.05,
            xref='paper',
            yref='paper',
            text='Legend Title',
            showarrow=False
        )
    ]
)

layout = go.Layout(
                xaxis1=dict(
                    domain=[0, 0.45],
                   
                ),
                yaxis1=dict(
                    domain=[0.75, 1],
                    
                ),
                yaxis2=dict(
                    domain=[0.75, 1],
                    anchor="x2"
                ),
                xaxis2=dict(
                    domain=[0.55, 1],
                    showticklabels=False
                )

            )
fig = go.Figure(data=data, layout = layout)

iplot(fig)

What i am expecting?我在期待什么?

Have a common legend for both the plots.两个情节都有一个共同的传说。 I should be able to isolate the traces when i hover/click the legend(all the common legends should be isolated)当我悬停/单击图例时,我应该能够隔离痕迹(所有常见的图例都应该被隔离)

if i click on 'legend' from fig1, 'legend' from fig2 should also be isolated since they share the common legend.如果我单击 fig1 中的“legend”,则 fig2 中的“legend”也应该被隔离,因为它们共享共同的图例。

Kindly advice.友善的建议。

It sounds like you're wanting to control related traces via a single legend item.听起来您想通过单个图例项控制相关跟踪。 If I've understood correctly, have a look below.如果我理解正确,请看下面。

The key attributes to note are: legendgroup and showlegend .要注意的关键属性是: legendgroupshowlegend Here is a link to Plotly's docs on the subject .这是有关该主题的 Plotly 文档的链接。

Sample Code:示例代码:

import numpy as np
from plotly.offline import iplot

# Creating a dataset.
x = np.linspace(0, np.pi*2, 250)
y1 = [np.sin(i) for i in x]
y2 = [np.cos(i) for i in x]
y3 = [np.sin(i) for i in x**2]
y4 = [np.cos(i) for i in x**2]

# Plot the data with grouped legends.
data = []
layout = {}
data.append({'x': x, 'y': y1, 'name': 'sin', 'legendgroup': 'sin'})
data.append({'x': x, 'y': y2, 'name': 'cos', 'legendgroup': 'cos'})
data.append({'x': x, 'y': y3, 'yaxis': 'y2', 'name': 'sin', 'legendgroup': 'sin', 'showlegend': False})
data.append({'x': x, 'y': y4, 'yaxis': 'y2', 'name': 'cos', 'legendgroup': 'cos', 'showlegend': False})

layout['xaxis1'] = {'domain': [0.00, 1.00], 'anchor': 'y2'}
layout['yaxis1'] = {'domain': [0.55, 1.00]}
layout['yaxis2'] = {'domain': [0.00, 0.45]}

iplot({'data': data, 'layout': layout})

Output:输出:

Notice that in Figure 1, both the sin and cos traces are showing in both graphs.请注意,在图 1 中,sin 和 cos 轨迹都显示在两个图中。 Then, in Figure 2, I have turned off the cos trace, in both graphs, using the single legend item.然后,在图 2 中,我使用单个图例项关闭了两个图中的 cos 跟踪。

Figure 1:图1:

在此处输入图片说明

Figure 2:图 2:

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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