在 MATLAB 中使用 OpenGL 渲染器的绘图不正确

Incorrect plots using OpenGL renderer in MATLAB

我正在尝试使用 OpenGL 在图表上绘制大量数据。我想使用这个渲染器,因为它是唯一支持透明度的渲染器。数据绘制得很好,但是一旦放大连接数据点的线就不会正确排列,如下所示: 我已经测试过使用 Painters 和 Zbuffer 绘制数据,当放大相同数量时,线条可以正确连接数据。这是 Zbuffer 生成的(Painters 看起来完全一样,但网格线更粗):

您可以使用下面的代码重现问题。请注意,这不会创建与所示完全相同的图,但仍清楚地说明了问题。

t = [735480.784722222 735480.826388889 735480.868055556 735480.909722222 735480.951388889 735481 735481.034722222 735481.076388889 735481.118055556 735481.159722222 735481.201388889 735481.243055556 735481.284722222 735481.326388889 735481.368055556 735481.409722222 735481.451388889 735481.493055556 735481.5 735481.534722222 735481.576388889];
d = [10.0799999237061 10.0799999237061 10.0799999237061 10.0699996948242 10.0699996948242 10.0799999237061 10.0699996948242 10.0699996948242 10.0699996948242 10.0699996948242 10.0699996948242 10.0600004196167 10.0600004196167 10.0600004196167 10.0699996948242 10.0699996948242 10.0600004196167 10.0600004196167 10.0600004196167 10.0600004196167 10.0500001907349];
figure;
plot(t, d, '.-');
set(gcf, 'renderer', 'opengl');

我在 MATLAB 答案 上找到了 similar questionMathWorks 支持团队 回复了:

The OpenGL renderer uses only single precision. As a result, and the numbers that are being plotted are not able to be resolved using OpenGL. The Painters and ZBuffer renderers use double precision[...]

您提供的数据比单精度浮点数所能表示的精度更高。因此它不会正常显示。

一个解决方法可能是只绘制数据的最低有效数字(例如,通过减去前导数字)并使用 XTick/YTickXTickLabel /YTickLabel 绘图的属性以获得正确的轴刻度标签。在你的情况下,这样的事情可能就足够了:

LSD = @(x) x-single(x(1));
plot(LSD(t), LSD(d), '.-');