python plotly Treemap ids формат и как да се показват множество дублирани етикети в дървовидна карта?

Накратко

Мисля, че въпросът ми има две части:

  1. В какъв формат plotly очаква да бъде аргументът ids?
  2. Как мога да създам ids, което ми позволява да създам дървовидна карта с дублиран етикет?

В повече детайли

Опитвам се да имам вложена дървовидна карта със споделен етикет. Например, мислете за това като за категория Други.
Тук използвам Python 3.8 Plotly 4.9.0

Повторно използване на plotly пример:

from plotly import graph_objects as go
labels = ["A1", "A2", "A3", "A4", "A5", "B1", "B2", "Other", "Other"]
parents = ["", "A1", "A2", "A3", "A4", "", "B1", "A1", "B1"]
ids = [f"{parents[i]}{'-' if parents[i] else ''}{labels[i]}" for i in range(0,len(labels))]
# ['A1', 'A1-A2', 'A2-A3', 'A3-A4', 'A4-A5', 'B1', 'B1-B2', 'A1-Other', 'B1-Other']

fig = go.Figure(go.Treemap(
    labels = labels,
    parents = parents,
    ids=ids # commenting this out displays something at least
))
fig.show()

Горното ми дава празен екран, но ако коментирам аргумента ids, той игнорира един от дублираните етикети: Какво се показва

Разгледах различни части от документацията на plotly и изглежда, че този списък от низове трябва да работи по предназначение.

Извлечение от https://plotly.com/python/reference/treemap/:

ids
Тип: списък, масив numpy или Pandas серия от числа, низове или дати и часове.

Присвоява идентификатори на всяка дата. Тези идентификатори за постоянство на обект на точки от данни по време на анимация. Трябва да бъде масив от низове, а не числа или друг тип.

Причината да опитам тази специфична структура на ids се дължи на други plotly примери
напр. https://plotly.com/python/treemaps/#controlling-text-fontsize-with-uniformtext

import plotly.graph_objects as go
import pandas as pd

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/718417069ead87650b90472464c7565dc8c2cb1c/sunburst-coffee-flavors-complete.csv')

fig = go.Figure(go.Treemap(
        ids = df.ids,
        labels = df.labels,
        parents = df.parents))
fig.update_layout(uniformtext=dict(minsize=10, mode='hide'))
fig.show()

# Above is exact example, below is df structure
df.head()
                       ids            labels parents
0                   Aromas            Aromas     NaN
1                   Tastes            Tastes     NaN
2         Aromas-Enzymatic         Enzymatic  Aromas
3    Aromas-Sugar Browning    Sugar Browning  Aromas
4  Aromas-Dry Distillation  Dry Distillation  Aromas

Благодаря за отделеното време !


person Adehad    schedule 16.10.2020    source източник


Отговори (1)


Родител: данни[type=treemap] Тип: списък, numpy масив, или серия Pandas от числа, низове или дати и часове. Задава родителските сектори за всеки от секторите. Елементите от празен низ се разбират като препратки към основния възел в йерархията. Ако ids е попълнено, parents елемента се разбират като самите идентификатори. Когато ids не е зададено, plotly се опитва да намери съвпадащи елементи в labels, но внимавайте, те трябва да са уникални.

етикетите могат да бъдат всичко, което искате, идентификаторите трябва да са уникални и родителят трябва да съдържа идентификатори, а не етикети, ако използвате идентификатори. Ако не използвате идентификатори, тогава ще разбере, както е посочено по-горе.

примерен код:

from plotly import graph_objects as go

ids =    ["a1", "a2", "a3", "a4", "a5", "b1", "b2", "o_1", "o_2"]
labels = ["A1", "A2", "A3", "A4", "A5", "B1", "B2", "Other", "Other"]
parents = ["", "a1", "a2", "a3", "a4", "", "b1", "a1", "b1"]

fig = go.Figure(go.Treemap(
    labels = labels,
    parents = parents,
    ids=ids
))
fig.show()

примерно изображение

person jgrt    schedule 16.10.2020