- 积分
- 2557
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 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函数叠加而成,暂时还没有找到统一修改句柄的方法,希望以后能够解决
|
评分
-
查看全部评分
|