问题
How can I avoid duplicate legend labels in subplots? One way I would go about it in matplotlib would be to pass custom legend labels to an legend object. I couldn't find any documentation for an equivalent option in plotly. Any ideas?
traces = []
colors = {'Iris-setosa': 'rgb(31, 119, 180)',
'Iris-versicolor': 'rgb(255, 127, 14)',
'Iris-virginica': 'rgb(44, 160, 44)'}
for col in range(4):
for key in colors:
traces.append(Histogram(x=X[y==key, col],
opacity=0.75,
xaxis='x%s' %(col+1),
marker=Marker(color=colors[key]),
name=key
)
)
data = Data(traces)
layout = Layout(barmode='overlay',
xaxis=XAxis(domain=[0, 0.25], title='sepal length (cm)'),
xaxis2=XAxis(domain=[0.3, 0.5], title='sepal width (cm)'),
xaxis3=XAxis(domain=[0.55, 0.75], title='petal length (cm)'),
xaxis4=XAxis(domain=[0.8, 1], title='petal width (cm)'),
yaxis=YAxis(title='count'),
title='Distribution of the different Iris flower features')
fig = Figure(data=data, layout=layout)
py.iplot(fig)

回答1:
Plotly controls this on the trace level. Try passing in showlegend=False
inside the Histogram
traces that you don't want to appear in the legend.
Reference: https://plot.ly/python/reference/#Histogram-showlegend
Example: https://plot.ly/python/legend/#Hiding-Legend-Entries
Direct copy-paste from the link above.
import plotly.plotly as py
from plotly.graph_objs import *
# Fill in with your personal username and API key
# or, use this public demo account
py.sign_in('Python-Demo-Account', 'gwt101uhh0')
trace1 = Scatter(
x=[0, 1, 2],
y=[1, 2, 3],
name='First Trace',
showlegend=False
)
trace2 = Scatter(
x=[0, 1, 2, 3],
y=[8, 4, 2, 0],
name='Second Trace',
showlegend=True
)
data = Data([trace1, trace2])
plot_url = py.plot(data, filename='show-legend')
The usage you want to see is shown in trace1
above.
回答2:
A better way:
Set the legendgroup
option to the legend label you want for each trace.
This will allow you to filter everything in the same group.
Hide the remaining traces' legends using the showlegend=False
option.
This will give the exact behaviour you want.
Old Solution (Not recommended):
There is a another solution by adding "dummy" traces and hiding the data but only showing the legend. With this method you cannot slice any of the data (which is not a bad thing).
trace_dummy = Scatter(
x=[0, 0, 0], # Data is irrelevant since it won't be shown
y=[0, 0, 0],
name='Whatever Trace',
showlegend=True,
visible="legendonly"
)
来源:https://stackoverflow.com/questions/26939121/how-to-avoid-duplicate-legend-labels-in-plotly-or-pass-custom-legend-labels