fill_between出现“ValueError:参数维度不兼容”错误

12

以下Python代码导入Excel数据到Python中,然后使用matplotlib绘图。我试图使用fill_between函数用不同的颜色填充80以上和以下的线条,但是它出现了问题。

ValueError: Argument dimensions are incompatible

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

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

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
你能打印出 XY1 的形状吗?请执行 print X.shape, Y1.shape - Matti Lyra
尽管了解引发错误的类型可能有助于我们解决问题,但如果您发布完整的回溯信息,这将使我们更容易知道错误在哪里引发。 - sodd
3个回答

16
因为Y1是一个list而不是numpy.array,因此(Y1) > 80(Y1) < 80返回一个单独的bool,而不是一个包含多个bool的数组,而where参数需要一个包含多个bool的数组。
Y1 = att

Y1 = array(att)

应该解决这个问题。


4

请确保将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

3

看起来需要将参数颜色和透明度传递为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)


是的,这就是我的问题。虽然大多数其他matplotlib函数都明确指出了这个错误,但这个异常还是出乎意料的。 - pretzlstyle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接