Почему мои данные не отображаются на этом графике Pandas? - PullRequest
1 голос
/ 02 августа 2020

У меня есть pandas.DataFrame daily_data_f_no_nr со следующим содержимым (результат print(daily_data_f_no_nr)):

          Day  Total TODO/TODOE count  First Derivative
0  2020-05-16                      35               0.0
1  2020-05-17                      35               0.0
2  2020-05-18                      35               0.0
3  2020-05-19                      35               0.0
4  2020-05-20                      35               0.0
..        ...                     ...               ...
74 2020-07-29                     152               0.0
75 2020-07-30                     152               0.0
76 2020-07-31                     152               0.0
77 2020-08-01                     152               0.0
78 2020-08-02                     152               0.0

Я хочу создать линейную диаграмму, где

  • Day находится на оси x, а
  • Total TODO/TODOE count и First Derivative находится на оси y.

Я использую для этого следующий код:

fig = daily_data_f_no_nr.plot(kind='line', figsize=(20, 16), fontsize=26, xticks=daily_data_f_no_nr['Day'], yticks=daily_data_f_no_nr['Total TODO/TODOE count'], y=['Total TODO/TODOE count', 'First Derivative']).get_figure()
fig.savefig(CHART_FILE)

CHART_FILE выглядит так:

Incorrect image (actual result)

No lines representing Total TODO/TODOE count and First Derivative are drawn.

What am I doing wrong? How do I need to change the code above in order to generate a graph like shown below (day on the x axis, Total TODO/TODOE count and First Derivative on the y)?

Ожидаемая / желаемая диаграмма

Обновление 1: Если я изменю код на

fig = daily_data_f_no_nr.plot(kind='line', figsize=(20, 16), fontsize=26, xticks=daily_data_f_no_nr['Day'], yticks=daily_data_f_no_nr['Total TODO/TODOE count'],x='Day', y=['Total TODO/TODOE count', 'First Derivative']).get_figure()

, я получаю сообщение об ошибке

Traceback (most recent call last):
  File "py\todo-count-delta.py", line 113, in <module>
    fig = daily_data_f_no_nr.plot(kind='line', figsize=(20, 16), fontsize=26, xticks=daily_data_f_no_nr['Day'], yticks=daily_data_f_no_nr['Total TODO/TODOE count'],x='Day', y=['Total TODO/TODOE count', 'First Derivative']).get_figure()
  File "C:\Users\User\anaconda3\lib\site-packages\pandas\plotting\_core.py", line 847, in __call__
    return plot_backend.plot(data, kind=kind, **kwargs)
  File "C:\Users\User\anaconda3\lib\site-packages\pandas\plotting\_matplotlib\__init__.py", line 61, in plot
    plot_obj.generate()
  File "C:\Users\User\anaconda3\lib\site-packages\pandas\plotting\_matplotlib\core.py", line 266, in generate
    self._adorn_subplots()
  File "C:\Users\User\anaconda3\lib\site-packages\pandas\plotting\_matplotlib\core.py", line 476, in _adorn_subplots
    ax.set_xticks(self.xticks)
  File "C:\Users\User\anaconda3\lib\site-packages\matplotlib\axes\_base.py", line 3350, in set_xticks
    ret = self.xaxis.set_ticks(ticks, minor=minor)
  File "C:\Users\User\anaconda3\lib\site-packages\matplotlib\axis.py", line 1755, in set_ticks
    self.set_view_interval(min(ticks), max(ticks))
  File "C:\Users\User\anaconda3\lib\site-packages\matplotlib\axis.py", line 1892, in setter
    setter(self, min(vmin, vmax, oldmin), max(vmin, vmax, oldmax),
TypeError: '<' not supported between instances of 'numpy.float64' and 'Timestamp'

Обновление 2: Вот результат print(daily_data_f_no_nr.info()):

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 79 entries, 0 to 78
Data columns (total 3 columns):
 #   Column                  Non-Null Count  Dtype
---  ------                  --------------  -----
 0   Day                     79 non-null     datetime64[ns]
 1   Total TODO/TODOE count  79 non-null     int64
 2   First Derivative        79 non-null     float64
dtypes: datetime64[ns](1), float64(1), int64(1)
memory usage: 2.0 KB
None

1 Ответ

1 голос
/ 02 августа 2020

Вариант 1: используйте столбец Day как x параметр

Вам следует добавить параметр x = 'Day':

fig = daily_data_f_no_nr.plot(kind='line', figsize=(20, 16), fontsize=26, xticks=daily_data_f_no_nr['Day'], yticks=daily_data_f_no_nr['Total TODO/TODOE count'], x = 'Day', y=['Total TODO/TODOE count', 'First Derivative']).get_figure()

С данными, которые вы предоставили выше (только начало и конец кадра данных):

введите описание изображения здесь

Вариант 2: установить столбец Day в качестве индекса фрейма данных

Вы можете установить столбец Day в качестве индекса фрейма данных с помощью:

daily_data_f_no_nr.set_index('Day', inplace = True)

Теперь вы можно построить его с помощью:

fig = daily_data_f_no_nr.plot(kind='line', figsize=(20, 16), fontsize=26, xticks=daily_data_f_no_nr.index, yticks=daily_data_f_no_nr['Total TODO/TODOE count'], y=['Total TODO/TODOE count', 'First Derivative']).get_figure()

И вы получите тот же график, что и выше.

Весь код

import pandas as pd
import matplotlib.pyplot as plt

daily_data_f_no_nr = pd.read_csv('data.csv')
daily_data_f_no_nr['Day'] = pd.to_datetime(daily_data_f_no_nr['Day'], format = '%Y-%m-%d')

daily_data_f_no_nr.set_index('Day', inplace = True)

fig = daily_data_f_no_nr.plot(kind='line', figsize=(20, 16), fontsize=26, xticks=daily_data_f_no_nr.index, yticks=daily_data_f_no_nr['Total TODO/TODOE count'], y=['Total TODO/TODOE count', 'First Derivative']).get_figure()

plt.show()
...