2

我遇到了这个问题:当我在没有 x 值的 Octave 中绘图时,没关系。当我添加 x 值(应该是日期,但我没有强加日期格式)时,它变得很奇怪

ab = rand(96,1);
close all
figure
plot(ab)

给出这个数字:

没有 x 值的绘图

close all
figure
plot(datenum('01-Nov-2020 00:00','dd-mmm-yyyy HH:MM'):1/24/4:datenum('01-Nov-2020 23:45','dd-mmm-yyyy HH:MM'),ab)

给出这个图: 带有 x 值的绘图 如您所见,x 值都在 1 天内,所以我什至不知道为什么 x 刻度显示超过 1 天...

任何人都会有一个聪明的解释?

4

1 回答 1

4

编辑:正如Tasos 在较早的答案中所述,这是“OpenGL 无法处理将小数添加到大数时所涉及的精度的问题”


从我的角度来看,这“只是”一个 Octave 错误,MATLAB(用 MATLAB Online 测试)没有显示出这种行为。x看起来,当实际x值相对较高时,Octave 存在小间隔的问题,参见。

subplot(2, 1, 1);
x = linspace(800000, 800000 + 2*pi, 100);
y = sin(x);
plot(x, y);

subplot(2, 1, 2);
x = linspace(0, 2*pi, 100);
y = sin(x);
plot(x, y);

对应的输出是:

输出正弦波

看来,一些x价值观正在“合并”!?我还没有深入搜索有关该问题的报告错误...

但是,要在您的情况下解决该问题,您可以尝试从 开始绘制数据0,然后再调整xticklabels

% Data
ab = rand(96, 1);

figure(1);

% Plot without dates
subplot(3, 1, 1);
plot(ab);
xlim([1, 96]);

% Plot with dates (standard, faulty)
subplot(3, 1, 2);
dates = linspace(datenum('01-Nov-2020 00:00', 'dd-mmm-yyyy HH:MM'), 
                 datenum('01-Nov-2020 23:45', 'dd-mmm-yyyy HH:MM'), 
                 size(ab, 1))
plot(dates, ab);
datetick('x', 'dd-mm-yyyy HH:MM');
xlim([dates(1), dates(end)]);

% Plot with dates (custom, correct)
subplot(3, 1, 3);
# For plotting, subtract start date
dates_for_plot = dates - datenum('01-Nov-2020 00:00', 'dd-mmm-yyyy HH:MM')
plot(dates_for_plot, ab);
datetick('x', 'dd-mm-yyyy HH:MM');
# Add custom xticklabels with re-added start date
xlim([dates_for_plot(1), dates_for_plot(end)]);
xticklabels(cellstr(datestr(xticks + datenum('01-Nov-2020 00:00', 
                                             'dd-mmm-yyyy HH:MM'))));

那将是输出:

输出数据

于 2020-12-16T10:47:23.113 回答