axes.set_xticklabels перерывает формат даты и времени - PullRequest
0 голосов
/ 23 октября 2018

я пытаюсь навязать свою волю этому графику matplotlib.Когда я устанавливаю ax1.xaxis.set_major_formatter(myFmt), он работает нормально, как на верхнем графике .Однако, когда я добавляю ax1.set_xticklabels((date),rotation=45) формат времени возвращается к времени matplotlib, как на нижнем графике .

Оба используют одну и ту же переменную времени ввода.Я также попробовал ax1.plot_date(), но это только меняет внешний вид графика, а не формат времени.,

    date_1 = np.vectorize(dt.datetime.fromtimestamp)(time_data) # makes a datetimeobject from unix timestamp
    date = np.vectorize(mdates.date2num)(date_1) # from datetime makes matplotib time
    myFmt = mdates.DateFormatter('%d-%m-%Y/%H:%M')

    ax1 = plt.subplot2grid((10,3), (0,0), rowspan=4, colspan=4)
    ax1.xaxis_date()
    ax1.plot(date, x)

    ax1.xaxis.set_major_formatter(myFmt) 
    ax1.set_xticklabels((date),rotation=45)#ignores time format

Есть идеи, как я могу наложить пользовательский формат времени на xticklabels?Я получаю, что xticklabels напрямую читает и отображает переменную даты, но разве нельзя сделать так, чтобы она придерживалась формата?Особенно, если вы позже захотите добавить метки в пользовательских местах дат.

Все идеи приветствуются.Приветствия

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Хорошо, я думаю, что получил это сейчас.

    str_dates = []
    for i in time_data:
        j = dt.datetime.fromtimestamp(i)
        k = j.strftime('%d-%m-%Y/%H:%M')
        str_dates.append(k)
    print(str_dates)
    ax1.set_xticklabels((str_dates),rotation=45)

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

@ iDrwish: спасибо еще раз, что вы подтолкнули меня в правильном направлении.

0 голосов
/ 23 октября 2018

Локатор определяет местоположение галочек.Форматировщик форматирует метки в этих позициях.Использование форматера, например

ax1.xaxis.set_major_formatter(dates.DateFormatter('%d-%m-%Y/%H:%M'))

, следовательно, работает хорошо.Однако, используя set_xticklabels после указания форматера, удаляет DateFormatter и заменяет его на FixedFormatter.Следовательно, вы будете получать метки в автоматически выбранных позициях, но с метками, которые не соответствуют этим позициям.Следовательно, график будет помечен неправильно.Следовательно, никогда не следует использовать set_xticklabels без указания пользовательского локатора , например, также через set_xticks.

Здесь вообще нет необходимости использовать set_xticklabels.Одного форматера достаточно.

import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import numpy as np

time_data = np.array([1.5376248e+09,1.5376932e+09,1.5377112e+09])
x = np.array([1,3,2])

date_1 = np.vectorize(dt.datetime.fromtimestamp)(time_data)
date = np.vectorize(mdates.date2num)(date_1)
myFmt = mdates.DateFormatter('%d-%m-%Y/%H:%M')

ax1 = plt.subplot2grid((4,4), (0,0), rowspan=4, colspan=4)
ax1.xaxis_date()
ax1.plot(date, x)

ax1.xaxis.set_major_formatter(myFmt)
plt.setp(ax1.get_xticklabels(), rotation=45, ha="right")
plt.show()

enter image description here

0 голосов
/ 23 октября 2018

Вы можете привести свой формат времени, преобразовав объект datetime в строку.

Вам придется выполнить специальную обработку дат, если они представлены в формате utc:

from datetime import datetime
str_dates = [datetime.utcfromtimestamp(timestamp).strftime('%d-%m-%Y/%H:%M') for timestamp in date]
ax1.set_xticklabels((str_dates),rotation=45)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...