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。
感谢所有想法。干杯
答案 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()
答案 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:再次感谢您将我推向正确的方向。