Отображается matplotlib xlabel, и ввод set_xticklabels не соответствует - PullRequest
0 голосов
/ 19 октября 2019

У меня есть два графика;один сверху и один снизу. Все, кроме метки xaxis, неверно на верхнем графике, но все, кроме метки xaxis, верно на нижнем графике. Поэтому, естественно, кто-то изо всех сил попытается заменить неправильную метку xaxis верной меткой xaxis, верно? Это то, что я сделал, но по какой-то причине matplotlib всегда не может принять правильную метку xaxis, хотя я в значительной степени форсирую ввод метки xaxis.

Следующий код генерирует два упомянутых мною графика.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from datetime import datetime
np.random.seed(0)

x_var1= pd.date_range(datetime(2014, 1, 14, 9, 0),datetime(2014, 1, 24, 17, 0),
                   freq="30min",
                   tz= 'US/Pacific',
                   closed= 'left'
                   )

x_var1 = x_var1[x_var1.dayofweek < 5]
x_var1= x_var1[x_var1.indexer_between_time('9:00','17:00', include_end= False)]
x_var1= x_var1[x_var1.hour != 12]

y_var1= np.random.normal(loc= 40, scale= 4.4, size= len(x_var1))
int_gap_idx= np.nonzero((x_var1[:-1].hour!= 9) & (x_var1[1:].hour== 9))[0]


fig, ax= plt.subplots(nrows= 2, ncols= 1)

ax[0].plot(x_var1, y_var1)
ax[0].set_title("Except the xaxis label, everything is wrong on this graph")


x_var2= np.arange(len(x_var1))
ax[1].plot(x_var2, y_var1)
ax[1].set_title("Except the xaxis label, everything is correct on this graph")

[ax[1].axvline(gap_index, ls= '--') for gap_index in int_gap_idx]


#date_str= x_var1.strftime('%b-%d %H:%M')
ax[1].set_xticklabels(x_var1)
#print(date_str)

plt.xticks(rotation= 45)
plt.tight_layout()
plt.show()

Сюжет:

enter image description here

Как видите, нижний график отображает дату и время только 14 января, хотя данные находятся в период с 14 января по 24 января.

1 Ответ

1 голос
/ 19 октября 2019

Ваш x_var1 неправильная длина, но вы можете использовать функцию формата тикера. Обязательно

import matplotlib.ticker as ticker

Затем используйте его в функции, которую можно передать позже, это должно сохранить конфигурацию оси при масштабировании

N = len(x_var1)
def format_date(x, pos=None):
    thisind = np.clip(int(x + 0.5), 0, N - 1)
    return x_var1[thisind].strftime('%b-%d %H:%M')

ax[1].xaxis.set_major_formatter(ticker.FuncFormatter(format_date))
...