#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"]
)
},
)