如何避免重复的图例标签或通过自定义图例标签

Posted

技术标签:

【中文标题】如何避免重复的图例标签或通过自定义图例标签【英文标题】:How to avoid duplicate legend labels in plotly or pass custom legend labels 【发布时间】:2015-01-12 09:12:05 【问题描述】:

如何避免子图中重复的图例标签?我在 matplotlib 中进行此操作的一种方法是将自定义图例标签传递给图例对象。我在 plotly 中找不到任何等效选项的文档。有任何想法吗?

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 在跟踪级别上控制它。尝试在您不想出现在图例中的Histogram 跟踪中传递showlegend=False

参考:https://plot.ly/python/reference/#Histogram-showlegend

示例:https://plot.ly/python/legend/#Hiding-Legend-Entries

从上面的链接直接复制粘贴。

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所示。

【讨论】:

@SebastianRaschka 但是如果trace1 的图例被隐藏了,那么你就无法控制或隐藏trace1 的踪迹。 如果需要循环生成绘图,您可以使用set 来跟踪已将哪个轨迹名称添加到图形中,然后使用showlegend=True if tracename not in set_tracenames else False【参考方案2】:

更好的方法:

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"
)

【讨论】:

我不明白如何将legendgroup 用于此目的。你能详细说明一下吗? 看看https://plotly.com/python/legend/#grouped-legend的分组图例部分 @A.Donda 如果你想过滤掉属于图例的数据,使用showlegend=False只会过滤掉部分数据,因为另一部分的图例是隐藏的。但是如果你使用legendgroup,过滤掉图例中显示的部分也会过滤掉隐藏的部分,因为它们在同一个图例组中【参考方案3】:

这是我想出的一个代码 sn-p,它避免在每个跟踪上手动设置 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),并隐藏重复(或三次,...)名称的图例条目。

代码需要在所有跟踪都添加到图形之后运行,在shown之前。

【讨论】:

以上是关于如何避免重复的图例标签或通过自定义图例标签的主要内容,如果未能解决你的问题,请参考以下文章

自定义图例 pie highchart 到标签 div

R语言ggplot2可视化自定义多个图例(legend)标签之间的距离实战(例如,改变数据点颜色和数据点大小图例之间的距离)

Plotly:如何自定义图例?

R语言使用ggpubr包的ggbarplot函数可视化水平偏差条形图(计算数值的z-score自定义填充色自定义条形边缘色自定义调色板条形图全局排序从小到大文本标签角度添加图例标签轴标签

R语言使用ggpubr包的ggbarplot函数可视化偏差条形图(计算数值的z-score自定义填充色自定义条形边缘色自定义调色板条形图全局排序从小到大文本标签角度添加图例标题轴标签)

AttributeError:'NoneType'对象没有属性'legendHandles',而在自定义图例中为每个标签手动分配颜色时