用matplotlib填充曲线下的区域
Filling area under the curve with matplotlib
我有一个pandas系列,
这是图表:
我想填充曲线下的区域。问题是调用
plt.fill(y)
输出:
在其他answers中看到,这是因为我们需要向函数发送一个多边形,所以我们必须添加一个(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)
看看this
您可以直接在您的系列上调用 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 给我以下输出:
我有一个pandas系列,
这是图表:
我想填充曲线下的区域。问题是调用
plt.fill(y)
输出:
在其他answers中看到,这是因为我们需要向函数发送一个多边形,所以我们必须添加一个(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)
看看this
您可以直接在您的系列上调用 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 给我以下输出: