使用matplotlib填充曲线下的区域

6

我有一个Pandas系列,

series

这是图表:

function

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

plt.fill(y)

输出:

enter image description here

正如在其他答案中所看到的那样,这是因为我们需要向函数发送一个多边形,所以我们必须添加一个(0,0)点。(还有一个(lastPoint, 0),但在这种情况下不是必要的)。
然而,建议的解决方案是编写以下代码:
plt.fill([0]+[*range(0,len(y))],  [0]+pd.Series.tolist(y))

我不相信这是最好的解决方案。
代码很糟糕,根本不容易阅读,而且我正在失去信息(x轴上没有日期):

enter image description here

此外,如果我同时调用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或类似的函数。

你们对此有什么看法?

2个回答

9
这是一个函数: 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)

2
请查看这个网页
您可以直接在系列上调用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 给我展示了以下输出:

在此输入图片描述


2
你的答案看起来不错,但我想使用matplotlib而不是pandas,这就是为什么我选择了另一个答案。无论如何,还是谢谢。 - Alexis

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