Plotly Express Timeline Диаграмма Ганта, цветовое кодирование на основе столбца в фрейме данных

Я пытаюсь создать расписание механического цеха с цветовой кодировкой деталей, принадлежащих к одной сборке. Я использую сюжетную экспресс-хронологию для создания диаграммы Ганта. Он читает файл Excel на моем рабочем столе для создания расписания. Я создал образец ниже. Цель состоит в том, чтобы все части стула были одного цвета, а все части стола были одного цвета.

Plotly Express Timeline Диаграмма Ганта, цветовое кодирование на основе столбца в фрейме данных

Вот код для чтения файла excel и создания диаграммы Ганта:

df = pd.read_excel(r"C:\Users\john.doe\Documents\Machine Durations - Sample.xlsx")

df['Start Shift'] = df['Start Shift'].astype(int)
df['Finish'] = df['Finish'].astype(int)
#display(df)

# create a slice if the df for the rank = 1
dfRank1 = df[df.Rank == 1]
# reindex it 
dfRank1 = dfRank1.reset_index()
#display(dfRank1)

#Create the visual 

df["Part"] = df["Part"].astype(str)
df["delta"] = df["Finish"]-df["Start Shift"]
fig = px.timeline(df,x_start  = "Start Shift", x_end = "Finish", y = "Machine", hover_name  = "Part",color = "Part", text = "Part", title = "Machine Shop Cycle", opacity = .75)
fig.update_yaxes(autorange = "reversed")
fig.layout.xaxis.type = 'linear'
#fig.data[0].x = df.delta.tolist()
for d in fig.data:
    filt = df['Part'] == d.name
    d.x = df[filt]['delta'].tolist()

fig.update_traces(textposition='inside')    
    
fig.show()


Plotly Express Timeline Диаграмма Ганта, цветовое кодирование на основе столбца в фрейме данных

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • хорошей практикой является вставка ваших данных в виде текста в вопрос
  • внесли два изменения
    1. поместите Сборка в hover_data так, чтобы он был в пользовательские данные каждой трассы
    2. цикл по трассировкам для обновления маркер_цвет на основе Сборка в пользовательские данные
# update colors to that of the assembly
cmap = {"Chair":"red", "Desk":"blue"}
fig.for_each_trace(lambda t: t.update({"marker":{"color":[cmap[a] for a in t["customdata"][:,0]]}}))

полный код

import pandas as pd
import plotly.express as px
import io

df = pd.read_csv(
    io.StringIO(
        """Part,Machine,Duration,Duration Shifts(6),Start Shift,Finish,Index,Assembly,Rank
Legs,Lathe,100,5,0,5,1,Chair,A
Seat,Mill,400,5,0,5,1,Chair,A
Back,Mill,200,3,5,8,1,Chair,A
Legs,Lathe,200,3,5,8,1,Desk,A
Table Top,Mill,200,3,8,11,1,Desk,A
Wheels,Mill-Turn,200,10,0,10,1,Desk,A"""
    )
)

df["Start Shift"] = df["Start Shift"].astype(int)
df["Finish"] = df["Finish"].astype(int)
# display(df)

# create a slice if the df for the rank = 1
dfRank1 = df[df.Rank == 1]
# reindex it
dfRank1 = dfRank1.reset_index()
# display(dfRank1)

# Create the visual

df["Part"] = df["Part"].astype(str)
df["delta"] = df["Finish"] - df["Start Shift"]
fig = px.timeline(
    df,
    x_start = "Start Shift",
    x_end = "Finish",
    y = "Machine",
    hover_name = "Part",
    hover_data=["Assembly"], # want this for setting color
    color = "Part",
    text = "Part",
    title = "Machine Shop Cycle",
    opacity=0.75,
)
fig.update_yaxes(autorange = "reversed")
fig.layout.xaxis.type = "linear"
# fig.data[0].x = df.delta.tolist()
for d in fig.data:
    filt = df["Part"] == d.name
    d.x = df[filt]["delta"].tolist()

fig.update_traces(textposition = "inside")

# update colors to that of the assembly
cmap = {"Chair":"red", "Desk":"blue"}
fig.for_each_trace(lambda t: t.update({"marker":{"color":[cmap[a] for a in t["customdata"][:,0]]}}))

выход

Другие вопросы по теме