【问题标题】:Plotly: How to create sunburst subplot using graph_objects?Plotly:如何使用 graph_objects 创建旭日形子图?
【发布时间】:2020-04-16 01:17:28
【问题描述】:

我的数据框看起来像这样:

    user    age   gender
0    23     12     male
1    24     13     male
2    25     15     female
3    26     20     male
4    27     21     male

并使用

px.sunburst(df, path=["gender", "age"])

给我正确的旭日形图,其中性别位于饼图的中间部分,并且每个性别都与年龄相关。

我想使用 graph_objects 而不是 plotly express 来做到这一点,因为我希望两个旭日形图并排。

来自 df 我上面有我如何在 graph_objects 中使用它。我不明白要为标签、父母、ID 等添加什么值...

fig = go.Figure()

fig.add_trace(
    go.Sunburst(
        lables = df.age,
        parents = df.gender,
        domain=dict(column=0)
    )
)

fig.show()

我已阅读文档,但我无法理解它是如何工作的。如果有人知道,请告诉我如何使用 graph_object 和上面的 df 创建旭日形图。

【问题讨论】:

    标签: python plotly plotly-python


    【解决方案1】:

    答案:

    只需使用 px 构建一个图形,然后从那里“窃取”所有图形元素并在 graph_objects 图形中使用它来获得您需要的东西!


    详情:

    如果px 确实为您提供了所需的旭日图,如下所示:

    情节 1:

    代码 1:

    # imports
    import pandas as pd
    import plotly.graph_objects as go
    import plotly.express as px
    
    # data
    df = pd.DataFrame({'user':  [23, 24, 25,    26, 27],
                       'age':   [12, 13,15, 20, 21],
                       'gender':    ['male','male', 'female','male', 'male'] })
    
    # plotly express figure
    fig = px.sunburst(df, path=["gender", "age"])
    fig.show()
    

    然后,据我所知,您必须重组数据才能使用graph_objects。目前,您的数据具有以下形式

    而graph_objects 需要label = ['12', '13', '15', '20', '21', 'female', 'male']。所以现在怎么办?经历为每个元素找到正确数据结构的痛苦吗?不,只需使用px 构建一个 图形,然后从那里“窃取”所有图形元素并在graph_objects 图形中使用它:

    代码 2:

    # imports
    import pandas as pd
    import plotly.graph_objects as go
    import plotly.express as px
    
    # data
    df = pd.DataFrame({'user':  [23, 24, 25,    26, 27],
                       'age':   [12, 13,15, 20, 21],
                       'gender':    ['male','male', 'female','male', 'male'] })
    
    # plotly express figure
    fig = px.sunburst(df, path=["gender", "age"])
    
    # plotly graph_objects figure
    fig2 =go.Figure(go.Sunburst(
                    labels=fig['data'][0]['labels'].tolist(),
                    parents=fig['data'][0]['parents'].tolist(),
                                )
                    )
    fig2.show()
    

    情节 2:

    现在,如果您想在同一张图中显示数据集的更多特征,只需添加 ids=fig['data'][0]['ids'].tolist() 即可:

    情节 3:

    完整代码:

    # imports
    import pandas as pd
    import plotly.graph_objects as go
    import plotly.express as px
    
    # data
    df = pd.DataFrame({'user':  [23, 24, 25,    26, 27],
                       'age':   [12, 13,15, 20, 21],
                       'gender':    ['male','male', 'female','male', 'male'] })
    
    # plotly express figure
    fig = px.sunburst(df, path=["gender", "age"])
    
    # plotly graph_objects figure
    fig2 =go.Figure(go.Sunburst(
        labels=fig['data'][0]['labels'].tolist(),
        parents=fig['data'][0]['parents'].tolist(),
        values=fig['data'][0]['values'].tolist(),
        ids=fig['data'][0]['ids'].tolist(),
        domain={'x': [0.0, 1.0], 'y': [0.0, 1.0]}
    ))
    
    fig2.show()
    

    【讨论】:

    • 感谢您的宝贵时间和精彩的解释!
    • @Ambleu 乐于助人!
    • 很好的解释。谢谢!节省了我很多时间
    • 谢谢先生。但我有一个问题,我怎样才能让它看起来像一个完整的圆圈,而不是它的一部分?
    • @Tugay 你需要添加 branchvalues='total'。更多信息plotly.com/python/sunburst-charts/#branchvalues
    猜你喜欢
    • 2021-01-02
    • 2020-09-05
    • 1970-01-01
    • 2020-07-22
    • 2021-09-09
    • 2020-11-14
    • 1970-01-01
    • 2022-01-04
    • 2020-03-17
    相关资源
    最近更新 更多