Как избежать дублирования надписей легенды в сюжете или передавать пользовательские надписи легенды
Как я могу избежать дублирования надписей легенды в подсюжетах? Один из способов, с помощью которого я могу сделать это в matplotlib, - передать пользовательские метки легенды объекту легенды. Я не мог найти документацию для эквивалентного варианта в сюжете. Есть идеи?
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)
2 ответа
Полностью контролирует это на уровне трассировки. Попробуйте пройти в showlegend=False
внутри Histogram
следы, которые вы не хотите появляться в легенде.
Ссылка: https://plot.ly/python/reference/
Пример: https://plot.ly/python/legend/
Прямая копия-вставка по ссылке выше.
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')
Использование, которое вы хотите увидеть, показано в trace1
выше.
Это фрагмент кода, который я придумал, в котором не нужно устанавливать showlegend=False
вручную на каждой трассе с дубликатом name
.
names = set()
fig.for_each_trace(
lambda trace:
trace.update(showlegend=False)
if (trace.name in names) else names.add(trace.name))
fig.for_each_trace
вызывает переданную функцию для каждой трассы. Функция отслеживает, какие имена легенды уже встречались (через наборnames
, как @LucG, предложенный в комментарии), и скрывает записи легенды для повторяющихся (или трехкратных, ...) имен.
Код нужно запускать после того, как все трассировки были добавлены к рисунку, но до того, как он show
п.
Лучший способ:
Установить legendgroup
Опция к метке легенды, которую вы хотите для каждой трассы. Это позволит вам отфильтровать все в одной группе.
Скройте легенды оставшихся следов, используя showlegend=False
вариант.
Это даст точное поведение, которое вы хотите.
Старое решение (не рекомендуется):
Существует еще одно решение, добавляющее "фиктивные" следы и скрывающее данные, но только показывающее легенду. С помощью этого метода вы не можете разрезать какие-либо данные (что не так уж плохо).
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"
)