Зона заполнения под кривой с помощью matplotlib - PullRequest
2 голосов
/ 21 марта 2020

У меня есть серия 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 ]

2 голосов
/ 21 марта 2020

Есть такая функция: 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)
1 голос
/ 21 марта 2020

Посмотрите на 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 дает мне следующий вывод:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...