Как автоматически выводить оси на графике панд ()

pandas plot

179 просмотра

1 ответ

Я изо всех сил пытаюсь воспроизвести элегантную легкость - и успешный результат - дразнящее обещание в разделе «Basic Plotting: plot» документации pandas df.plot () по адресу:

http://pandas.pydata.org/pandas-docs/stable/visualization.html#visualization

Там первое изображение авторов довольно близко к виду линейного графика, который я хочу построить из моего кадра данных. Их первый и последующий график представляет собой однострочник, как я и надеялся, что мой график ниже будет выглядеть при построении графика.

Мой DF выглядит так:

            2014-03-28  2014-04-04  2014-04-11  2014-04-18  \
Jenny Todd    1699.6      1741.6      1710.7      1744.2   

            2014-04-25  2014-05-02  2014-05-09  
Jenny Todd    1764.2      1789.7      1802.3 

Их второе изображение представляет собой многострочный график, очень похожий на тот, на который я рассчитывал, когда я пытаюсь построить многоиндексную версию моего df. Например:

                    2014-06-13  2014-06-20  2014-06-27  \
William Acer        1674.7      1689.4      1682.0   
Katherine Baker     1498.5      1527.3      1530.5   


                    2014-07-04  2014-07-11  2014-07-18  \
William Acer        1700.0      1674.5      1677.8   
Katherine Baker     1540.4      1522.3      1537.3   

                    2014-07-25  
William Acer        1708.0  
Katherine Baker     1557.1

Тем не менее, они получают участки. Я получаю безликие изображения объемом 3,3 КБ и предупреждение:

/home/lee/test/local/lib/python2.7/site-packages/matplotlib/axes/_base.py:2787: UserWarning: попытка установить идентичные левые == правые результаты в сингулярных преобразованиях; автоматически расширяется. левый = 0,0, правый = 0,0 'левый =% s, правый =% s')% (левый, правый))

Кажется, что у авторов документации есть функция plot (), определяющая из индексов df значения оси x, а также диапазон и значения оси y.

Осматривая, я могу найти людей с разными данными, разными индексами и разными сценариями (например, построение одного столбца против другого или попытка создать несколько вспомогательных участков), которые получают такую ​​ошибку «осей». Тем не менее, я не смог сопоставить их проблемы с моими.

Интересно, может ли кто-нибудь помочь разобраться, что отличается в моих данных или коде, что приводит к отличному исходу сюжета от похожих на документ данных и на вид похожего кода.

Мой код:

print plotting_df # (This produces the df examples I pasted above)
plottest = plotting_df.plot.line(title='Calorie Intake', legend=True)
plottest.set_xlabel('Weeks')
plottest.set_ylabel('Calories')
fig = plt.figure()
plot_name = week_ending + '_' + collection_name + '.png'
fig.savefig(plot_name)

Обратите внимание, что этот кадр данных динамически создается много раз в скрипте. При любом задании сценарий получит разные наборы дат, людей с разными именами и разные числа для построения. Так что я не могу предсказать, какие строки появятся для индексных и условных обозначений для предварительного построения. У меня есть предсказуемость о формате.

Я получаю, что индекс даты моего фрейма данных имеет даты в другом формате, чем указано в указанной документации. Это причина? Является ли это или нет, как лучше всего решить эту проблему?

Добавлено 2016-08-24, чтобы ответить на комментарий ниже о невозможности воссоздать мои данные

plotting_df создается на лету как подмножество гораздо большего информационного кадра. Это просто индекс (или иногда несколько индексов) и некоторые из столбцов даты, извлеченных из большего кадра данных. Код, который создает plotting_df, работает нормально и всегда создает plotting_df с правильными индексами и столбцами в формате, который я ожидаю.

Я могу смоделировать создание набора данных для хранения в plotting_df с этим кодом Python:

plotting_1 = {
          '2014-03-28': 1699.6,
          '2014-04-04': 1741.6,
          '2014-04-11': 1710.7,
          '2014-04-18': 1744.2,
          '2014-04-25': 1764.2,
          '2014-05-02': 1789.7,
          '2014-05-09': 1802.3
        }

plotting_df = pd.DataFrame(plotting_1, index=['Jenny Todd'])

и я могу смоделировать создание множественных индексов plotting_df с этим кодом Python:

plotting_2 = {
            'Katherine Baker': {
                '2014-06-13': 1498.5,
                '2014-06-20': 1527.3,
                '2014-06-27': 1530.5,
                '2014-07-04': 1540.4,
                '2014-07-11': 1522.3,
                '2014-07-18': 1537.3,
                '2014-07-25': 1557.1
            },
            'William Acer': {
                '2014-06-13': 1674.7,
                '2014-06-20': 1689.4,
                '2014-06-27': 1682.0,
                '2014-07-04': 1700.0,
                '2014-07-11': 1674.5,
                '2014-07-18': 1677.8,
                '2014-07-25': 1708.0
            }
}

plotting_df = pd.DataFrame.from_dict(plotting_2)

Я попробовал предложенное преобразование с кодом:

plotdf = plotting_df.T
plotdf.index = pd.to_datetime(plotdf.index)

так что мой оригинальный код теперь выглядит так:

print plotting_df # (This produces the df examples I pasted above)
plotdf = plotting_df.T # Transform the df - date columns to indices
plotdf.index = pd.to_datetime(plotdf.index) # Convert indices to datetime
plottest = plotdf.plot.line(title='Calorie Intake', legend=True)
plottest.set_xlabel('Weeks')
plottest.set_ylabel('Calories')
fig = plt.figure()
plot_name = week_ending + '_' + collection_name + '.png' 
fig.savefig(plot_name)

но я все равно получаю тот же результат (пустые изображения размером 3,3 КБ).

Я заметил, что добавление преобразования не имеет значения, когда я распечатал первый экземпляр plotdf. Так должен ли я делать какие-то другие преобразования?

Автор: leekimber Источник Размещён: 08.11.2019 11:28

Ответы (1)


1 плюс

Решение

Это ваша проблема:

fig = plt.figure()
plot_name = week_ending + '_' + collection_name + '.png' 
fig.savefig(plot_name)

Вы создаете вторую фигуру после создания первой, а затем сохраняете только эту вторую пустую фигуру. Просто выньте линию fig = plt.figure()и измените fig.savefigнаplt.savefig

Итак, вы должны иметь:

print plotting_df # (This produces the df examples I pasted above)
plotdf = plotting_df.T # Transform the df - date columns to indices
plotdf.index = pd.to_datetime(plotdf.index) # Convert indices to datetime
plottest = plotdf.plot.line(title='Calorie Intake', legend=True)
plottest.set_xlabel('Weeks')
plottest.set_ylabel('Calories')
plot_name = week_ending + '_' + collection_name + '.png' 
plt.savefig(plot_name)
Автор: jsignell Размещён: 26.08.2016 12:29
Вопросы из категории :
32x32