axes.set_xticklabels中断日期时间格式

时间:2018-10-23 09:25:21

标签: python matplotlib

我试图将我的意志强加到这个matplotlib图上。当我设置ax1.xaxis.set_major_formatter(myFmt)时,它的工作原理就像在upper graph中一样。 但是,当我添加ax1.set_xticklabels((date),rotation=45)时,时间格式会像lower graph中一样恢复为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

有什么想法可以将自定义时间格式强制设置到xticklabel上吗?我知道xticklabels直接读取并显示date变量,但是否应该使其遵循格式?尤其是如果您以后要在自定义日期位置添加xticks。

感谢所有想法。干杯

3 个答案:

答案 0 :(得分:0)

定位器指定刻度线的位置。格式化程序在那些位置格式化刻度线标签。使用格式化程序,例如

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

答案 1 :(得分:-1)

您可以通过将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)

答案 2 :(得分:-1)

好的,我想我明白了。

    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)

我不确定为什么这不适用于vectorize,但是将每个日期一一删除就可以消除数组给我的错误源。

@iDrwish:再次感谢您将我推向正确的方向。