我正在为一个班级写一份报告,但不稳定图形的线条超出了图形的边界并与标题和xlabel重叠,因此存在一些问题。尽管指定的ylim为-2到2。是否有解决此问题的好方法?
谢谢!
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])
答案 0 :(得分:2)
这很奇怪。真的看起来像个Bug ...部分
原因可能是线条的角度太窄,以至于在计算给定界限的点时,MATLAB会遇到舍入误差,因为给定非常大的数目时,界限很小。 (您看到不缩放矩阵mgc
时就不会遇到此问题。
mgc = randi([-900*10^10,900*10^10], [1000,2]);
plot(mgc(:,1),mgc(:,2))
ylim([-1,1])
mgc = randi([-900*10^10,900*10^10], [1000,2]);
plot(mgc(:,1)*1e6,mgc(:,2)*1e6)
ylim([-1,1])
虽然这些数字远不及 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
不同的颜色表示它们现在是单独的行,而不是单个的混乱;)
答案 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])