爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 47404|回复: 54

[程序设计] imagesc函数及陆地填充

[复制链接]

新浪微博达人勋

发表于 2012-10-20 10:35:34 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 Aires 于 2012-10-20 11:29 编辑

感谢舍友XX松的提示,今天看了下imagesc这个函数,简单分享一下。具体查看help。
imagesc函数与pcolor函数差不多,都是可以直接填充颜色。而pcolor画出的图有网格线,需要shading interp or shading flat去掉。imagesc则不需要。
discription:
The imagesc function scales image data to the full range of the current colormap and displays the image.
syntax:
imagesc(C)
imagesc(x,y,C)
imagesc(...,clims)
imagesc('PropertyName',PropertyValue,...)
h = imagesc(...)

用法就是常规用法。它可以根据你的colormap,如jet的红色和蓝色对应变量场的最大和最小值。关键是imagesc运行速度很快,要比contour、contourf快上n多倍!如果是卫星数据比较大的话,分辨率较高,可以直接用imagesc,或者pcolor。
imagesc有些不同。

imagesc(x,y,C)
x和y通常可以设为矢量。但是如果x(1)>x(2),或者y(1)>y(2),会使图像左右或上下翻转,这点要注意。不同于我们平常设置的x,y,平常设置的x,y不会影响图像翻转的。除非你flipud或fliplr改变矩阵C。另外,imagesc函数把y轴默认设为从上到下最低到最高值,如从上到下是-90到90。可是我们不想这样做,因为纬度是下面-90,上面90.不能按照它默认的来做。所以我想可以这样,因为不管你y怎么设置,它都会这样标记,所以在一开始你可以把图弄成上下倒着的。然后用set(gca,'YDir','normal')可以同时倒转y轴坐标和图像上下翻转。
这应该是比较烦人的地方。转来转去的很乱。不过可以试一下的 。
如果x,y是一个数,即标量,表示图像从(x,y)这个左上角点开始画。

imagesc(...,clims)
clims可以设置为[     ],表示你的数据从哪到哪,即数据范围,同时它对应全部的colormap。可看doc imagesc的例子。

这让我昨天想起了个方法填充陆地。如果你下载高精度的海岸线,很可能它是不封闭的,那么就不能用patch。但是我们如果想填充它怎么办呢?我是这样想的。pcolor和imagesc差不多,都是把最大和最小值对应到colormap,那么如果你数据中有陆地等缺测,如-32767。这个值很小,是异常值。可以把colormap的颜色矩阵的第一个增加为[0 0 0],这里设置为黑色。那么再用你设置新的colormap的时候,图像应该会把-32767填充为黑色,其他正常值都比它高,应该会从蓝色到红色。这样就实现了海岸线不连接而填充了陆地。
画水色时我已用imagesc尝试了这个办法是有效的。把蓝色最下面的颜色矩阵增加为黑色。所有缺测值-32767都填充为黑色了。你也可以设置其他颜色填充缺测值,如灰色等。不过imagesc要注意上面所说的翻转,开始会感觉图形怎么也翻转不过来,原因就在于y轴的标度是默认的。翻转需要上面set的设置。

但是不知道为什么,用imagesc时我想改变gca的xticklabel和yticklabel时报错,不知道为什么,还请大家研究后留言告知我哈,我会在这个帖子中补充更多用法!
下面是用这个函数进行水色画图:

%全球叶绿素浓度分布图
clear all
load jet_and_black %增加最小值的颜色矩阵是灰色
chlor=hdfread('S19972441997273-L3m_MO_CHL_chlor_a_9km.hdf','l3m_data');
chlor(chlor==-32767)=NaN;
chlor=log10(chlor);
lon=linspace(-180,180,4320);
lat=linspace(90,-90,2160);

colormap(jet_and_black);
imagesc(lon,lat,chlor);
set(gca,'YDir','normal');
set(gca,'tickdir','out');
axis image
h=colorbar;
set(h,'ytick',[-2 -1 0 1 2]);
set(h,'yticklabel',[0.01 0.1 1 10 100]);
set(get(h,'ylabel'),'string','mg/m^3','fontsize',12)
xlabel('Longitude({\circ})','fontsize',12);ylabel('Latitude({\circ})','fontsize',12)
title('Global Concentration of Chlorophy|| a','fontsize',15)
print -dpng -r300 chlor.png

chlor.png
如果有好的方法,请在本帖中及时交流~@wlzhongouc


评分

参与人数 3金钱 +50 贡献 +7 收起 理由
qxtlyf + 20 + 2
mofangbao + 10 + 3
wlzhongouc + 20 + 2 赞一个!

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-10-20 12:30:53 | 显示全部楼层
没有用过imagesc,你这个通过colormap填充陆地的方法挺好玩的,呵呵,不过现在我都用m_map的地形,基本上就能满足要求,改变gca的xticklabel和yticklabel时报的错误贴上来看看
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-10-20 16:04:42 | 显示全部楼层
好东西,谢谢了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-10-21 08:49:41 | 显示全部楼层

我想在xticklabel上标注如180度(小圆圈)W应该怎么写?是用单元数组么?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-10-21 12:15:41 | 显示全部楼层
你参考一下吧
set(gca,'xtick',[1,9,17,25,33,41],'xticklabel',{'0°E','60°W','120°W','180°W','120°E','60°E'},'fontsize',16);
xtick是对应你要显示label的X轴位置,度(小圆圈)可以从word中复制一个到你的代码中就可以了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-10-21 12:58:46 | 显示全部楼层
wlzhongouc 发表于 2012-10-21 12:15
你参考一下吧
set(gca,'xtick',[1,9,17,25,33,41],'xticklabel',{'0°E','60°W','120°W','180°W','120 ...

一会我试一下
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-10-22 00:28:23 | 显示全部楼层

可以试试:'xticklabel',{'0^oE'的效果哦
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-10-22 09:15:19 | 显示全部楼层
{:soso_e179:}{:soso_e179:}
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-10-22 12:23:45 | 显示全部楼层
膘膘 发表于 2012-10-22 00:28
可以试试:'xticklabel',{'0^oE'的效果哦

你这个小圆圈是句号么?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-10-22 22:07:53 | 显示全部楼层
Aires 发表于 2012-10-22 12:23
你这个小圆圈是句号么?

小写o,好像是
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表