我有一个看起来像这样的DataFrame图
绘制的DataFrame上的索引如下
In[102]: res.index
Out[102]:
Index([00:00:00, 00:05:00, 00:10:00, 00:15:00, 00:20:00, 00:25:00, 00:30:00,
00:35:00, 00:40:00, 00:45:00,
...
23:10:00, 23:15:00, 23:20:00, 23:25:00, 23:30:00, 23:35:00, 23:40:00,
23:45:00, 23:50:00, 23:55:00],
dtype='object', name='time', length=288)
x轴上描绘的时间是中央标准时间,我想在绘图顶部添加一个辅助x轴,并显示相应的UTC时间。我知道这会使数字变为6:00 ... 22:00 ... 4:00
,但这很好。 我该怎么做??
我知道可以使用以下内容创建第二个x轴,并且我设法从第一个x轴获得看起来像xticks
的内容如下 - 我的下一步将是试着确定如何将这些时间转移到UTC - 我仍然不确定想法。
ax2 = ax.twiny()
ax2.set_xlabel('UTC time')
local_ticks = ax.get_xticks().tolist()
然而,在绘制这个基本步骤时,我发现get_xticks()
比原始x轴产生了一个额外的刻度,因此它们没有对齐。
相应地,将这些视为秒并试图进行一些进一步的操作以进行秒 - > CST-> UTC仍然会在每个刻度处留下丑陋的缩放“双白线”。理想情况下,除了适当标记的UTC时间之外,我希望沿着辅助x轴的完全相同的标记。
如果你想生成像我提供的第一个图,我把它扔在一起。
import datetime
import numpy as np
import random
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('ggplot')
start_date = datetime.datetime(2016, 9, 5)
end_date = datetime.datetime.now()
dts = []
cur_date = start_date
while cur_date < end_date:
dts.append((cur_date, np.random.uniform(low=0.0, high=12.0)))
cur_date += datetime.timedelta(minutes=np.random.uniform(10, 20))
dts = pd.DataFrame(dts, columns=['timestamp', 'lag'])
dts.index = dts.timestamp
dts.drop('timestamp', axis=1, inplace=True)
cur_time = datetime.datetime(1, 1, 1, 0, 0)
aggs = []
while cur_time < datetime.datetime(1, 1, 1, 23, 59, 0):
aggs.append((cur_time.time(),
dts.between_time(cur_time.time(),
(cur_time + datetime.timedelta(minutes=5)).time(),
include_end=False)['lag'].mean()))
cur_time += datetime.timedelta(minutes=5)
res = pd.DataFrame(aggs, columns = ['time', 'lag'])
res.index = res.time
res.drop('time', axis=1, inplace=True)
ax = res.plot(figsize=(15, 10))
答案 0 :(得分:2)
我通过明确设置x轴刻度标签而不是让matplotlib决定来实现它。这可以通过以下方式完成:
ax.set_xticks([2*60*60*i for i in range(0,13)])
这具有额外的好处,即列出的时间不是随机的;您可以将增量设置为1小时,2小时......在上面的代码段中,2*
部分表示增加2小时。
然后,在其余代码中,您需要将轴复制到ax2,并手动设置标签。我是这样做的:
# Begin solution
ax.set_xticks([2*60*60*i for i in range(0,13)])
local_ticks = ax.get_xticks().tolist()
labels = [str(datetime.timedelta(seconds=(second+6*60*60))) for second in local_ticks]
ax2 = ax.twiny()
plt.sca(ax2)
ax2.set_xlabel('UTC time')
plt.xticks(local_ticks, labels)
这是最终图片:
更改上述轴中的“1天”部分可以使用字符串解析手动完成。
实际上,最简单的解决方法是简单地添加ax2.set_xticks(ax.get_xticks())
。我认为问题在于你没有明确说明轴1的xticks,但你做的是轴2;在创建绘图时,xticks已重新计算,而轴2的xticks保持不变。