我正在尝试创建一个情节性的旭日图,但收到错误消息:"dtype:对象,'不是叶子。



我正在尝试创建一个不同行具有不同长度的sunburst图,并得到错误消息"dtype:object,"不是叶。"我读过这篇文章"注意,None条目的父项必须是叶,即它不能有None以外的其他子项(否则会引发ValueError(。"在情节丰富的页面上https://plotly.com/python/sunburst-charts/#rectangular-缺少值但不完全理解的数据。

我有一个更大的数据集,但这个数据集也发生了同样的事情:

testdf = pd.DataFrame(
[['Max',10,'M','a', 'x',None],
['Ma',5, 'M', 'a', None,None],
['Johan',6, 'J','o','h','a']],
index=[1, 2, 3],
columns=['First_Name','Count','a', 'b', 'c','d'])
testdf
fig=px.sunburst(testdf,path=['a','b','c','d'],values='Count')
fig.show()

ValueError是这样的:

ValueError:(‘数据帧中不允许有无遗漏的行\n’,Mb ac
d
名称:1,数据类型:对象,"不是叶。"(

所以我认为这是由于字母a不是叶子这一事实造成的,因为第一行的x也附在它上,但我希望第二行的sunburst停止在字母a处,第一行的sunhurst停止在字符x处。非常感谢您的帮助!

这里对此进行了解释:https://community.plotly.com/t/sunburst-chart-cant-handle-none-values/35383.

基本上,如果您有一个None值,它的父级必须是唯一的。在您的示例中,第一行是有效的。第二个不是因为["M", "a", None, None]["M", "a", "x", None]共享同一个父级。

事实上,如果你运行下面的,它是有效的。

testdf = pd.DataFrame([
['Max', 10, 'M', 'a', 'x', None],
['Ma', 5, 'M', 'a', 'd', None],
['Johan', 6, 'J', 'o', 'h', 'a']],
index=[1, 2, 3],
columns=['First_Name', 'Count', 'a', 'b', 'c', 'd'])
testdf
fig = px.sunburst(testdf, path=['a', 'b', 'c', 'd'], values='Count')

另一个可行的解决方案是将路径转换为父子层次结构,如本期所述:https://github.com/plotly/plotly.py/issues/4308

只要路径元素不同,就可以得到正确的结果。plotly特定的layout_value列是必要的,因为branchvalues="total"没有呈现的错误

# %%
import typing as t
import pandas as pd
import plotly.express as px
# %%
def get_data()-> pd.DataFrame:
return pd.DataFrame([
{ 'path': 'music/pop/jackson/billie_jean.mp3', 'score': 0.8, 'views': 1000 },
{ 'path': 'music/pop/jackson/beat_it.mp3', 'score': 0.9, 'views': 2000 },
{ 'path': 'music/pop/abba/dancing_queen.mp3', 'score': 0.7, 'views': 1500 },
{ 'path': 'music/pop/abba/voulez-vous/voulez-vous.mp3', 'score': 0.75, 'views': 1500 },
{ 'path': 'music/pop/abba/voulez-vous/summer_night_city.mp3', 'score': 0.8, 'views': 1500 },
{ 'path': 'music/pop/abba/waterloo.mp3', 'score': 0.8, 'views': 1500 },
{ 'path': 'music/pop/abba/chiquitita.mp3', 'score': 0.7, 'views': 1500 },
{ 'path': 'music/pop/abba/s.o.s.mp3', 'score': 0.7, 'views': 1500 },
{ 'path': 'music/rock/queen/bohemian_rhapsody.mp3', 'score': 0.9, 'views': 3000 },
])

# %%
col_path: str = 'path'
col_parent: str = 'parent'
def path_parent_fn(path):
path = path.split('/')
path = '/'.join(path[:-1]) if len(path) > 0 else ''
path = path.strip()
return path if len(path) > 0 else None
aggregation = { 'score': 'median', 'views': 'sum', 'layout_value': lambda x: 0 }

# %%
PathT = t.TypeVar('PathT')
Axis = t.Union[int, str]
def create_hierarchy_data(
data: pd.DataFrame,
col_path: Axis,
col_parent: Axis,
path_parent_fn: t.Callable[[PathT], t.Union[PathT, None]],
aggregation: t.Any
) -> pd.DataFrame:
data[col_parent] = data[col_path].apply(path_parent_fn)
def parent_in_data_or_na():
return data[col_parent].isin(data[col_path]) | data[col_parent].isna()
while not parent_in_data_or_na().all(skipna=True):
missing_parents = data[data[col_parent].isin(data[col_path]) == False]
missing_parents = missing_parents.groupby(col_parent, as_index=False)
missing_parents_keys = missing_parents.groups.keys()
missing_parents = missing_parents.agg(aggregation)
missing_parents[col_path] = missing_parents_keys
missing_parents[col_parent] = missing_parents[col_path].apply(path_parent_fn)
data = pd.concat([
data,
missing_parents
], ignore_index=True)
data = data[data[col_path].isna() == False]
return data

# %%
data = get_data()
data['layout_value'] = data['views']
data = create_hierarchy_data(data, col_path, col_parent, path_parent_fn, aggregation)
data
# %%

data = get_data()
data['layout_value'] = data['views']
data = create_hierarchy_data(data, col_path, col_parent, path_parent_fn, aggregation)
fig = px.treemap(data, names=col_path, parents=col_parent, values='layout_value', color='score', color_continuous_midpoint=0.5, hover_data=['views', 'score'])
fig.update_traces(hovertemplate='''
<b>%{label}</b><br>Votes: %{customdata[0]}<br>Score: %{customdata[1]}
''')
fig

# %%
data = get_data()
data['layout_value'] = data['views']
data = create_hierarchy_data(data, col_path, col_parent, path_parent_fn, aggregation)
fig = px.sunburst(data, names=col_path, parents=col_parent, values='layout_value', color='score', color_continuous_midpoint=0.5, branchvalues='remainder')
fig

最新更新