fill_between给出“ValueError:参数尺寸不兼容”

时间:2013-08-19 11:04:26

标签: python-2.7 matplotlib xlrd

下面用Python编写的代码将数据从Excel导入到Python,然后用matplotlib绘制。我正在尝试使用fill_between函数以不同的颜色填充第80行的上方和下方,但它提供了

ValueError: Argument dimensions are incompatible

注意: Excel文件('eegg.xlsx')有4列,682行,包含int个数据(0-100)。

我认为问题出在where调用的fill_between参数上,但我无法解决这个问题。

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([])

3 个答案:

答案 0 :(得分:13)

您收到此错误是因为Y1list,而不是numpy.array,因此(Y1) > 80(Y1) < 80会返回一个bool每个,而不是它们的数组,就像kwarg where所接受的那样。

所以更换线

Y1 = att

Y1 = array(att)

应该解决问题。

答案 1 :(得分:2)

似乎参数color和alpha需要传递为color = ...,alpha = ...

正确:ax.fill_between(x,y_min,y_max,color = color,alpha = 0.1)

错误:ax.fill_between(x,y_min,y_max,color,alpha = 0.1)

答案 2 :(得分:1)

确保将X和Y1转换为pandas.core.series.Series。那应该可以解决问题。您可以使用以下方式检查类型:

type(X)
type(Y1)

如果两者都返回“pandas.core.series.Series”那么它应该可以工作。

仅举例说明,如果X,Y是数据帧,请尝试以下操作:

X = X.iloc[:,0]  # NEW
Y = Y.iloc[:,0]  # NEW