对于时间序列图,如何将 x 轴设置为没有周末的日历时间
For a time series plot, how to set the x axis to calendar time without weekends
我想绘制时间序列(外汇期货合约的定价数据)。时间以 yyyymmdd HH:MM:SS
字符串格式给出。价格在 double
.
时间序列跨越一周。但是,数据点的时间戳总是在工作日。 是否有内置方法来显示适当的 x 轴标签和缩放比例但没有周末?
我目前可以通过将字符串中的时间戳转换为 datenum
and arrange x-axis automatically with datetick
来显示时间序列。但我想知道如何在 x 轴上排除周末。或者从没有数据的网格中排除任何延长的时间间隔。
有关视觉效果,请参阅末尾的示例。如果可以排除由于包括周末(4 月 10 日是美国假期)而导致的大空白 space,则通过关注实际有数据的地方,情节可以变得更加清晰。
数据点本身是工作日独有的。但是在 plot
和 datetick
之间,只要时间序列跨越一周,就会在周末创建网格点。 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);
看看结果:左边是标准版本,右边是手动设置刻度标签的版本。
我想绘制时间序列(外汇期货合约的定价数据)。时间以 yyyymmdd HH:MM:SS
字符串格式给出。价格在 double
.
时间序列跨越一周。但是,数据点的时间戳总是在工作日。 是否有内置方法来显示适当的 x 轴标签和缩放比例但没有周末?
我目前可以通过将字符串中的时间戳转换为 datenum
and arrange x-axis automatically with datetick
来显示时间序列。但我想知道如何在 x 轴上排除周末。或者从没有数据的网格中排除任何延长的时间间隔。
有关视觉效果,请参阅末尾的示例。如果可以排除由于包括周末(4 月 10 日是美国假期)而导致的大空白 space,则通过关注实际有数据的地方,情节可以变得更加清晰。
数据点本身是工作日独有的。但是在 plot
和 datetick
之间,只要时间序列跨越一周,就会在周末创建网格点。 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);
看看结果:左边是标准版本,右边是手动设置刻度标签的版本。