如何使线停止延伸超出绘图边界? (Matlab)

时间:2020-07-21 19:59:35

标签: matlab

我正在为一个班级写一份报告,但不稳定图形的线条超出了图形的边界并与标题和xlabel重叠,因此存在一些问题。尽管指定的ylim为-2到2。是否有解决此问题的好方法?

谢谢!

Example of the issue

plot(X,u(:,v0),X,u(:,v1),X,u(:,v2),X,u(:,v3),X,u(:,v4))
titlestr = sprintf('Velocity vs. Distance of %s function using %s: C=%g, imax=%g, dx=%gm, dt=%gsec',ICFType,SDType,C,imax,dx,dt);
ttl=title(titlestr);
ylabl=ylabel("u (m/s)");
xlabl=xlabel("x (m)");
ylim([-2 2])
lgnd=legend('t=0','t=1','t=2','t=3','t=4');

ttl.FontSize=18;
ylabl.FontSize=18;
xlabl.FontSize=18;
lgnd.FontSize=18;

编辑:最小的可复制示例

mgc=randi([-900*10^10,900*10^10], [1000,2]);
mgc=mgc*1000000;
plot(mgc(:,1),mgc(:,2))
ylim([-1,1])

2 个答案:

答案 0 :(得分:2)

这很奇怪。真的看起来像个Bug ...部分

原因可能是线条的角度太窄,以至于在计算给定界限的点时,MATLAB会遇到舍入误差,因为给定非常大的数目时,界限很小。 (您看到不缩放矩阵mgc时就不会遇到此问题。

mgc = randi([-900*10^10,900*10^10], [1000,2]);
plot(mgc(:,1),mgc(:,2))
ylim([-1,1])

e13 但是如果进一步扩展,就会遇到这个问题...

mgc = randi([-900*10^10,900*10^10], [1000,2]);
plot(mgc(:,1)*1e6,mgc(:,2)*1e6)
ylim([-1,1])

e19

虽然这些数字远不及 double 可以代表的最大数字(在命令窗口中键入realmax可以看到这是一个有308个零的数字!);将绘图限制在一个轴上的[-1,1]上-请注意,您在x轴上获得了相同的现象-让MATLAB遇到精度问题。

首先,您会看到它绘制的线条比以前少得多(以我为例)...尽管,我只是说要在y轴上缩放。事实是,MATLAB不会重新计算该部分的行,而是将其实际放大(我想这可能会导致像素分辨率错误?)

好吧,让我们看一下数据(专业提示,您可以通过调用此代码段从MATLAB图形中获取一行的数据

datObj = findobj(gcf,'-property','YData','-property','XData');
X = datObj.XData;
Y = datObj.YData;
xlm = get(gca,'XLim'); % get the current x-limits

)我们看到它代表原始数据集,这并不奇怪,因为您也可以再次缩小。

请注意,只有当您有这样一条混乱的锯齿状线时,他才会出现。如果对它进行排序,就不会发生

快速修复

现在,如果我们计算出本节的确切分数,会发生什么?

m = diff(Y)./diff(X); % slope
n = Y(1:end-1)-m.*X(1:end-1); % offset
x = [(-1-n); (1-n)]./m;
y = ones(size(x))./[-1 1].';
% plot
plot([xMinus1;xPlus1],(ones(length(xMinus1),2).*[-1 1]).')
xlim(xlm); % limit to exact same scale as before

lines

不同的颜色表示它们现在是单独的行,而不是单个的混乱;)

答案 1 :(得分:0)

Max与发生此错误的原因有关,这似乎使Max几乎触手可及。根据Enrico的建议,我继续提交了错误报告。 MathWorks回应说,他们不确定这是“意外行为”,并将在不久后进行调查。他们也确实建议了一种临时解决方法(在我看来,这可能是永久性的)。

此解决方法是

set(gca,'ClippingStyle','rectangle');

直接在绘图线之后。

下面是最小可复制示例的修改版本。

mgc=randi([-900*10^10,900*10^10], [1000,2]);
mgc=mgc*1000000;
plot(mgc(:,1),mgc(:,2))
set(gca,'ClippingStyle','rectangle');
ylim([-1,1])