对于时间序列图,如何将x轴设置为没有周末的日历时间 [英] For a time series plot, how to set the x axis to calendar time without weekends

查看:17
本文介绍了对于时间序列图,如何将x轴设置为没有周末的日历时间的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想绘制一个时间序列(外汇期货合约的定价数据)。时间以yyyymmdd HH:MM:SS字符串格式给出。价格在double中。

时间序列跨度超过一周。但是,数据点的时间戳始终在工作日。是否有内置方法可以显示适当的x轴标签和缩放,但不在周末?

我目前可以通过将字符串中的时间戳转换为datenum来显示时间序列,并使用datetick自动排列x轴。但我想知道如何排除x轴上的周末。或者从没有数据的网格中排除任何延长的时间间隔。

可视内容请参见末尾的示例。如果可以排除由于包括周末(4月10日是美国假期)而产生的大量空白,那么通过关注实际存在数据的位置,情节就会变得更加清晰。

数据点本身仅限于工作日。但在plotdatetick之间,只要时间序列跨越一周,就会在周末创建网格点。datetick非常有用,因为它可以检测x轴网格的适当比例,并一次性应用相应的网格标签。如果您将datetick视为解决方案的一部分,是否有办法在使用datetick后删除特定网格点?

示例:

T=[7.378903958333334e+05;7.378967076388889e+05]; % converted from "20200409 09:30:00" and "20200415 16:59:00"
C=[0.7166;0.7090]; 

grid on
plot(T,C,'.')
xlim([min(T),max(T)])
datetick
如果您有兴趣修改相同的绘图,请通过c&;p将数据从pastebin检索到MatLab cmd中。上面的相同行将生成以下图形。

推荐答案

没有此类功能。可能是因为这实际上会使x轴不连续,这(通常)是不可取的。

您必须创建一个合成的x轴来实现这一点,方法是对周末(或者更确切地说,非工作日)进行排序。 这是标准图(工作日为蓝色)

% create data
T = 7.3789e+05+(0:5:100)/10.';
C = rand(size(T)); 

% is a busniess day?
lg = isbusday(T);

% standard date plot
plot(T(lg),C(lg),'o', T(~lg),C(~lg),'o')
datetick('x','ddd')

现在让我们去掉其他日子,手动设置xTickLabel

T = T(lg);
C = C(lg);
% plot without time-axis
plot(C,'o')

% --- get ticks
xTick = get(gca,'XTick');
% get which ticks are integers
lg = isreal(xTick) & rem(xTick,1)==0;
XTick_new = xTick(lg);
% --- create new tick label
xTickLbl_new_num = NaN(size(XTick_new));
% make sure they are within the limits
lg = XTick_new >= 1 & XTick_new <= length(T);
xTickLbl_new_num(lg) = T(XTick_new(lg));
% convert to string (arbitrary format)
xTickLbl_new_str = strings(size(xTickLbl_new_num));
xTickLbl_new_str(lg) = datestr(xTickLbl_new_num(lg),'ddd');
% set new label
set(gca,'XTick',XTick_new,'XTickLabel',xTickLbl_new_str);
查看结果:左边是标准版本,右边是手动设置了勾号标签的版本。

这篇关于对于时间序列图,如何将x轴设置为没有周末的日历时间的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆