Matlab中semilogy绘图时lsline线性拟合失效问题求助
解决半对数坐标系下
lsline拟合失效的问题 我来帮你搞定这个问题~你遇到的核心问题是**lsline只对原始数据做线性拟合**,但你用的是半对数坐标系(y轴取对数显示),这时候你需要的其实是log(N)和X之间的线性关系,而不是原始N和X的线性关系。
为什么原来的方法不行?
当你用semilogy或者设置yscale='log'时,图表只是把y轴的显示改成了对数刻度,但lsline依然会计算原始数据N = a*X + b的线性拟合,这条直线在对数轴上会变成曲线,看起来就像是“拟合失效”了——但其实lsline只是做了它原本该做的事,只是不符合你的需求而已。
正确的解决方案
我们需要手动对N做对数转换,拟合log(N)与X的线性关系,再还原成原始刻度绘制拟合线。这里分两种写法给你参考:
方法1:配合semilogy使用
X = [0.5762 0.6191 0.6594 0.6997 0.7359 0.7753]; N = [10 * 0.000001; 40 * 0.000001; 160 * 0.000001; 640 * 0.000001; 2560 * 0.000001; 10240 * 0.000001]; figure(1); semilogy(X,N,'r*'); hold on; % 对N取自然对数,拟合log(N)和X的线性关系 p = polyfit(X, log(N), 1); % 还原拟合值(自然对数用exp,常用对数用10.^) N_fit = exp(p(1)*X + p(2)); % 绘制拟合线 semilogy(X, N_fit, 'b-', 'LineWidth',1.5); hold off;
方法2:配合scatter+log轴使用
X = [0.5762 0.6191 0.6594 0.6997 0.7359 0.7753]; N = [10 * 0.000001; 40 * 0.000001; 160 * 0.000001; 640 * 0.000001; 2560 * 0.000001; 10240 * 0.000001]; scatter(X,N,25,'b','*'); set(gca,'yscale','log'); hold on; % 用常用对数拟合(对应y轴的log10刻度) p = polyfit(X, log10(N), 1); N_fit = 10.^(p(1)*X + p(2)); plot(X, N_fit, 'r-', 'LineWidth',1.5); hold off;
这样绘制出来的拟合线就是半对数图上的直线,完全符合你的需求啦~
内容的提问来源于stack exchange,提问作者roffensive
相关产品推荐
相关产品推荐

