繁体   English   中英

Python plotly treemap / sunburst with too many items

[英]Python plotly treemap / sunburst with too many items

有时,您在同一级别有很多数据,而无法显示所有数据。 一种解决方案是像在饼图中那样做,只放置前 75-90%,然后是大小为 rest 和 label“其他”的扇区。

我们能否利用树形表示,使“其他”部分可点击、可扩展和可探索?

这个想法应该是在下面的示例图的右下角有一个大方框,上面写着“休息”或“其他”或类似的东西,而不是很多小方框。

下图是使用 dataframe 和 plotly express 创建的带有很多框的示例图

它最终应该是这样的(用 GIMP 制作的图像) 样本所需的情节

我制作了一个 function,它创建了要传递给go.Treemap的数据。Treemap 基于https://plotly.com/python/treemaps/#treemap-chart-with-a-continuous-colorscale

在我的实现中, Other不是一片叶子,而是一个容器。

def _build_hierarchical_dataframe(df, levels, value_column):
    def _value(df, k=1):
        return df.groupby(levels[:k])[value_column].sum()

    def _build_id(dfg, i):
        if i > 0:
            return 'total/' + dfg[levels[:i]].agg('/'.join, axis=1)
        else:
            return 'total'
    
    top, rest = _top_rest_daos(df_values, 0.15)

    df_trees = []
    for i, level in enumerate(group_path):
        df_tree = pd.DataFrame(columns=['id', 'label', 'parent', 'value'])
        dfg = _value(top, i+1).reset_index()
        

        df_tree['label'] = dfg[level].copy()
        df_tree['parent'] = _build_id(dfg, i)
        df_tree['id'] = _build_id(dfg, i+1)
        if i == len(group_path) - 1:
            df_tree['value'] = dfg[value_column]
        else:
            df_tree['value'] = 0

        df_trees.append(df_tree)

    # Now to append the 'Rest' value (symbols parents)
    df_tree = pd.DataFrame(columns=['id', 'label', 'parent', 'value'])
    dfg = rest.groupby(['network'])[value_columnF].sum().reset_index()
    df_tree['parent'] = _build_id(dfg, 1)
    df_tree['id'] = df_tree['parent'] + '/other'
    df_tree['label'] = 'Others'
    df_tree['value'] = 0
    df_trees.append(df_tree)

    # Now to append the SYMBOLS into the 'Rest'
    df_tree = pd.DataFrame(columns=['id', 'label', 'parent', 'value', 'color', 'customData'])
    dfg = rest.groupby(['network', 'symbol'])[value_column].sum().reset_index()
    df_tree['parent'] = _build_id(dfg, 1) + '/other'
    df_tree['id'] = df_tree['parent'] + '/' + dfg['symbol']
    df_tree['label'] = dfg['symbol']
    df_tree['value'] = dfg[value_column]
    df_trees.append(df_tree)

    df_trees.append(pd.DataFrame({
        'id': ['total'],
        'label': ['All Networks'],
        'parent': [''],
        'value': [0]
    }))

    return pd.concat(df_trees, ignore_index=True, axis=0)

用法示例:

hdf = _build_hierarchical_dataframe(df_values.reset_index(), group_path, value_col)
fig = go.Figure(go.Treemap(
    ids=hdf['id'],
    labels=hdf['label'],
    parents=hdf['parent'],
    values=hdf['value']
))
fig.show()

这给了我们以下结果生成的树图

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM