xiaoxin960904的个人博客分享 http://blog.sciencenet.cn/u/xiaoxin960904

博文

Matlab m_map一张地图上使用用多个colormap以及patch精细岸线数据去除河流

已有 1182 次阅读 2019-12-10 15:35 |个人分类:Matlab学习笔记|系统分类:科研笔记| Matlab, m_map, 绘制多个colormap, 陆地阴影去除河流

主修物理海洋学,有变量空间场的画图需求,这是遇到的一些细节问题,部分灵感来自于网络。

本人在画陆地数据加温盐场的图时,需要调用两个colormap,这有很多种解决办法;

普通的2014b以后的版本来讲,对于一个ax1 = axes(),ax2 = axes();

两个坐标轴上的绘图可以直接用colormap(ax1,'jet') colormap(ax2,'gray')来控制;

但是遇到和m_map工具包加上了m_grid之后坐标轴问题就会比较麻烦;

本人当成一个黑箱在用,并不想去读并改其源代码,所尝试的可行的有两种:

  1. 两幅图拼接成一个colorbar,实际上就是拼接成一个colormap,实现起来太麻烦了

  2. 第二种利用一个大佬John Iversen写的FreezeColors程序包,上传到了matlab官方,以下是一个例子

https://ww2.mathworks.cn/matlabcentral/fileexchange/7943-freezecolors-unfreezecolors?requestedDomain=zh


image.png

上面两幅图分别是只画了陆地高程和海表温度,图很丑只做例子凑合看。部分画图代码如下

figure,hold on

m_proj('Miller','lon',[lonlim1 lonlim2],'lat',[latlim1 latlim2])

m_contourf(x,y,z',[0:100:8000],'linestyle','none','levelstep',.1);% 陆地高程

m_grid('box','fancy','xtick',[0:5:180],'ytick',[0:5:90],'linestyle','none',...

    'linewidth',0.5,'backcolor','none');

colormap([m_colmap('gland',80)]);

caxis([0 8000])

colorbar

figure,hold on

m_proj('Miller','lon',[lonlim1 lonlim2],'lat',[latlim1 latlim2])

m_contourf(lon,lat,sst','linestyle','none','levelstep',.1);% 海表温度

m_grid('box','fancy','xtick',[0:5:180],'ytick',[0:5:90],'linestyle','none',...

    'linewidth',0.5,'backcolor','none');

colormap('jet');

caxis([28 31])

colorbar

把两个图凑到一起该咋办,利用FreezeColors加在哪个位置坐标轴怎么设置都不行,很绝望

查了之前画的一个图,此图是水深m_pcolor与散点m_scatter画的

image.png

突然想到会不会是不能用同一个画图命令m_contourf的原因


单独修正陆地高程或两个绘图为m_pcolor就可以了,单修正海表温度为pcolor就不行

怀疑是contourf的问题

figure,hold on

m_proj('Miller','lon',[lonlim1 lonlim2],'lat',[latlim1 latlim2])

pc = m_pcolor(x,y,z');% 陆地高程

set(pc,'linestyle','none');

m_grid('box','fancy','xtick',[0:5:180],'ytick',[0:5:90],'linestyle','none',...

    'linewidth',0.5,'backcolor','none');

colormap([m_colmap('gland',80)]);freezeColors

caxis([0 8000])

% m_contourf(lon,lat,sst','linestyle','none','levelstep',.1);

pc = m_pcolor(lon,lat,sst');% 海表温度

set(pc,'linestyle','none');

colormap('jet');

caxis([28 31])

colorbar

代码如上,图片如下,但是这幅图太丑了,决定不用陆地高程了

image.png

老老实实在加精细岸线的时候之前未解决的一个问题突然想去解决下,陆地上的河流湖泊看起来很丑

搞了半天,之前博文里提到了如何添加国界线,利用里面一行命令加岸线就能去掉了

代码和图:

image.png

figure,hold on

m_proj('Miller','lon',[lonlim1 lonlim2],'lat',[latlim1 latlim2])

% m_gshhs_l('patch',[0.7 0.7 0.7],'Edgecolor','none');% 只加这行会有河流对应左图

m_gshhs('lc1','patch',[0.7 0.7 0.7],'Edgecolor','k');% 只加这行没有河流对应右图

m_grid('box','fancy','xtick',[0:10:180],'ytick',[0:10:90],'linestyle','none',...

    'linewidth',0.5,'backcolor','none');

m_contourf(lon,lat,sst','linestyle','none','levelstep',.1);

colormap('jet');

caxis([28 31])

colorbar




http://blog.sciencenet.cn/blog-3386114-1209501.html

上一篇:Matlab 利用新建坐标轴绘制多列legend
下一篇:Dynamical Normalized Seasonality in Matlab

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2020-4-2 03:11

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部