【问题标题】:Plotly bar chart legend within subplot在子图中绘制条形图图例
【发布时间】:2022-11-10 23:21:22
【问题描述】:

我想知道如何根据彩色条而不是单个跟踪图制作图例。在这种情况下,图例应基于'giraffes', 'orangutans', 'monkeys'。

import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots

fig = make_subplots(
    rows=1, 
    cols=3, 
    subplot_titles=('Zoo1',  'Zoo2', 'Zoo3'))

fig.add_trace(go.Bar(
    y=['giraffes', 'orangutans', 'monkeys'],
    x=[21, 15, 23],
    orientation='h',
    marker_color=["#00573C", '#9BD7BE', '#990012']),
    row=1, col=1)

fig.add_trace(go.Bar(
    y=['giraffes', 'orangutans', 'monkeys'],
    x=[15, 31, 23],
    orientation='h',
    marker_color=["#00573C", '#9BD7BE', '#990012']),
    row=1, col=2)

fig.add_trace(go.Bar(
    y=['giraffes', 'orangutans', 'monkeys'],
    x=[11, 32, 23],
    orientation='h',
    marker_color=["#00573C", '#9BD7BE', '#990012']),
    row=1, col=3)

fig.show()

【问题讨论】:

    标签: python plotly plotly-python


    【解决方案1】:

    Plotly 采用每个子图中最后一个条形的颜色并将其分配给图例,即绿色。要解决此问题,您可以更改构建子图的方式。我分别在每个子图中构建每个条形图,以便能够在图例中显示它,如下面的代码所示:

    例子:

    import pandas as pd
    import plotly.graph_objects as go
    from plotly.subplots import make_subplots
    
    no_cols = 3
    fig = make_subplots(
        rows=1, 
        cols=no_cols, 
        subplot_titles=('Zoo1',  'Zoo2', 'Zoo3'))
    
    y=['giraffes', 'orangutans', 'monkeys', 'cat', 'dog'] 
    x=[[15, 10, 6, 21, 43],[5, 10, 12, 21, 43],[30, 32, 23, 21, 44]] 
    colors=["#00573C", '#9BD7BE', '#990012', '#9BD7BE', '#990012']
    
    for i in range(1,no_cols+1):
        for value,animal,color in zip(x[i-1],y,colors):
            fig.add_trace(go.Bar(
                y=[animal],
                x=[value],
                orientation='h',
                marker_color=color, 
                name=animal,
                showlegend= i==len(y)),
                row=1, col=i)
        
    fig.show()
    

    输出:

    【讨论】:

    • 谢谢!似乎该解决方案仅适用于三个子图表中的x 值相同的情况。如果x 值不同,它是如何工作的,因为这更常见 - 我已将 x 值更新为不同。
    • @codedancer我相应地更新了答案。
    • 谢谢。但是,如果 x 由于IndexError: list index out of rangez 在子列表中有更多值,它仍然会中断。我在尝试:y=['giraffes', 'orangutans', 'monkeys', 'cat', 'dog']x=[[15, 14, 16, 21, 434],[5, 3, 2, 21, 434],[30, 32, 23, 21, 434]]colors=["#00573C", '#9BD7BE', '#990012', '#9BD7BE', '#990012']
    • @codedancer ,代码根据您的上一个示例进行更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多