Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python axes.set\u xticklabels中断日期时间格式_Python_Matplotlib - Fatal编程技术网

Python axes.set\u xticklabels中断日期时间格式

Python axes.set\u xticklabels中断日期时间格式,python,matplotlib,Python,Matplotlib,我试图把我的意志强加在这张matplotlib图表上。当我设置ax1.xaxis.set\u major\u formatter(myFmt)时,它可以像在中一样正常工作。 但是,当我添加ax1.setxticklabels((日期),rotation=45)时,时间格式将恢复为matplotlib时间,如中所示 两者都使用相同的输入时间变量。我还尝试了ax1.plot_date(),但这只会改变图形的外观,而不会改变时间格式 date_1 = np.vectorize(dt.datet

我试图把我的意志强加在这张matplotlib图表上。当我设置
ax1.xaxis.set\u major\u formatter(myFmt)
时,它可以像在中一样正常工作。 但是,当我添加
ax1.setxticklabels((日期),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
有没有办法将自定义时间格式强制添加到Xticklabel上?我知道xticklabels直接读取和显示日期变量,但是否有可能使其保持格式不变?特别是如果您以后想在自定义日期位置添加XTICK


所有想法都受到赞赏。Cheers

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

好吧,我想我现在明白了

    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)
我不知道为什么这不适用于矢量化,但是一个接一个地记录每个日期会删除数组给我的错误源


@再次感谢你把我推向了正确的方向

定位器指定记号的位置。格式化程序在这些位置格式化标签。使用格式化程序,比如

ax1.xaxis.set_major_formatter(dates.DateFormatter('%d-%m-%Y/%H:%M'))
因此效果很好。但是,在指定格式化程序后,使用
setxticklabels
删除日期格式化程序,并将其替换为
FixedFormatter
。因此,您将在自动选择的位置获得标签,但标签与这些位置不对应。因此,图形的标签将不正确。 因此,在未指定自定义定位器的情况下,切勿使用
setxticklabels
,例如通过
setxticks

这里根本不需要使用
setxticklabels
。仅格式化程序就足够了

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()

我明白了,完全有道理。但您的第一行似乎无法应用于数组。我尝试了
str\u dates=np.vectorize(dt.datetime.strftime(“%d-%m-%Y/%H:%m”))(date\u 1)
,但由于某种原因,它无法将date\u 1识别为datetime对象。最后,我不熟悉你第一行的语法。方括号在做什么?对于日期中的时间戳,
应该实现什么呢?我的语法用于列表理解。你使用的是np.array吗?啊,我不知道有人可以做这样的列表*哇*很多东西,是的,时间数据是numpy数组中的一列
np.array
支持迭代,所以应该没有问题。您收到的错误消息是什么?
-->311 str_dates=[timestamp.strftime(“%d-%m-%Y/%H:%m”)AttributeError:“numpy.float64”对象没有属性“strftime”
在不指定自定义定位器的情况下,切勿使用
set_xticklabels
,例如通过
set_xticks
。啊哈,这更接近我的想象。当一个人想要设计不同的子地块时,plt.setp是否也有一个轴等价物?为了正确理解这一点,只要我不干扰set_xticklabel,set_xticks将坚持使用dateformatter?这将使处理定制的xtick位置对于不同的子批次也更加容易,您将使用
plt.setp(ax1.get_something())
plt.setp(ax2.get_something())
设置定位器。您可以将任何格式化程序与此一起使用(除了
AutoDateFormatter