如何在Plotly中创建双向旭日图,内外分展VOLUME与AGE?
基于VOLUME和AGE的旭日图实现(Python)
可以用Plotly轻松实现你要的旭日图,核心是构建层级化结构,让内层展示AGE、外层对应实体的VOLUME数值。以下是具体实现方案:
方案1:Plotly Express 快速实现
直接利用px.sunburst的path参数定义层级,内层为AGE,外层为每个ID,ID对应的大小由VOLUME决定:
import pandas as pd import plotly.express as px # 初始化你的DataFrame data = { "ID": ["95001", "27024", "90404", "90483"], "VOLUME": [231, 352, 421, 213], "AGE": [15, 9, 11, 30] } df = pd.DataFrame(data) # 绘制旭日图 fig = px.sunburst( df, path=["AGE", "ID"], # 层级:内层AGE -> 外层ID values="VOLUME", # 外层节点大小对应VOLUME title="AGE与VOLUME分布旭日图", color="AGE", # 按AGE区分颜色 color_continuous_scale=px.colors.sequential.Blues ) # 调整图内边距 fig.update_layout(margin=dict(t=50, l=0, r=0, b=0)) fig.show()
这个方案生成的旭日图中:
- 中心内层是各个AGE值
- 外层是对应AGE下的实体ID,每个ID区块的大小直接反映VOLUME数值
- 鼠标hover时还能查看具体的VOLUME和AGE数据
方案2:自定义层级(含总节点)
如果需要在最中心添加一个总数据节点,展示所有VOLUME的总和,可以手动构建层级数据:
import pandas as pd import plotly.express as px data = { "ID": ["95001", "27024", "90404", "90483"], "VOLUME": [231, 352, 421, 213], "AGE": [15, 9, 11, 30] } df = pd.DataFrame(data) # 构建旭日图所需的层级数据集 # 1. 总节点(最中心) root = pd.DataFrame({ "name": ["总数据"], "parent": [""], "value": [df["VOLUME"].sum()] }) # 2. AGE节点(内层) age_nodes = df.groupby("AGE")["VOLUME"].sum().reset_index() age_nodes = age_nodes.rename(columns={"AGE": "name", "VOLUME": "value"}) age_nodes["parent"] = "总数据" # 3. ID节点(外层,对应VOLUME) id_nodes = df.rename(columns={"ID": "name", "VOLUME": "value"}) id_nodes["parent"] = df["AGE"].astype(str) # 可选:在ID标签中加入AGE信息 id_nodes["name"] = id_nodes["name"] + "(AGE:" + df["AGE"].astype(str) + ")" # 合并所有节点 sunburst_data = pd.concat([root, age_nodes, id_nodes], ignore_index=True) # 绘制旭日图 fig = px.sunburst( sunburst_data, names="name", parents="parent", values="value", title="带总节点的AGE-VOLUME旭日图", color="parent", color_discrete_sequence=px.colors.qualitative.Pastel ) fig.update_layout(margin=dict(t=50, l=0, r=0, b=0)) fig.show()
其他工具选项
如果不想用Plotly,也可以用matplotlib配合squarify库绘制类似的树状旭日图,但交互性会弱一些。不过Plotly的交互能力更适合查看具体数据细节。
内容的提问来源于stack exchange,提问作者AnyNaughtyEgg
相关产品推荐
相关产品推荐

