Matplotlib, построение серии панд: AttributeError: объект «кортеж» не имеет атрибута «xaxis»

Я рисую данные серии Pandas, которые записывают сумму «событий» каждую неделю в 1981 году. Серия называется «weekly_data».

1981-03-16    1826
1981-03-23    1895
1981-03-30    1964
1981-04-06    1978
1981-04-13    2034
1981-04-20    2073
1981-04-27    2057
dtype: int64

Я хотел бы расставить галочки по годам и по неделям. Когда я пытаюсь построить это, я получаю AttributeError:

fig = plt.figure(figsize=(12,5))
ax = plt.subplots(111)
plt.plot(weekly_data, color = 'green' )
yloc = YearLocator()
mloc = MonthLocator()
ax.xaxis.set_major_locator(yloc)
ax.xaxis.set_minor_locator(mloc)
ax.grid(True)
plt.show()

Ошибка

AttributeError                            Traceback (most recent call last)
<ipython-input-92-843dbab30ed7> in <module>()
      6 yloc = YearLocator()
      7 mloc = MonthLocator()
----> 8 ax.xaxis.set_major_locator(yloc)
      9 ax.xaxis.set_minor_locator(mloc)
     10 ax.grid(True)

AttributeError: 'tuple' object has no attribute 'xaxis'

Как я могу это исправить?

РЕДАКТИРОВАТЬ: После Майка Мюллера ошибка выше была plt.subplot(111). Однако я по-прежнему не могу заставить работать еженедельные тики. Возможно, нам нужно использовать ax.set_xticks(major_ticks) или ax.set_xticks(minor_ticks, minor=True)

Вот данные серии панд, которые я рисую с 1991 года.

Datetime
1990-12-23    1980
1990-12-30    1860
1991-01-06    1761
1991-01-13    1792
1991-01-20    1825
....
dtype: int64

и это код

fig = plt.figure(figsize=(12,5))
ax = plt.subplot(111)
plt.plot(weekly_data1991, color = 'green' )
yloc = YearLocator()
mloc = MonthLocator()
ax.xaxis.set_major_locator(yloc)
ax.xaxis.set_minor_locator(mloc)
ax.grid(True)
plt.show()

Вот вывод сюжета

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

я сам в замешательстве


person ShanZhengYang    schedule 21.12.2015    source источник
comment
Ну, я не знаю о matplotlib, но я думаю, что plt.gca() возвращает кортеж в этом случае (или, может быть, plt.subplots(111) возвращает кортеж).   -  person Casimir Crystal    schedule 21.12.2015
comment
@KevinGuan частично прав - plt.subplots вернет кортеж, содержащий фигуру и оси (хотя plt.gca просто возвращает оси). Обычно я распаковывал вывод так: fig, ax = plt.subplots(1, 1). Если имеется более одной строки и/или столбца, то ax будет пустым массивом объектов оси.   -  person ali_m    schedule 21.12.2015
comment
@ali_m: Ага, теперь понял :)   -  person Casimir Crystal    schedule 21.12.2015
comment
@ali_m К сожалению, fig, ax = plt.subplots(1, 1) удаляет все галочки с рассматриваемого сюжета, большие или второстепенные.   -  person ShanZhengYang    schedule 21.12.2015


Ответы (1)


Вы создаете 111 подзаголовков. Изменять:

ax = plt.subplots(111)

в:

ax = plt.subplot(111)

и у вас это должно работать. Он создает один массив подзаголовков из одной строки, одного столбца и одного подзаголовка. Например, это:

plt.subplot(231)
plt.subplot(236)

создает подзаголовок 1 и подзаговор 6 в массиве из 2 строк и 3 столбцов:

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

Вы делаете месяцы видимыми с помощью:

ax.xaxis.set_minor_formatter(matplotlib.dates.DateFormatter('%B'))

Год и месяц печатаются друг над другом. Одно из решений состоит в том, чтобы иметь годы вверху и месяцы внизу:

ax.xaxis.set_tick_params(labeltop='on', labelbottom='off')

Использовать:

mloc = matplotlib.dates.MonthLocator(range(1, 12, 4))

показывать только каждый четвертый месяц.

person Mike Müller    schedule 21.12.2015
comment
Ах, я пропустил это. Спасибо вам за помощь. Можете ли вы объяснить стандарт 111? Что это означает? Кроме того, см. мое редактирование выше --- к сожалению, нет ежемесячных тиков... - person ShanZhengYang; 21.12.2015
comment
Да спасибо. Метки расположены так близко друг к другу --- есть ли способ отобразить каждый четвертый месяц? - person ShanZhengYang; 22.12.2015