Python Matplotlib';s fill\u between不适用于绘图日期,有其他选择吗?

Python Matplotlib';s fill\u between不适用于绘图日期,有其他选择吗?,python,matplotlib,pandas,Python,Matplotlib,Pandas,我想创建一个如下图: 守则: P.fill_between(DF.start.index, DF.lwr, DF.upr, facecolor='blue', alpha=.2) P.plot(DF.start.index, DF.Rt, '.') 但是日期在x轴上,像这样(没有带): 守则: P.plot_date(DF.start, DF.Rt, '.') 问题是,当x值是日期时间对象时,填充间隔失败 有人知道解决方法吗?DF是一个数据帧。如果您演示如何定义DF,它会有所帮助。d

我想创建一个如下图:

守则:

P.fill_between(DF.start.index, DF.lwr, DF.upr, facecolor='blue',   alpha=.2)
P.plot(DF.start.index, DF.Rt, '.')
但是日期在x轴上,像这样(没有带):

守则:

P.plot_date(DF.start, DF.Rt, '.')
问题是,当x值是日期时间对象时,填充间隔失败


有人知道解决方法吗?DF是一个数据帧。

如果您演示如何定义
DF
,它会有所帮助。
df.info()
报告什么?这将向我们显示列的数据类型

日期有多种表示方式:字符串、整数、浮点数、datetime.datetime、NumPy datetime64s、Pandas时间戳或Pandas DatetimeIndex。绘制它的正确方法取决于你拥有什么

下面是一个示例,显示了如果
df.index
是DatetimeIndex,代码的工作原理:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats

index = pd.date_range(start='2000-1-1', end='2015-1-1', freq='M')
N = len(index)
poisson = (stats.poisson.rvs(1000, size=(N,3))/100.0)
poisson.sort(axis=1)
df = pd.DataFrame(poisson, columns=['lwr', 'Rt', 'upr'], index=index)

plt.fill_between(df.index, df.lwr, df.upr, facecolor='blue', alpha=.2)
plt.plot(df.index, df.Rt, '.')
plt.show()


如果索引具有日期的字符串表示形式,则(使用Matplotlib版本1.4.2)会出现TypeError:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats

index = pd.date_range(start='2000-1-1', end='2015-1-1', freq='M')
N = len(index)
poisson = (stats.poisson.rvs(1000, size=(N,3))/100.0)
poisson.sort(axis=1)
df = pd.DataFrame(poisson, columns=['lwr', 'Rt', 'upr'])

index = [item.strftime('%Y-%m-%d') for item in index]
plt.fill_between(index, df.lwr, df.upr, facecolor='blue', alpha=.2)
plt.plot(index, df.Rt, '.')
plt.show()
屈服

  File "/home/unutbu/.virtualenvs/dev/local/lib/python2.7/site-packages/numpy/ma/core.py", line 2237, in masked_invalid
    condition = ~(np.isfinite(a))
TypeError: Not implemented for this type
在这种情况下,修复方法是将字符串转换为时间戳:

index = pd.to_datetime(index)

关于chilliq报告的错误:

TypeError: ufunc 'isfinite' not supported for the input types, and the inputs 
  could not be safely coerced to any supported types according to the casting 
  rule ''safe''
如果在使用fill\u-between时数据帧列具有“object”数据类型,则会产生这种情况。更改示例列类型,然后尝试按如下方式绘图,会导致上述错误:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy import stats

index = pd.date_range(start='2000-1-1', end='2015-1-1', freq='M')
N = len(index)
poisson = (stats.poisson.rvs(1000, size=(N,3))/100.0)
poisson.sort(axis=1)
df = pd.DataFrame(poisson, columns=['lwr', 'Rt', 'upr'], index=index)
dfo = df.astype(object)

plt.fill_between(df0.index, df0.lwr, df0.upr, facecolor='blue', alpha=.2)
plt.show()
从dfo.info()中,我们可以看到列类型是“object”:


在使用fill_时,我遇到了类似的错误:

ufunc 'bitwise_and' not supported
然而,在我的情况下,错误的原因是相当愚蠢的。我正在传递color参数,但没有显式的参数名,这导致它是名为
where
的#4参数。因此,只需确保关键字参数已关键解决了问题:

ax.fill_between(xdata, highs, lows, color=color, alpha=0.2)

我认为没有一个答案能够解决最初的问题,它们都稍微改变了一点

如果要绘制TIMDELTA,可以使用此解决方法

ax = df.Rt.plot()
x = ax.get_lines()[0].get_xdata().astype(float)
ax.fill_between(x, df.lwr, df.upr, color="b", alpha=0.2)
plt.show()

这项工作对你不利。一般来说,唯一需要注意的是,您始终需要使用熊猫绘制索引,然后从艺术家那里获得坐标。我确信,通过查看pandas代码,可以找到它们是如何绘制时间增量的。然后可以将其应用到代码中,不再需要第一个绘图。

在这个配方中,它显示为工作:但我得到以下错误:条件=~(np.isfinite(a))类型错误:输入类型不支持ufunc'isfinite',根据DF.info()的强制转换规则“安全”输出:Int64Index:967个条目,0到966个数据列(共9列),无法将输入安全强制为任何支持的类型:SE 967非空int64开始967非空对象结束967非空对象案例967非空int64 Rt 961非空浮点64 Rt2 967非空浮点64 p1 967非空浮点64 lwr 967非空浮点64 upr 967非空浮点64数据类型:浮点64(5)、int64(2)、对象(2)内存使用率:75.5+KB通过使用
将numpy-datetime64[ns]类型转换为python-datetime.datetime对象数组,方法是使用
。从中获取的解决方案。如果date列由datetime64对象组成怎么办?我能把它换成别的东西吗?有没有在这些对象上使用fill_between()的方法?应该没有问题
plt.plot
plt.fill\u-between
接受数据类型数组
datetime64[ns]
很好。@unutbu当我使用datetime64和
plt.fill\u-between()时,我得到:
TypeError:ufunc'isfinite'不支持输入类型,根据强制转换规则“safe”,无法将输入安全强制为任何受支持的类型。
。那么这个错误的原因应该在其他地方?@chilliq:你能准备一个小例子来展示这个问题,然后在一个新问题中发布它吗?谷歌搜索
TypeError:ufunc'isfinite'不支持输入类型
显示此错误可能是由于matplotlib的版本,或使用数据类型“object”的NumPy数组引起的。可能还有其他原因。因此,如果没有一个可重复的例子,很难知道是什么导致了你的问题。@unutbu
ax.fill_between(xdata, highs, lows, color=color, alpha=0.2)
ax = df.Rt.plot()
x = ax.get_lines()[0].get_xdata().astype(float)
ax.fill_between(x, df.lwr, df.upr, color="b", alpha=0.2)
plt.show()