Пользовательская сортировка в Графически выраженных визуализациях сосулек

#python #plotly #plotly-python #plotly-express #icicle-diagram

Вопрос:

Я имею дело с набором данных, в котором есть ежеквартальные задачи, и я пытаюсь визуализировать его с помощью графически выраженной диаграммы сосулек. Структура данных выглядит следующим образом:

Цель Четверть Задача Статус Ценность
Завершить Проект А 1 Сортировка данных Полный 1
Завершить Проект А 2 Чистые данные Полный 1
Завершить Проект А 2 Визуализируйте сюжет Полный 1
Завершить Проект А 3 начать отчет в процессе 1
Завершить Проект А 3 Редактировать отчет Еще не начали 1
Завершить Проект B 1 Босс электронной почты Еще не начали 1

Проблема заключается в диаграмме, хотя данные считываются в этом формате, они сортируются на основе количества строк, соответствующих этому кварталу. Таким образом, на графике квартал 2 и 3 будут первыми для проекта а, а квартал 1 будет указан последним. Я хочу перевернуть это так, чтобы это было в порядке четвертей, т. Е. Q1->Q2->>Q3->>>Q4, но я, похоже, не могу найти отличный способ сделать это в plotly express. Ниже приведен мой код, который я в настоящее время использую:

 fig = px.icicle(df, path=['Objective','Quarter','Task','Status'], values='Value', color='Status',
                color_discrete_map={'Haven't started':'red','In Progress':'yellow','Complete':'green'},
                maxdepth=3
    )
 

Еще одна проблема, с которой я сталкиваюсь в связи с этим, заключается в том, что я окрашиваю его столбцом статуса, но всякий раз, когда у квартала есть сочетание статусов, которые не являются одним статусом (т. Е. Все завершены или находятся в процессе), по умолчанию он имеет фиолетовый цвет, который в основном нечитаем для остальных ячеек. Есть ли способ изменить этот цвет по умолчанию, не теряя окраску по статусу?

Комментарии:

1. ваш пример кода не работает с вашим примером кода. значения столбца нет

2. О, исправлено! Забыл включить эту часть, когда я упрощал свои данные.

Ответ №1:

  • вроде https://plotly.com/python-api-reference/generated/plotly.graph_objects.Icicle.html является параметром, установите его на False использование update_traces()
  • после построения рисунка проверьте цвета и переопределите их, если это не определено статусом

 import pandas as pd
import plotly.express as px

df = pd.DataFrame(
    [
        ["Finish Project A", 1, "Sort data", "Complete", 1],
        ["Finish Project A", 2, "Clean data", "Complete", 1],
        ["Finish Project A", 2, "Visualize plot", "Complete", 1],
        ["Finish Project A", 3, "begin report", "In Progress", 1],
        ["Finish Project A", 3, "Edit report", "Haven't started", 1],
        ["Finish Project B", 1, "Email boss", "Haven't started", 1],
    ],
    columns=["Objective", "Quarter", "Task", "Status", "Value"],
)

cm = {"Haven't started": "red", "In Progress": "yellow", "Complete": "green"}
fig = px.icicle(
    df,
    path=["Objective", "Quarter", "Task", "Status"],
    values="Value",
    color="Status",
    color_discrete_map=cm,
    maxdepth=3,
)

# required changes.  sort – Determines whether or not the sectors are reordered from largest to smallest.
# override color assigned to blocks with ambiguous status
fig.update_traces(
    sort=False,
    marker={
        "colors": tuple(
            c if c in cm.values() else "white" for c in fig.data[0]["marker"]["colors"]
        )
    },
)