Matplotlib的fill_between不能与plot_date一起使用,任何替代方案?

fcc*_*lho 11 python matplotlib pandas

我想创建一个如下的情节: 这具有整数x值

代码:

P.fill_between(DF.start.index, DF.lwr, DF.upr, facecolor='blue',   alpha=.2)
P.plot(DF.start.index, DF.Rt, '.')
Run Code Online (Sandbox Code Playgroud)

但是在x轴上有日期,就像这样(没有条带): 与plot_date

代码:

P.plot_date(DF.start, DF.Rt, '.')
Run Code Online (Sandbox Code Playgroud)

问题是当x值是date_time对象时,fill_between失败.

有没有人知道一个解决方法?DF是一个pandas DataFrame.

unu*_*tbu 18

如果您展示如何df定义它将有所帮助.什么df.info()报道?这将向我们展示列的dtypes.

可以通过多种方式表示日期:字符串,整数,浮点数,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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


如果索引具有日期的字符串表示,那么(使用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()
Run Code Online (Sandbox Code Playgroud)

产量

  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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,修复是将字符串转换为时间戳:

index = pd.to_datetime(index)
Run Code Online (Sandbox Code Playgroud)

  • @unutbu当我使用datetime64和`plt.fill_between()时,我得到:`TypeError:输入类型不支持ufunc'isfinite',并且输入无法根据强制转换规则安全地强制转换为任何支持的类型safe''`.那么这个错误的原因应该是在其他地方? (6认同)