Matplotlib: изменение галочек даты и времени делает сюжет исчезающим - PullRequest
0 голосов
/ 30 апреля 2020

У меня возникли серьезные проблемы с изменением того, как и какие метки оси X представлены на моем графике.

У меня есть индекс даты и времени, и я хочу уменьшить количество отображаемых меток и удалить из него год. Должно быть просто, верно ?! Но, по какой-то причине, сюжет исчезает после того, как я установил основной форматер и локатор. Вот рабочий пример:

import datetime
import matplotlib.dates as mdates
import matplotlib.pyplot as plt
import pandas as pd

teste = pd.DataFrame(index=pd.date_range('2019-01-01','2019-12-31',freq='2D'),columns=['A','B','C'])
teste['A']=.4
teste['B']=.5
teste['C']=.1

for col in teste.columns:
    variation = np.random.rand(len(teste))
    teste[col]+=variation/10.0

teste['total']=teste.sum(axis=1)

for col in teste.columns:
    teste[col]/=teste['total']

ax = plt.figure(figsize=(24,10)).add_axes([0,0,1,1])

teste.drop('total',axis=1).plot(kind='bar',stacked='True',ax=ax,width=1,colormap='coolwarm')
ax.tick_params(labelsize=14)
ax.set_xlabel('')
ax.set_title('Teste',fontsize=28)
ax.set_ylabel('Share (%)',fontsize=22)
ax.tick_params(axis='both',labelsize=20)
ax.legend(bbox_to_anchor=(1.05, 1),fontsize=22, loc='upper left', borderaxespad=0.)

result from previous code
Как видите, пометки не читаются. Но когда я пытаюсь отформатировать:

ax = plt.figure(figsize=(24,10)).add_axes([0,0,1,1])

teste.drop('total',axis=1).plot(kind='bar',stacked='True',ax=ax,width=1,colormap='RdBu')
ax.xaxis_date()
ax.xaxis.set_major_locator(mdates.DayLocator(interval=10))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%d/%m"))
ax.xaxis.set_minor_formatter(mdates.DateFormatter("%d/%m"))
ax.set_xlim(teste.index[0],teste.index[-1])
ax.margins(0)
ax.tick_params(labelsize=14)
ax.set_xlabel('')
ax.set_title('Teste',fontsize=28)
ax.set_ylabel('Share (%)',fontsize=22)
ax.tick_params(axis='both',labelsize=20)
ax.legend(bbox_to_anchor=(1.05, 1),fontsize=22, loc='upper left', borderaxespad=0.)

enter image description here

Сюжет исчезает. Что я делаю неправильно? Я перепробовал все. plt.MaxNLocator (N = 10) также не работает. Он растягивает первые N точек по всей оси, полностью игнорируя, где это на самом деле должно быть. Любая помощь будет принята с благодарностью.

Заранее спасибо,

Редактировать: @Trenton McKinney:

Удаление ax.set_xlim (teste.index [0], teste.index [-1]) отображает сюжет, но без пробелов.

enter image description here

1 Ответ

2 голосов
/ 30 апреля 2020
  • Я использовал метод, показанный на веб-сайте Matplotlib: Столбчатая диаграмма с накоплением
  • С гистограммой у каждого бара есть местоположение [0, ..., n]
  • ind выбирает местоположения для метки
  • dates - названия выбранных тиков
ax = plt.figure(figsize=(24,10)).add_axes([0,0,1,1])

teste.drop('total',axis=1).plot(kind='bar',stacked='True',ax=ax,width=1,colormap='RdBu')

# locations of tick marks to label
ind = np.arange(0, len(teste.index)+1, 10)

# label for ticks
dates = teste.index.date[0::10]  # %y-%m-%d format
# dates = teste.index.strftime('%d/%m')[0::10]  # %d/%m format

# set the xticks
plt.xticks(ind, dates)

# only used to show locs and labels if you're having trouble
# locs, labels = plt.xticks()
# label_t = [x.get_text() for x in labels]

# formatting
ax.margins(0)
ax.tick_params(labelsize=14)
ax.set_xlabel('')
ax.set_title('Teste',fontsize=28)
ax.set_ylabel('Share (%)',fontsize=22)
ax.tick_params(axis='both',labelsize=20)
ax.legend(bbox_to_anchor=(1.05, 1),fontsize=22, loc='upper left', borderaxespad=0.)

plt.show()

enter image description here

Опционально

fig, ax = plt.subplots(figsize=(20, 8))

p1 = ax.bar(teste.index, teste.A)
p2 = ax.bar(teste.index, teste.B, bottom=teste.A)
p3 = ax.bar(teste.index, teste.C, bottom=teste.A+teste.B)

ax.xaxis_date()
ax.xaxis.set_major_locator(mdates.DayLocator(interval=10))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%d/%m"))
ax.set_xlim(teste.index[0],teste.index[-1])

plt.xticks(rotation=45, ha='right')  # or (rotation=90, ha='center')

plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...