В Matplotlib отсутствуют метки x отметок

Как только я запускаю приведенный ниже код, метки x для третьего графика, ax3, не отображаются. Тем не менее, я удалил только метки с отметками x для ax1 и ax2. Любое решение, чтобы даты отображались на оси x моего третьего графика, ax3?

plt.figure()
ax1 = plt.subplot2grid((8,1),(0,0), rowspan=4, colspan=1)
ax1.yaxis.set_major_locator(mticker.MaxNLocator(nbins=10, prune='lower'))
plt.setp(ax1.get_xticklabels(), visible=False)

ax2 = plt.subplot2grid((8,1),(4,0), rowspan=2, colspan=1, sharex = ax1)
plt.setp(ax2.get_xticklabels(), visible=False)

ax3 = plt.subplot2grid((8,1),(6,0), rowspan=2, colspan=1, sharex = ax1)
ax3.xaxis.set_major_locator(mticker.MaxNLocator(10))
ax3.xaxis.set_minor_locator(mticker.MaxNLocator(20))

'''
# This has been ***removed*** in corrected version
for label in ax3.xaxis.get_ticklabels():
        label.set_rotation(45)
        plt.xlabel('Dates') #This label does not appear in the figure either
'''

ax3.yaxis.set_major_locator(mticker.MaxNLocator(nbins=5, prune='upper'))

main.dropna(inplace=True)                          
main['sales1'].plot(ax=ax1)
main['sales2'].plot(ax=ax1)
cmain.plot(ax=ax2)
main[['rollsales1', 'rollsales2']].plot(ax=ax3)

'''
# This has been added to corrected version.   
plt.setp(ax3.xaxis.get_label(), visible=True, text='Dates')
plt.setp(ax3.get_xticklabels(), visible=True, rotation=30, ha='right')
'''    

plt.show()

person econ99    schedule 15.03.2017    source источник
comment
У вас слишком много кода. Предоставьте минимальный, полный и поддающийся проверке пример.   -  person James    schedule 16.03.2017
comment
Сократил его до того места, где, как я думаю, может возникнуть проблема. Спасибо за отзыв.   -  person econ99    schedule 16.03.2017
comment
Какую версию matplotlib вы используете?   -  person James    schedule 16.03.2017
comment
Я использую matplotlib 2.0.0   -  person econ99    schedule 16.03.2017


Ответы (1)


В matplotlib использование sharex или sharey отключает метки по умолчанию в версии 2. Таким образом, вы можете удалить фрагменты кода, которые устанавливают видимость метки на False. Кроме того, вместо того, чтобы перебирать каждую метку для изменения параметров, вы можете установить параметры для всех сразу, используя setp.

Мне пришлось создать поддельные данные для имитации ваших графиков, поэтому мои данные могут выглядеть странно.

plt.figure()
ax1 = plt.subplot2grid((8,1),(0,0), rowspan=4, colspan=1)
ax2 = plt.subplot2grid((8,1),(4,0), rowspan=2, colspan=1, sharex=ax1)
ax3 = plt.subplot2grid((8,1),(6,0), rowspan=2, colspan=1, sharex=ax1)

ax1.yaxis.set_major_locator(mticker.MaxNLocator(nbins=10, prune='lower')
ax3.yaxis.set_major_locator(mticker.MaxNLocator(nbins=5, prune='upper'))

main.dropna(inplace=True)
main['sales1'].plot(ax=ax1)
main['sales2'].plot(ax=ax1)
cmain.plot(ax=ax2)
main[['rollsales1', 'rollsales2']].plot(ax=ax3)

# set the xaxis label
plt.setp(ax3.xaxis.get_label(), visible=True, text='Dates')
# set the ticks
plt.setp(ax3.get_xticklabels(), visible=True, rotation=30, ha='right')
# turn off minor ticks
plt.minorticks_off()
plt.show()

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

person James    schedule 15.03.2017
comment
Оно работает! Я очень ценю это! Я добавил две цифры вверху (даты по оси X указаны за месяц), сначала чтобы показать результаты, а затем по мере увеличения масштаба. В качестве последнего дополнительного вопроса: как я могу заполнить больше оси X? На втором рисунке, как мне сделать так, чтобы месяцы отображались при увеличении? - person econ99; 16.03.2017
comment
Попробуйте использовать plt.tight_layout(), прежде чем настраивать вертикальное расстояние между графиками. Также не забудьте пометить вопрос как отвеченный :) - person James; 17.03.2017
comment
Я пытался использовать plt.tight_layout(), но по какой-то причине это все еще не работает. - person econ99; 17.03.2017