摘要
绘图是一种很好的表达方式,科研学习中尤其重要。分享一段绘图的代码,希望对看到这篇文章的人提供点帮助。尤其是各位男同学,给我的文章投币点赞收藏,说不定就能用来帮到你的学妹们。
1 引言
在科研写作的时候难免会需要绘制数学模型的散点图,然而对于MATLAB而言,仅仅依靠一句plot绘制出来的图美观上有所欠缺。因此我在自己科研过程中自己编写了一个函数用于绘制散点图,其中包括训练集、验证集的实测值、预测值散点;拟合回归线;1:1线;置信区间。
2 数据与方法
数据总共两组,第一组为训练集的实测值以及训练模型后内部验证的预测值(YC表示),第二组为验证集的实测值以及运用模型计算得到的预测值(YP表示)。PS:YC、YP均为列数为2的矩阵,第一列为实测值结果,第二列为预测值结果。
在MATLAB中建立function文件,输入以下代码:
function []=F_plotdraw_V1(YC,YP,Result)
%画散点图函数
y1_hat=YC(:,2);%预测值
y1=YC(:,1);%实测值
%预测样本
y2_hat=YP(:,2);
y2=YP(:,1);
%% 对散点做回归线
A=ones(length(y1),1);
b=regress(y1_hat,[A,y1]);
%% 预测区间绘制
T=[y1 y1_hat;y2 y2_hat;];%取值的最大值和最小值,主要是方便确定绘图范围
l=max(max(T))-min(min(T));%取值范围
x=(min(min(T))-0.3*l:0.05*l:max(max(T))+0.3*l);%横轴范围
y=b(1)+b(2)*x;
n=length(y1);%样本数
mean_y1=mean(y1);%相当于回归方程中的X
mean_y1_hat=mean(y1_hat);%相当于回归方程中的Y
lxx=sum((y1-mean_y1).^2);
% lxx=sum(y1.^2)-1/n*(sum(y1).^2);
lxy=sum((y1-mean_y1).*(y1_hat-mean_y1_hat));
% lxy=sum(y1.*y1_hat)-1/n*(sum(y1))*(sum(y1_hat));
lyy=sum((y1_hat-mean_y1_hat).^2);
% lyy=sum(y1_hat.^2)-1/n*(sum(y1_hat).^2)
sig_=1/(n-2)*(lyy-lxy/lxx*lxy);%sigma2的无偏估计
detax=tinv(0.025,n-2)*sqrt(1+1/n+(x-mean_y1).^2/lxx)*sqrt(sig_);%公式中的x_为样本变量均值,对应此处的y1_
y_up=b(1)+b(2)*x+detax;%上置信区间
y_floor=b(1)+b(2)*x-detax;%下置信区间
%% 画图部分
figure;plot(y1,y1_hat,'s','MarkerFacecolor',[0.18 0.54 0.34],'Markersize',8);hold on;
plot(y2,y2_hat,'s','MarkerFacecolor',[0.54 0.18 0.34],'Markersize',8);hold on;
plot(x,y,'-','Color',[1 0 0],'LineWidth',2);hold on;%散点图回归线
plot(x,x,'--','Color',[0.5 0.5 0.5],'LineWidth',1.25);hold on;%1:1线
patch([x';flipud(x')],[y_up';flipud(y_floor')],'r','FaceA',.1,'EdgeA',0);
xlabel('Observed values(mg/kg)');ylabel('Predicted values(mg/kg)')
% legend('Calibration set','Validation set','Regression line','1:1 line','Confidence interval(α=0.05)');
set(gca,'Xlim',[min(x),max(x)]);
set(gca,'Ylim',[min(x),max(x)]);
set(gca,'FontSize',17,'Fontname', 'Times New Roman');
if nargin>=3
hold on;
h=text(min(x)+0.05*l,max(x)-0.1*l,['RMSEP=',num2str(Result(1))]);
set(h,'FontSize',14,'Fontname', 'Times New Roman');
hold on;
h=text(min(x)+0.05*l,max(x)-0.25*l,['R^2_p=',num2str(Result(2))]);
set(h,'FontSize',14,'Fontname', 'Times New Roman');
hold on;
h=text(min(x)+0.05*l,max(x)-0.40*l,['RPD=',num2str(Result(3))]);
set(h,'FontSize',14,'Fontname', 'Times New Roman');
end
end
然后即可在命令窗口中调用此函数。当然同学们也可以对代码做点简单的修改。
3 结果
散点图绘制效果
4 结论
我把你画成花,未开的一朵花,再把思念一点一滴画成雨落下……