2016-09-24 2 views
1

J'ai du mal à essayer de tracer un diagramme de Gantt à partir d'un ensemble de données avec Python. J'ai un ensemble de machines qui travaillent sur différentes tâches au cours d'une période de temps. Je veux faire un diagramme de Gantt qui montre par l'axe Y les machines et l'axe x le temps passé sur chaque tâche. Chaque machine ne doit apparaître qu'une seule fois sur l'axe des y et pour faciliter la visualisation des tâches, je veux avoir la même couleur pour chaque tâche.Gantt Chart planification de la machine python

L'idée est de vérifier des choses étranges comme si la même tâche était traitée par deux machines ou plus.

Permettez-moi de montrer ce que je jeu de données avec un petit exemple:

machine equipment start finish 
    m1   e2  date1 date2 
    m2   e2  date3 date4 
    m1   e1  date5 date6 
    m3   e3  date7 date8 
    m3   e4  date9 date10 

J'ai essayé d'utiliser le broken_barh de matplotlib, mais je ne peux pas trouver un moyen d'ajouter les données pour le terrain efficacement . Depuis que j'ai quelque chose comme 100 machines et 400 tâches.

Here is a picture pour montrer à quoi devrait ressembler la sortie.

code actuel ci-dessous:

import datetime as dt 

machines = set(list(mydata["machine"])) 
tasks = set(list(mydata["task"])) 

fig, ax = plt.subplots(figsize=(20, 10)) 

yrange = 5 # y width of gantt bar 
ymin = 0 
orign = min(list(mydata["start"])) # time origin 

for i in machines: 

    stdur = [] # list of tuples (start, duration) 
    ymin = index*6 # start y of gantt bar 

    for index, row in mydata.iterrows(): 

     if row["machine"] == i: 
      start = (row["start"] - orign).total_seconds()/3600 
      duration = (row["finish"] - row["start"]).total_seconds()/3600 

      stdur.append((start,duration)) 

    ax.broken_barh(stdur,(ymin,yrange)) 

ax.set_xlabel('Time') 
ax.set_yticklabels(machines) 

plt.show() 
+0

Que voulez-vous dire par efficacité? 100 * 400 ne concerne pas beaucoup * l'efficacité de calcul *. – sascha

+0

effectivement l'ensemble de données a quelque chose comme 2000 lignes. Je continue à boucler naïvement tout cela pour consolider les listes pour différentes machines et tâches pour l'intrigue, cela prendrait beaucoup de temps. – seimetz

+0

Sons toujours réalisables. Je pense qu'il n'y a pas beaucoup d'aide sans vous montrer votre code/donner plus d'informations quel est exactement le problème (par exemple le prétraitement ou l'appel final plt.plot()). – sascha

Répondre

0

Seimetz,

Si vous êtes bien passer l'ensemble des données au client et laisser un JS diagramme de Gantt faire est chose, alors le paquet RadiantQ jQuery Gantt sera un meilleure option pour vous. Voici une démo en ligne de quelque chose de similaire: http://demos.radiantq.com/jQueryGanttDemo/Samples/ServerStatusWithHugeData.htm

Voici à quoi il ressemble: Server Status Sample

Plus d'informations sur le produit ici: http://radiantq.com/products/jquery-gantt-package/jquery-gantt-package-features/