无法将pandas系列传递给matplotlib fill_between

时间:2015-10-11 08:10:56

标签: python numpy pandas matplotlib

我正在使用matplotlib fill_between命令。

上限和下限y1和y2是“ y数据的N长度数组(或标量)

所以在我的代码中我传递了y1和y2两个适当长度的pandas系列。但代码失败并出现错误:

  

TypeError:输入类型不支持ufunc'isfinite',而且   输入无法安全地强制转换为任何支持的类型   施法规则''安全''

如果我改为传递简单的标量列表,那么图表就会正确呈现。

我认为数据系列会作为数组传递用于这些目的。但显然它没有。我发现onetwo StackOverflow问题存在同样的问题。在这两种情况下,答案都是传递.values属性。

但这对我不起作用。尽管为yUpper,yLower传递了numpy.ndarrays,我仍然得到了同样的错误,好像我传递了pandas.Series。 !?

这是代码片段,下面是打印输出,以证明我正在通过我认为我正在传递的内容......

    high = OI_avg * 1.05
    low = OI_avg * 0.96
    print ("\nOI_avg {1} \n{0}".format(OI_avg, type(OI_avg)))
    print ("\nhigh {1} \n{0}".format(high, type(high)))
    print ("\nlow {1}\n{0}".format(low, type(low)))

    print ("high.values is type {0}".format(type(high.values)))
    print ("low.values is type {0}".format(type(low.values)))

    highHack = [-19914, 1951, 8650, 7031]
    lowHack = [-18207, 1784, 7909, 6428]

    # [CASE 1] passing a simple list of numbers works
    #fill_zone = plt.fill_between(index, highHack, lowHack, label = '+/-1 std dev range', facecolor='lightgray', alpha=0.3)

    # [CASE 2] passing two numpy.ndarray gives the ufunc error!?
    #fill_zone = plt.fill_between(index, high.values, low.values, label = '+/-1 std dev range', facecolor='lightgray', alpha=0.3)    

    # [CASE 3] passing two pandas.Series gives the ufunc error    
    #fill_zone = plt.fill_between(index, high, low, label = '+/-1 std dev range', facecolor='lightgray', alpha=0.3)

下面显示.values正在返回一个np.ndarray。

OI_avg <class 'pandas.core.series.Series'> 
co1 comdty   -18966.1
co2 comdty     1858.7
co3 comdty     8238.9
co4 comdty     6696.5
Name: (d_OI, avg), dtype: object

high <class 'pandas.core.series.Series'> 
co1 comdty    -19914.4
co2 comdty    1951.635
co3 comdty    8650.845
co4 comdty    7031.325
Name: (d_OI, avg), dtype: object

low <class 'pandas.core.series.Series'>
co1 comdty   -18207.46
co2 comdty    1784.352
co3 comdty    7909.344
co4 comdty     6428.64
Name: (d_OI, avg), dtype: object
high.values is type <type 'numpy.ndarray'>
low.values is type <type 'numpy.ndarray'>

....所以当我写这个问题时,我意识到high.values给了我一个'dtype = object'的ndarray。我想也许matplotlib在dtype上呕吐,所以我把数组的dtype改成了浮点数。

highArray = high.values.astype(float)
lowArray = low.values.astype(float)

这就解决了,现在代码有效了。让我想知道我是否将原始pd.Series的dtype更改为浮点数,这是否有效......答案是肯定的。我可以将Series.astype(float)直接传递给matplotlib,它工作正常。无需通过ndarray进行中介......

1 个答案:

答案 0 :(得分:0)

传递系列赛#39;作为浮点数的值解决了问题

highArray = high.values.astype(float)