【问题标题】:How to format plotly legend when using marker color?使用标记颜色时如何格式化图例?
【发布时间】:2021-12-14 10:46:56
【问题描述】:

我想跟进这个帖子:Plotly: How to colorcode plotly graph objects bar chart using Python?

当使用 plotly express 并指定“颜色”时,可以正确生成图例,如 vestland 帖子中所见。

这是我的快速表达代码:

data = {'x_data': np.random.random_sample((5,)),
        'y_data': ['A', 'B', 'C', 'D', 'E'],
        'c_data': np.random.randint(1, 100, size=5)
       }

df = pd.DataFrame(data=data)

fig = px.bar(df,
             x='x_data',
             y='y_data',
             orientation='h',
             color='c_data',
             color_continuous_scale='YlOrRd'
            )
fig.show()

但是在使用 go.Bar 时,图例显示不正确,如下图所示:

这是我使用图形对象的代码:

bar_trace = go.Bar(name='bar_trace',
               x=df['x_data'],
               y=df['y_data'],
               marker={'color': df['c_data'], 'colorscale': 'YlOrRd'},
               orientation='h'
              )

layout = go.Layout(showlegend=True)

fig = go.FigureWidget(data=[bar_trace], layout=layout)

fig.show()

我正在学习如何使用 FigureWidget,但它似乎无法使用 plotly express,所以我必须学习如何使用图形对象进行绘图。如何将图例链接到数据,以便它像vestland 帖子中的情节表达示例一样工作。

【问题讨论】:

    标签: python plotly-python


    【解决方案1】:

    这实际上归结为了解高级 API(plotly express)的作用。当您在 px 中指定 color 时,如果它是分类的,它会为每个分类值创建一个跟踪。因此,以下两种创建图形的方法大多是等效的。图例为每条轨迹显示一个项目,而不是每种颜色。

    import pandas as pd
    import plotly.express as px
    import plotly.graph_objects as go
    import numpy as np
    
    df = pd.DataFrame({"x":np.linspace(0,10,10), "y":np.linspace(5,15,10), "color":np.random.choice(list("ABCD"),10)})
    
    px.bar(df, x="x", y="y", color="color", orientation="h").show()
    
    fig = go.Figure()
    for g in df.groupby("color"):
        fig.add_trace(go.Bar(x=g[1]["x"], y=g[1]["y"], name=g[0], orientation="h"))
    
        
    fig
    

    基于cmets的补充

    • 如果您使用FigureWidget(),则不必使用图形对象,如第二张图所示,使用plotly express创建,然后生成FigureWidget()
    • 对于连续数据,正常模式是使用单个迹线和颜色条(也在第二个图中演示)。但是,如果您想要一个离散的图例,请在 c_data 中为每个值创建一个跟踪并使用 https://plotly.com/python-api-reference/generated/plotly.colors.html sample_colorscale()
    import plotly.express as px
    import plotly.colors
    import plotly.graph_objects as go
    import numpy as np
    import pandas as pd
    
    # simulate data frame...
    df = pd.DataFrame(
        {
            "x_data": np.linspace(0, 10, 10),
            "y_data": np.linspace(5, 15, 10),
            "c_data": np.random.randint(0, 4, 10),
        }
    )
    
    # build a trace per value in c_data using graph objects ... correct legend !!??
    bar_traces = [
        go.Bar(
            name="bar_trace",
            x=d["x_data"],
            y=d["y_data"],
            marker={
                "color": plotly.colors.sample_colorscale(
                    "YlOrRd",
                    d["c_data"] / df["c_data"].max(),
                )
            },
            orientation="h",
        )
        for c, d in df.groupby("c_data")
    ]
    
    layout = go.Layout(showlegend=True)
    
    fig = go.FigureWidget(data=bar_traces, layout=layout)
    fig.show()
    
    fig = px.bar(
        df,
        x="x_data",
        y="y_data",
        color="c_data",
        orientation="h",
        color_continuous_scale="YlOrRd",
    )
    fig = go.FigureWidget(data=fig.data, layout=fig.layout)
    fig.show()
    

    【讨论】:

    • 感谢您的回复。我是 plotly 的新手,也不是开发人员。但是你能解释一下它是如何处理连续数据的吗?我真的在文档中找不到任何东西来解决这个问题。
    • 对于连续数据,通常使用颜色条,为一系列值分配颜色。因此,通常对于连续系列,您不会使用屏幕截图中的图例,而是使用彩条。选项的排列很大,我只能抽象地解释,因为你没有提供你是如何生成你的条形图的
    • 我已经编辑了我的原始帖子以包含我的代码示例。我基本上试图在 plotly express 中为图形对象复制参数。
    • 好的 - 添加了补充更新以显示 a) 在图形对象中使连续颜色缩放器离散,图例显示每个离散值的值 b) 如何使用连续的 plotly express 和图形小部件跨度>
    • 谢谢!没有意识到我在使用 FigureWidget() 时不必使用图形对象。该文档以某种方式向我暗示我不能使用 plotly express,因为它只有图形对象示例。
    猜你喜欢
    • 2021-01-16
    • 2021-10-30
    • 1970-01-01
    • 2021-10-27
    • 2013-06-14
    • 2019-03-01
    • 2018-02-11
    • 1970-01-01
    • 2011-09-25
    相关资源
    最近更新 更多