【问题标题】:plotly sankey graph data formattingplotly sankey 图数据格式
【发布时间】:2021-11-26 12:30:08
【问题描述】:

plotly 库有一些漂亮的 sankey 图 https://plotly.com/python/sankey-diagram/

但数据要求您传递源/目标对的索引。

    link = dict(
      source = [0, 1, 0, 2, 3, 3], # indices correspond to labels, eg A1, A2, A1, B1, ...
      target = [2, 3, 3, 4, 4, 5],

我想知道是否有一个 API 可以简单地传递这些对的命名列表?

links = [
    {'source': 'start', 'target': 'A', 'value': 2},
    {'source': 'A', 'target': 'B', 'value': 2},
...
]

这更符合bokeh/holoviews 期望数据(但 sankey 不适用于自循环)

还有这个pysankey widget

所以我可以在不处理所有内容的情况下更接近我的数据框?

或者,有没有一种很好的 Pythonic 方法可以将其转换为单行:D

【问题讨论】:

    标签: python dataframe plotly sankey-diagram


    【解决方案1】:
    • 结构显然是 pandas 数据帧构造函数格式
    • 从中创建一个数据框,以及节点的关键系列
    • 由此可以很简单地构建一个桑基图
    import pandas as pd
    import numpy as np
    import plotly.graph_objects as go
    
    links = [
        {'source': 'start', 'target': 'A', 'value': 2},
        {'source': 'A', 'target': 'B', 'value': 1},
        {'source': 'A', 'target':'C', 'value':.5}
    
    ]
    
    df = pd.DataFrame(links)
    nodes = np.unique(df[["source","target"]], axis=None)
    nodes = pd.Series(index=nodes, data=range(len(nodes)))
    
    go.Figure(
        go.Sankey(
            node={"label": nodes.index},
            link={
                "source": nodes.loc[df["source"]],
                "target": nodes.loc[df["target"]],
                "value": df["value"],
            },
        )
    )
    
    

    【讨论】:

    • 不错!所以你更喜欢nodes = np.unique(df.loc[:,["source","target"]].values.ravel()) 而不是键上的列表理解? [:,ravel 对我来说有点难以阅读......但我没有更简单的选择。
    • numpy.org/doc/stable/reference/generated/… 会做同样的事情。我一直在使用 pandas 和 numpy 很长一段时间,所以对这些成语感到满意...... :-) 也许这更易读np.unique(df[["source","target"]].values.flatten()) 以提高可读性
    • nodes = np.unique(df[["source","target"]], axis=None) 更简洁...
    • 好多了,谢谢!你想编辑你的答案吗?反正我接受了
    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 2019-08-13
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    • 2022-10-06
    相关资源
    最近更新 更多