繁体   English   中英

用 matplotlib 填充曲线下的区域

[英]Filling area under the curve with matplotlib

我有一个熊猫系列,

系列

这是图表:

功能

我想填充曲线下的区域。 问题是调用

plt.fill(y)

输出:

在此处输入图片说明

正如其他答案中所见,这是因为我们需要向函数发送一个多边形,因此我们必须添加一个 (0,0) 点。 (还有一个 (lastPoint, 0),但在这种情况下它不是必需的)。

但是,建议的解决方案正在编写以下代码:

plt.fill([0]+[*range(0,len(y))],  [0]+pd.Series.tolist(y))

我拒绝相信这是最好的解决方案。

代码很糟糕,一点也不容易阅读,而且我正在丢失信息(x 轴上没有日期):

在此处输入图片说明

此外,如果我同时调用 plot 和 fill (在顶部有红线),则会发生错误:

/usr/local/anaconda3/lib/python3.7/site-packages/matplotlib/dates.py in refresh(self)
   1446     def refresh(self):
   1447         'Refresh internal information based on current limits.'
-> 1448         dmin, dmax = self.viewlim_to_dt()
   1449         self._locator = self.get_locator(dmin, dmax)
   1450 

/usr/local/anaconda3/lib/python3.7/site-packages/matplotlib/dates.py in viewlim_to_dt(self)
   1197                              'often happens if you pass a non-datetime '
   1198                              'value to an axis that has datetime units'
-> 1199                              .format(vmin))
   1200         return num2date(vmin, self.tz), num2date(vmax, self.tz)
   1201 

ValueError: view limit minimum -36868.15 is less than 1 and is an invalid Matplotlib date value. This often happens if you pass a non-datetime value to an axis that has datetime units

所以我希望有人可以帮助我编写更好的代码并解决这个问题。 我认为 matplotlib 应该添加一个函数 fill_area 或类似的。

大家怎么看这件事?

有这样一个函数: matplotlib.pyplot.fill_between()

import matplotlib.pyplot as plt

plt.plot(y, c='red')
plt.fill_between(y.index, y, color='blue', alpha=0.3)

看看这个

您可以直接在您的系列上调用 plot() :

import pandas as pd
import numpy as np
data = pd.Series(np.array([100, 90, 80, 20, 40]), index=['2017-01-31', '2017-02-28', '2017-03-31', '2017-04-30', '2017-05-31'])
data.plot(kind='area')

Jupyter 给了我以下输出:

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM