如何正确使用
treemap
和键 ids
来表示包含重复名称的分层数据集?
最基本的,我想重现一个类似于以下内容的树形图:
import plotly.express as px
fig = px.treemap(
parents = ["", "Anna","Anna", "Bert", "Bert", "Belen", "Belen", "Belen", "Cristiano"],
names = ["Anna","Bert","Belen","Charlie","Chris","Carlos","Camila","Cristiano", "Diego"],
)
fig.update_traces(root_color="lightgrey")
fig.show()
产生这个数字:
问题1:如果名字重复,例如:假设“Carlos”同时出现在“Belen”和“Bert”下,那么(由于不明确)该数字为空白。为了解决歧义,我将使用键
ids
。
假设我有一个数据集(teams.csv):
ltree,name,parent
,Anna,
Bert,Bert,Anna
Belen,Belen,Anna
Bert-Carlos,Carlos,Bert
Bert-Chris,Chris,Bert
Belen-Carlos,Carlos,Belen
Belen-Camila,Camila,Belen
Belen-Cristiano,Cristiano,Belen
Belen-Cristiano-Diego,Diego,Cristiano
其中第一列是 ltree 类型的路径(来自 Postgres 数据库),我将在绘图树形图方法中将其用作
ids
。
import plotly.express as px
import pandas as pd
df = pd.read_csv("teams.csv")
df = df.fillna('')
fig = px.treemap(df,
parents=df.parent,
names=df.name,
ids=df.ltree,
# path=[px.Constant('Anna'),'parent', 'name']
)
fig.show()
这会产生一个空白视图。
问题 2:如果我从 csv 数据集中删除最后一行,
df = df.fillna('').head(-1)
然后树形图能够渲染图形,但不完整。
我尝试将 ltree 路径格式更改为
Belen-Cristiano-Diego
到 Root-Belen-Cristiano-Diego
或(“Anna”而不是“Root”)。
我还尝试了帖子中的解决方案Plotly树状图中的重复数据删除第一行(即根):
df = df.fillna('').tail(-1)
fig = px.treemap(df,
path=[px.Constant('Anna'),'parent', 'name']
)
fig.show()
它呈现了一个图形,但它是错误的层次结构。
我不知道我对
ids
做错了什么,因为 ltree 路径具有唯一值,或者我应该如何格式化/编辑 ltree 路径。
与
ids
一样,您可以使用与名称相同的项目,但重复项除外,因为 ids
显然必须是唯一的。在重复项上,您使用不同且唯一的标签。使用路径作为重复项的 id 是非常好的。
实践中:
dup = df['name'].duplicated()
df.loc[~dup, 'ltree'] = df.loc[~dup, 'name']
意味着您找到重复项的位置
dup
,并使用名称作为名称不重复的id。简而言之,这使得列 ltree
几乎在所有位置都等于 name
,并且记录 Belen-Carlos
保持不变。
ltree,name,parent
...
Carlos,Carlos,Bert
Chris,Chris,Bert
Belen-Carlos,Carlos,Belen
最后,渲染图形:
import plotly.express as px
df = df.fillna('')
fig = px.treemap(df,
parents=df.parent,
names=df.name,
ids=df.ltree,
)
fig.update_traces(root_color="lightgrey")
fig.show()
关于我的答案的警告:阅读https://plotly.com/python/reference/treemap的文档,我承认我仍然不完全理解
ids
如何工作或应该使用,这个答案确实不完全遵循那里的说明。