python - 如何使用日期时间 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)]
解决方案
我相信我找到了问题的答案:
# 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()
输出:
推荐阅读
- android - react-native android 构建失败:找不到 org.webkit:android-jsc:r224109
- typescript - 什么是角度状态管理?我为什么要使用它?
- javascript - 如何将视图内的javascript变量传递给php中的控制器
- laravel - laravel [Vue 警告]:编译模板时出错:
- python-3.x - 推荐的数据结构,用于存储带有数字的可变序列
- matlab - Simulink 错误:初始条件求解未能收敛
- c++ - 即使使用 lpthread,对 pthread 的未定义引用也会创建
- sql-server - 如何在选择语句中设置 2 个计算输出参数
- python - 在图像上执行反射中心垫
- python - 如何在 Keras 中实现具有残差连接和批量归一化的一维卷积神经网络?