[英]Python plotly treemap / sunburst with too many items
我制作了一个 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.