2016-03-05 4 views
0

Я пытаюсь построить график Ганта. Я новичок в python и не знаком с передовыми концепциями программирования. При запуске кода я получаю показанную ошибку.Векторизация в python в следующем коде

import numpy as np 
import matplotlib as mpl 
import pylab as plt 

arr=np.loadtxt('gantt.csv',dtype=float,delimiter=",") 

colormapd = { 
    1:"r", 
    2:"g", 
    3:"b", 
    4:"y", 
    5:"m", 
    6:"k", 
    7:"r", 
    8:"g", 
    9:"b", 
    0:"y", 
    } 

therange=range(500,2500) 

jobnum= arr[therange,0].astype(int) 
macnum= arr[therange,2].astype(int) 
procstart = arr[therange,3] 
procfinish = arr[therange,4] 


for i in range(500,2500): 
    plt.hlines(macnum[i],procstart[i],procfinish[i],colors = colormapd[1]) 
    plt.show() 

Ошибка:

IndexError: index 2000 is out of bounds for axis 0 with size 2000 

Я думаю, что мне нужно, чтобы иметь возможность векторизации (jobnum% 10) массив, используемый для доступа к словарю.

plt.hlines(macnum,procstart,procfinish,colors = colormapd[jobnum%10]) 

Я могу запустить:

plt.hlines(macnum,procstart,procfinish) 

Но я хочу, чтобы изменить цвет линий в соответствии с jobnumbers. У меня 2500 рабочих мест. Любой другой метод создания диаграммы Ганта, если лучше, можно было бы предложить.

+0

Вы пытались заменить 'for i в диапазоне (500,2500):' with 'for i in range (2000):'? – bbkglb

ответ

0

Ваши массивы имеют индексы 0-1999, а не 500-2499. Поэтому, когда цикл for достигает 2000, индекс выходит за пределы массивов.

Чтобы установить отдельные цвета, перейдите в массив с цветами, соответствующими данным. Нравится так:

colors = np.array([colormapd[i%10] for i in therange]) 

for i in range(50,250): 
    plt.hlines(macnum,procstart,procfinish,colors=colors) 
    plt.show() 
+0

color_mapper = np.vectorize (лямбда х: {1: "г", 2: "г", 3: "б", 4: "у", 5: "м", 6: "к », 7: "г", 8: "г", 9: "б", 0: " у",} получаем (х)) plt.hlines (macnum, procstart, procstart + proctime , colors = color_mapper (jobnum% 10)) Это сработало для меня. – kosmos

+0

http://stackoverflow.com/questions/18066781/create-gantt-plot-with-python-matplotlib – kosmos

0

Вы можете включить в свой вопрос полный трассировочный ответ, неясно, в какой строке ваш код не работает.

также вы можете опубликовать фрагмент вашего файла csv и часть массива.

Это, как говорится, , если у вас есть 2000 пунктов в файле CSV, то ваш индекс первого элемента будет 0 и последний 1999

ваш двухтысячный элемент в массиве действительно с индексом 1999, так как индексация массива начинается с 0.

также использование numpy.arange (старт, конец) нет python родственный плита. и помните, что диапазон и диапазон не включают конечную точку.

вот несколько примеров кода

macnum = np.arange(5,26) 
procstart = np.linspace(0.0,23.5,21) 
procend = procstart + .5 

print macnum, len(macnum) 
print procstart, len(procstart) 
print procend, len(procend) 

первые три аргумента в plt.hlines могут принимать массивы так просто передать свои массивы непосредственно функции.

plt.hlines(macnum, procstart, procend) 
plt.show() 

matplotlib имеет встроенные цветовые карты, но я не совсем уверен, как их использовать.

+0

Спасибо. Я, будучи новым для python, забыл, что «конечная точка» не включена. Он работает сейчас. Я действительно передал их как массивы, и это сработало.Но я хотел дать другой цвет каждой работе и поэтому боролся. – kosmos

Смежные вопросы