- 积分
 - 2575
 
	- 贡献
 -  
 
	- 精华
 
	- 在线时间
 -  小时
 
	- 注册时间
 - 2018-9-7
 
	- 最后登录
 - 1970-1-1
 
 
 
 
 
 
 | 
	
 
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册 
 
 
 
x
 
 本帖最后由 huihuang 于 2022-9-28 16:01 编辑  
 
不等间隔的colorbar在气象中有许多实际的用途,比如降水图和p值检验。最近在研究怎么在MATLAB上绘制这样一种图像 
 
以前本科时试过这样一种做法,以降水为例:
 - tick = [0,0.1,10,25,50,100,200];
 
  复制代码 将降水数据进行分段变换,使其间隔变为: 比如所有真实场位于[0 0.1]区间上的数据,执行变换:y = 10*x 
所有真实场位于[100 200]区间上的数据,执行变换:y = x/100 + 4 
那么原来范围为[0 200]的真实数据将变换为范围为[0 6]的虚假数据,将这一虚假数据绘制出来,并将colorbar对应的tick稍微修改,则能形成一张不等间隔的图。 
 
但这一做法比较麻烦,而且需要修改原始数据,在数据较少的情况下,还会有等值线出现锯齿的问题 
 
最近研究出一种新方法,下面的演示例子为MATLAB自带的矩阵peaks,其大小为49x49,数据范围为[-6.55 8.08],下面为其空间结构- load Color.mat
 
 - [x,y] = meshgrid(1:49,1:49);
 
  
- figure;
 
 - contourf(x,y,peaks,'LevelList',-10:10,'LineColor','w','LineWidth',1)
 
 - caxis([-6 8])
 
 - colormap(Color)
 
  复制代码 
 
  ----------------------------------------------------------------------------------------------------- 
----------------------------------------------------------------------------------------------------- 
----------------------------------------------------------------------------------------------------- 
下面我们来看一下使用contourf只画一条等值线的情况
 - figure;
 
 - contourf(x,y,peaks,'LevelList',[-4 -4],'FaceColor','b')
 
  复制代码 
 
 
可以发现,在比-4小的区域,不填色,而在比-4大的区域,填上指定的颜色(蓝色)。那么,如果我们重复上述步骤,将其他区域用同样的办法填上颜色:
 - hold on
 
 - contourf(x,y,peaks,'LevelList',[1 1]*-3,'FaceColor','g')
 
 - contourf(x,y,peaks,'LevelList',[1 1]*0,'FaceColor','c')
 
  复制代码 
 
 - contourf(x,y,peaks,'LevelList',[1 1]*1,'FaceColor','k')
 
 - contourf(x,y,peaks,'LevelList',[1 1]*2,'FaceColor','m')
 
 - contourf(x,y,peaks,'LevelList',[1 1]*4,'FaceColor','y')
 
 - contourf(x,y,peaks,'LevelList',[1 1]*7,'FaceColor','r')
 
  复制代码 
 
 
这样,将上述步骤整理封装为一个函数(contourf_ueq.m),我们就能很方便地绘制不等间隔的填色图。下面我们看一下实际效果:- tick = [-6:2:0 1:3 5 7];
 
 - Color = Color([1 3 5 7:9 11 13],:);
 
  
- figure;
 
 - contourf_ueq(x,y,peaks,tick,Color,'LineColor','w','LineWidth',1);
 
 - cb = colorbar;
 
  复制代码 
 
 
可以看见,图像和colorbar并没有对应,我们可以手动修改一下:
 - colormap(Color);caxis([1 length(tick)])
 
 - set(cb,'Ticks',1:length(tick),'TickLabels',tick)
 
  复制代码 
 
 
或者直接调用我的上一篇文章中的函数colorbarn(点我跳转)
 - tick = [-6:2:0 1:3 5 7];
 
 - Color = Color([1 3 5 7:9 11 13],:);
 
  
- figure;
 
 - contourf_ueq(x,y,peaks,tick,Color,'LineColor','w','LineWidth',1);
 
 - tick2 = setdiff(-10:10,tick);
 
 - hold on
 
 - contour(x,y,peaks,'LevelList',tick2,'LineWidth',1,'LineColor','k')
 
 - cb = colorbarn(tick,Color);
 
 
  复制代码 
 
 
但是这种方法也存在一个缺点:由于是多个contourf函数叠加而成,暂时还没有找到统一修改句柄的方法,希望以后能够解决 
 
 
 
 
 
 
 
 
 
 
 
 |   
 
评分
- 
查看全部评分
 
 
 
 
 
 |