基于Matlab的密度散点图绘制-从数据分析到完整出图

时间:2024-04-15 08:10:06
在计算两幅图像像元水平上的相关性时,由于图像的分辨率高,导致直接画散点图根本就体现不出来大致的趋势,因此需要用密度散点图来进行刻画。散点密度图的核心是在x和y的范围内找到在这个范围内的点的数量,需要合理选择x和y的区间。
首先本文这里以两幅ET的数据作为样例,分辨率为1000m,值的区间再8到1100,两者的最大差距不超过800,选择以5作为两幅图像的间隔,提取如下代码


作者:画长空_yin
链接:https://www.jianshu.com/p/ca4b4616b815
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
%  author yinlichang3064@163.com
filemean=\'I:\蒸散发\各ET的均值和趋势\yr_SSEB_2003-2013年ET的均值.tif\';
sseb=importdata(filemean);
filemean=\'I:\蒸散发\各ET的均值和趋势\yr_SSEBopYRB_2003-2013年ET的均值.tif\';
ssebop=importdata(filemean);
sy1=find(sseb>0 & ssebop>0); %找到两者的有效值
sseb_1=double(sseb(sy1));
ssebop_1=double(ssebop(sy1));
valuesum=zeros(47961,3); %以47961是因为8:5:1100的长度为219,219的平方为47961
k=1;
for i=8:5:1100 %sseb
    sy=find(sseb_1>=i & sseb_1<i+5);
    j1=i+800;
    j2=i-800;
    if j1>1100
        j1=1100;
    end
    if j2<8
        j2=8;
    end
    for j=j2:5:j1 %ssebop
       sy2= find(ssebop_1>=j & ssebop_1<j+5);
       sy3=intersect(sy,sy2);
       cd=length(sy3);
       if length(cd)>0
           value=[i,j,cd];
           valuesum(k,:)=value;
       end
       k=k+1;
    end
end

通过上述代码就可以得到valuesum变量,该变量中第一列存储的是sseb的值,第二列是ssebop的值,第三列是两幅图像处于这个区间的值的数量。通过scatter函数即可以画出散点密度图,但较为粗糙,需要对图像进行修饰,采用如下代码


作者:画长空_yin
链接:https://www.jianshu.com/p/ca4b4616b815
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
% author yinlichang3064@163.com
set(gcf,\'Units\',\'centimeters\',\'Position\',[6 6 14 13]); %设置图像位置和大小
valuesum_sseb=valuesum(valuesum(:,3)>0,:);
scatter(valuesum_sseb(:,1),valuesum_sseb(:,2),[],valuesum_sseb(:,3),\'.\')
set(gca,\'Xlim\',[0,1100],\'Ylim\',[0,1100],\'XTick\',[0:300:1100],\'YTick\',[0:300:1100])
ylabel(\'ET_S_S_E_B_o_p_Y_R_B\',\'Fontname\', \'Times New Roman\',\'FontSize\',12); %下标
hold on
h1=refline(1,0) %辅助1:1线
h2=refline(0.3428,284.4) %拟合线获取
set(h1,\'color\',\'black\',\'linewidth\',1.5)
set(h2,\'color\',\'red\',\'linewidth\',1.5)
text(100,1000,\'R^2=0.51\')
text(100,900,\'N=798125\')
text(800,100,\'ET_S_S_E_B_o_p_G_l_o\')

 

 想输出高分辨图像,采用文件-导出设置,在该对话框中采用渲染工具,并设置分辨率为600,然后导出为jpg格式即可,单个图像的话可以增加colorbar,具体设置如下,直接在最后一行加上这句

colorbar([0.91 0.11 0.03 0.81]) 

颜色表征了数量的多少,红色表示拟合线,黑色表示1:1的线下图是用另外数据同样流程制作的。