首页 > 解决方案 > 如何使用日期时间 x 变量设置多个 x 轴

问题描述

我正在尝试为我的绘图使用两种不同的时间尺度(在我的情况下,阿拉斯加标准时间或 LT 和 GMT)。我将 datetime 用于 x 变量:

我需要的

当我定义新标签和新位置(在日期时间中)时,我得到一个与旧轴具有相同标签的新轴:

生成带有蓝线及其输出的图形的代码:

xxx = np.array([datetime(2019,7,1,1,0,0) + timedelta(hours=i) for i in xrange(9)])
yyy = np.arange(np.size(arr))

plt.figure()
f, (ax1) = plt.subplots(1, figsize=(15,8))

ax1.plot(xxx,yyy)
ax1.set_xlabel('Universal Time')
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))

ax2 = ax1.twiny()

newlabel = xxx+timedelta(hours = 9)

UTtoLT = lambda t: t-timedelta(hours=9)  # convert function: from Universal time to Local time
newpos   = [UTtoLT(t) for t in newlabel]   # position of the xticklabels in the old x-axis

newpos = newlabel-timedelta(hours=9)
ax2.set_xticks(newpos)

ax2.set_xticklabels(newlabel)

print 'new positions:',newpos
print 'new labels:',newlabel

ax2.xaxis.set_ticks_position('bottom') # set the position of the second x-axis to bottom
ax2.xaxis.set_label_position('bottom') # set the position of the second x-axis to bottom
ax2.spines['bottom'].set_position(('outward', 36))
ax2.set_xlabel('LT')
ax2.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))

ax2.set_xlim(ax1.get_xlim())
plt.show()
>>> new positions: [datetime.datetime(2019, 7, 1, 1, 0) datetime.datetime(2019, 7, 1, 2, 0)
 datetime.datetime(2019, 7, 1, 3, 0) datetime.datetime(2019, 7, 1, 4, 0)
 datetime.datetime(2019, 7, 1, 5, 0) datetime.datetime(2019, 7, 1, 6, 0)
 datetime.datetime(2019, 7, 1, 7, 0) datetime.datetime(2019, 7, 1, 8, 0)
 datetime.datetime(2019, 7, 1, 9, 0)]
>>> new labels: [datetime.datetime(2019, 7, 1, 10, 0) datetime.datetime(2019, 7, 1, 11, 0)
 datetime.datetime(2019, 7, 1, 12, 0) datetime.datetime(2019, 7, 1, 13, 0)
 datetime.datetime(2019, 7, 1, 14, 0) datetime.datetime(2019, 7, 1, 15, 0)
 datetime.datetime(2019, 7, 1, 16, 0) datetime.datetime(2019, 7, 1, 17, 0)
 datetime.datetime(2019, 7, 1, 18, 0)]

我得到了什么 有人知道如何解决这个问题吗?

标签: pythonpython-2.7datetimejupyter-notebook

解决方案


我相信我找到了问题的答案:

# define the datetime array:
xxx = np.array([datetime(2019,7,1,22,0,0) + timedelta(hours=i) for i in xrange(9)])


def transformDatetimetoList(xxx):
    '''
    Transforms datetime array to list of decimal times and ultimately transforms the x axis from datetime
    to decimal values
    '''
    xx = []
    for xind in range(np.size(xxx)):

        xx.append((xxx[xind].hour+xxx[xind].minute/60.+xxx[xind].second/3600.)/24.+xxx[xind].day)
    return xx
def transformDatetimetoListString(xxx):
    '''
    Transforms datetime array to list of string times and converts the datetime array into a string array with 
    the labels
    '''
    xx = []
    for labelindex in range(np.size(xxx)):
        if xxx[labelindex].minute < 10:
            xx.append(str(xxx[labelindex].hour)+':0'+str(xxx[labelindex].minute))
        else:
            xx.append(str(xxx[labelindex].hour)+':'+str(xxx[labelindex].minute))
    return xx

# Define y axis variable:
yyy = np.arange(np.size(xxx))

yyy = yyy*np.sin(yyy)
#Creating the x-axis variable in decimals:
xx = transformDatetimetoList(xxx)

#Plot ax1:
plt.figure()
f, (ax1) = plt.subplots(1, figsize=(15,8))
ax1.plot(xx,yyy)
ax1.set_xlabel('Universal Time')
ax1.set_xticks(xx)
ax1.set_xticklabels(transformDatetimetoListString(xxx))


#Set ax2 as twiny of ax1:
ax2 = ax1.twiny()

#Defining new labels for 
newlabel = transformDatetimetoListString(xxx+timedelta(hours=9))

ax2.xaxis.set_ticks_position('bottom') 
ax2.xaxis.set_label_position('bottom')
ax2.spines['bottom'].set_position(('outward', 36))
ax2.set_xlabel('Local Time')

ax2.set_xticks(xx) #Must be same as the plot for ax1!!
ax2.set_xticklabels(newlabel)


ax2.set_xlim(ax1.get_xlim())
plt.show()

输出:

在此处输入图像描述


推荐阅读