Могу ли я построить pandas.DataFrame и обычную линию из функции или массива в одном и том же субплоте? - PullRequest
1 голос
/ 12 июня 2019

У меня есть панды DataFrame, которые сложены и реорганизованы так, как я хочу, и выглядит так:

print(df.unstack(level=0).cumsum())
Task           1020     1021     1022      1023     7141
Entry Date                                              
2019-03-31      NaN      NaN      NaN   32930.0      NaN
2019-04-30  28845.0  16695.0  27427.5  127476.0      NaN
2019-05-31  57465.0  85745.0      NaN  142561.0  3515.61
2019-06-30      NaN  90515.0      NaN       NaN      NaN

Это я строю со следующими строками:

fig, ax1 = plt.subplots(1)
grouped_by_task.unstack(level=0).cumsum().plot(ax=ax1, style = '.-')

Теперь я хочу добавить еще один график (для простоты прямая линия между двумя точками).

Эти конечные точки этой линии задаются:

startmonth = '2019-03'
endmonth = '2022-03'
start_month = datetime.strptime(startmonth, "%Y-%m")
end_month = datetime.strptime(endmonth, "%Y-%m")
budget = [0, 1000000]
times = [start_month, end_month]

Я борюсь с получением сюжета линии на том же участке.

Я обнаружил несколько дискуссий о том, как добавить данные из нескольких DataFrame s в один и тот же участок, но не панды DataFrame вместе со значениями, не входящими в DataFrame.

Я пытаюсь построить следующие строки:

grouped_by_task.unstack(level=0).cumsum().plot(ax=ax1, style = '.-') # (1)
ax1.plot(times, budget, '-')                                         # (2)
plt.xlim(datetime.strptime(startmonth, "%Y-%m"), 
         datetime.strptime(endmonth, "%Y-%m")                        # (3)

Только с линией (1) я получаю график, где оси x и y определяются данными в DataFrame.

Only DataFrame

Также и по строке (3) ось X определена правильно (дольше, чем данные, доступные в DataFrame).

DataFrame plotted with x-axis redefined

Со всеми 3 строками я настраиваю ось Y на значения в соответствии с данными в строке (2), но без линии.

Y-axis readjusted according to line, but line not plotted

Если я закомментирую строку (1), я получу правильную линию.

Line shows up when DataFrame not plotted

Единственное отличие состоит в том, что значения на тиках оси X написаны по-разному.

Есть предложения, что я делаю не так?

1 Ответ

1 голос
/ 13 июня 2019

Я максимально использовал ваши данные.Ваш пример не полностью воспроизводим, как есть.В любом случае, изменение порядка построения линии, установки ограничений и построения DataFrame решило это для меня.Дата-фрейм должен идти последним.Извините, не знаю, почему ...
Данные, которые я использовал:

Task           1020     1021     1022      1023     7141
2019-03-31      NaN      NaN      NaN   32930.0      NaN
2019-04-30  28845.0  16695.0  27427.5  127476.0      NaN
2019-05-31  57465.0  85745.0      NaN  142561.0  3515.61
2019-06-30      NaN  90515.0      NaN       NaN      NaN

Анализ данных:

import pandas as pd
from datetime import datetime
import matplotlib.pyplot as plt
df = pd.read_clipboard(sep='\s\s+')
df['Task'] = pd.to_datetime(df['Task'])
df = df.set_index('Task')
start_month = datetime.strptime('2019-03', "%Y-%m")
end_month = datetime.strptime('2022-03', "%Y-%m")
budget = [0, 1000000]

И часть построения.Обратите внимание, что df идет последним:

fig, ax1 = plt.subplots()
ax1.plot([start_month, end_month], budget, '-', label='budget')
df.groupby(df.index).cumsum().plot(ax=ax1, style='.-', xlim=(start_month, end_month))
ax1.legend()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...