2013-08-19 12 views
6

Kod poniżej napisany w Pythonie importuje dane z Excela do Pythona, a następnie rysuje za pomocą matplotlib. Staram się wypełnić powyżej i poniżej linii 80 o różnych kolorach z wykorzystaniem funkcji fill_between, ale dajefill_between daje "ValueError: rozmiary argumentów są niekompatybilne"

ValueError: Argument dimensions are incompatible 

Uwaga: plik Excel ('eegg.xlsx') ma 4 kolumny z 682 wierszy i zawiera int dane (0-100).

Myślę, że problem jest z argumentem where wywołań , ale nie mogę tego rozwiązać.

import xlrd 
import numpy 
from datetime import time 
from pylab import * 

workbook = xlrd.open_workbook('eegg.xlsx') 
worksheet = workbook.sheet_by_name('Sayfa1') 
num_rows = worksheet.nrows - 1 
num_cells = worksheet.ncols - 1 
curr_row = -1 

att=[] 
med=[] 
for i in [2,3]: 
    kolon = worksheet.col(i) 
    for x in kolon[1:]: 
     d= int(x.value) 
     if i==2: 
      att.append(d) 
     elif i==3: 
      med.append(d) 

n = len(att) 
X = np.linspace(0,n,n,endpoint=True) 
Y1 = att 
plot(X, Y1, color='blue', alpha=1.00) 
fill_between(X, 0, Y1, (Y1) > 80, color='red', alpha=.25) 
fill_between(X, 0, Y1, (Y1) < 80, color='blue', alpha=.25) 
xlim(0,n), xticks([]) 
ylim(0,110), yticks([]) 
+1

można wydrukować kształtów 'X' i' Y1'? Zrób 'print X.shape, Y1.shape'. –

+0

Chociaż znajomość rodzaju zgłaszanego błędu może nam pomóc w rozwiązaniu problemu, byłoby to o wiele łatwiejsze, jeśli opublikujesz ** kompletny traceback **, ponieważ mówi nam to _ gdzie_ błąd jest podnoszony. – hooy

Odpowiedz

10

dostać ten błąd, ponieważ Y1 jest list, a nie numpy.array i dlatego (Y1) > 80 i (Y1) < 80 zwracają pojedynczą bool każda, nie tablica z nich, jak kwarg where akceptuje.

więc zastąpienie linii

Y1 = att 

z

Y1 = array(att) 

powinno rozwiązać ten problem.

1

Wydaje się że argumenty kolor i alfa trzeba przekazywane jako kolorowy = ..., alfa = ...

Poprawnie: ax.fill_between (x, y_min, y_max = kolor, kolor, alfa = 0,1)

Zła: ax.fill_between (x, y_min, y_max, kolor, alfa = 0,1)

0

Koniecznie konwersji x i Y1 pandas.core.series.Series. To powinno rozwiązać problem. Można sprawdzić typ z:

type(X) 
type(Y1) 

Jeśli oba powrotne „pandas.core.series.Series” to powinno działać.

Tylko dla przykładu, jeśli X, Y są dataframes, a następnie spróbuj wykonać następujące czynności:

X = X.iloc[:,0] # NEW 
Y = Y.iloc[:,0] # NEW 
Powiązane problemy