Octave 绘图中 datetick 函数的意外行为
Unexpected behavior of datetick function in Octave plotting
我正在尝试绘制一个显示值随时间变化的图形。
为此,我有一组时间瞬间(在 Epoch 中)和一组值。
我已经能够使用原始时间(作为 Epoch)正常绘制图形。问题具体出在坐标轴时间格式的转换上。
hold on;
plot(horizontal, pre_X(:,4), 'b-');
xt = get(gca, 'xtick');
set(gca, 'xticklabel', sprintf('%d|', xt));
datetick ("x", "dd/mmm/YY HH:MM");
yt = get(gca, 'ytick');
set(gca, 'yticklabel', sprintf('%d|', yt));
hold off;
datetick 函数应该能够将这些 Epoch 时间转换为格式良好的时间,但我没有得到预期的结果。相反,所有时间点都被标记为相同的 (01/JAN/00 00:00),这很奇怪。
剧情没有
datetick ("x", "dd/mmm/YY HH:MM");
line 工作正常,但给出了 Epoch 中的时间信息,这不是我想要的。
如有任何帮助,我们将不胜感激!
注意:如果执行我打算执行的操作的正确功能结果不是 "datetick",也请告诉我!我所需要的只是将 X 轴格式化为可读时间。
编辑:大纪元时间,我指的是 Unix 时间。
缺乏更多信息,我假设你指的是 posix 或 Unix time
我希望它被表示为一个 32 位整数,并且应该是从 'zero time' 开始计算的秒数(如 Wiki 链接中所述)(它也可能是一个浮点数数字,包括使用相同比例的小数秒)。
根据Matlab help for datetick, it expects the axis data to be "serial date numbers, as returned by the datenum function". For compatibility, octave likely expects the same, although the datetick function reference没有明确说明。
datenum "serial date number" 格式是时间的另一种序列表示,但它与 Epoch/posix/unix 时间具有不同的比例和参考。根据datenum function description,其序号定义为"date/time input as a serial day number, with Jan 1, 0000 defined as day 1"。
你的时间可能以秒为单位,而 datenum 期望以天为单位,这是一种很长的说法。
现在,您或许可以通过几种方式解决这个问题。在绘图之前,您可以将所有时间转换为 datenum 比例。来自 this example,像这样的东西可以在 Matlab 中工作:
datetime(1470144960, 'convertfrom','posixtime')
根据 bug #47032 datetime has not yet been implemented in Octave, but that bug report does link to a github repository 日期时间 class 实现(在 inst/ 文件夹下)。
要手动从 unix 时间转换为 matlab 时间,您可以按照以下方式转换 example from the Mathworks File exchange:
unix_epoch = datenum(1970,1,1,0,0,0);
matlab_time = unix_time./86400 + unix_epoch;
(假设你的x轴数据是unix_time
变量)
将数据放入 'datenum' 范围后,datetick 应该会正确执行。
我正在尝试绘制一个显示值随时间变化的图形。 为此,我有一组时间瞬间(在 Epoch 中)和一组值。
我已经能够使用原始时间(作为 Epoch)正常绘制图形。问题具体出在坐标轴时间格式的转换上。
hold on;
plot(horizontal, pre_X(:,4), 'b-');
xt = get(gca, 'xtick');
set(gca, 'xticklabel', sprintf('%d|', xt));
datetick ("x", "dd/mmm/YY HH:MM");
yt = get(gca, 'ytick');
set(gca, 'yticklabel', sprintf('%d|', yt));
hold off;
datetick 函数应该能够将这些 Epoch 时间转换为格式良好的时间,但我没有得到预期的结果。相反,所有时间点都被标记为相同的 (01/JAN/00 00:00),这很奇怪。
剧情没有
datetick ("x", "dd/mmm/YY HH:MM");
line 工作正常,但给出了 Epoch 中的时间信息,这不是我想要的。
如有任何帮助,我们将不胜感激!
注意:如果执行我打算执行的操作的正确功能结果不是 "datetick",也请告诉我!我所需要的只是将 X 轴格式化为可读时间。
编辑:大纪元时间,我指的是 Unix 时间。
缺乏更多信息,我假设你指的是 posix 或 Unix time
我希望它被表示为一个 32 位整数,并且应该是从 'zero time' 开始计算的秒数(如 Wiki 链接中所述)(它也可能是一个浮点数数字,包括使用相同比例的小数秒)。
根据Matlab help for datetick, it expects the axis data to be "serial date numbers, as returned by the datenum function". For compatibility, octave likely expects the same, although the datetick function reference没有明确说明。
datenum "serial date number" 格式是时间的另一种序列表示,但它与 Epoch/posix/unix 时间具有不同的比例和参考。根据datenum function description,其序号定义为"date/time input as a serial day number, with Jan 1, 0000 defined as day 1"。
你的时间可能以秒为单位,而 datenum 期望以天为单位,这是一种很长的说法。
现在,您或许可以通过几种方式解决这个问题。在绘图之前,您可以将所有时间转换为 datenum 比例。来自 this example,像这样的东西可以在 Matlab 中工作:
datetime(1470144960, 'convertfrom','posixtime')
根据 bug #47032 datetime has not yet been implemented in Octave, but that bug report does link to a github repository 日期时间 class 实现(在 inst/ 文件夹下)。
要手动从 unix 时间转换为 matlab 时间,您可以按照以下方式转换 example from the Mathworks File exchange:
unix_epoch = datenum(1970,1,1,0,0,0);
matlab_time = unix_time./86400 + unix_epoch;
(假设你的x轴数据是unix_time
变量)
将数据放入 'datenum' 范围后,datetick 应该会正确执行。