爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 8093|回复: 11

[程序设计] matlab区域填色问题

[复制链接]

新浪微博达人勋

发表于 2016-10-4 21:24:14 | 显示全部楼层 |阅读模式

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

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

x
V)9[DD]0_6%(~60%1X(W_]1.png


matalb如何实现上图,0以上折线以下是橙色,0以下折线以下上是蓝色?求各位赐教!谢谢!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-10-4 23:22:11 | 显示全部楼层
试一下
area(x(y>=0),y(y>=0),'facecolor','y');
hold on
area(x(y<=0),y(y<=0),'facecolor','b')
x就是你横坐标的数组,y是纵坐标的数组。
颜色你可以使用RGB三元组指定,这样更能符合你的要求。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 32430
发表于 2016-10-6 18:56:19 | 显示全部楼层
patch
密码修改失败请联系微信:mofangbao
回复

使用道具 举报

新浪微博达人勋

 楼主| 发表于 2016-10-6 20:11:34 | 显示全部楼层
本帖最后由 gwh 于 2016-10-6 20:12 编辑
Lighting 发表于 2016-10-4 23:22
试一下
area(x(y>=0),y(y>=0),'facecolor','y');
hold on

x=1:10;
y=[0.2 -0.32 -0.24 -0.2 0.3 0.24 0.5 0.45 0.36 -0.32];
area(x(y>=0),y(y>=0),'facecolor','y');
hold on
area(x(y<=0),y(y<=0),'facecolor','b')

这是我尝试运行的程序,但结果如图所示,问题出在哪里呢?
file:///C:/Users/acer/Desktop/untitled.jpg
untitled.jpg
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2016-10-6 20:19:00 | 显示全部楼层

二爷!我尝试用area实现,程序如下
x=1:10;
y=[0.2 -0.32 -0.24 -0.2 0.3 0.24 0.5 0.45 0.36 -0.32];
area(x(y>=0),y(y>=0),'facecolor','y');
hold on
area(x(y<=0),y(y<=0),'facecolor','b')

但运行的结果却是如图,如何实现将上下填图区域分段呢?
untitled.jpg
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 32430
发表于 2016-10-6 20:34:34 | 显示全部楼层
gwh 发表于 2016-10-6 20:19
二爷!我尝试用area实现,程序如下
x=1:10;
y=[0.2 -0.32 -0.24 -0.2 0.3 0.24 0.5 0.45 0.36 -0.32];
...

可惜我说的是patc
h
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-10-7 15:22:21 | 显示全部楼层
gwh 发表于 2016-10-6 20:11
x=1:10;
y=[0.2 -0.32 -0.24 -0.2 0.3 0.24 0.5 0.45 0.36 -0.32];
area(x(y>=0),y(y>=0),'facecolor', ...

我没有更好的办法了。如果用area的话,需要把正负的分割点给区分出来(我说不清这个点,不知道你明不明白)。二爷提供了patch函数,你试试吧。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-10-7 16:08:21 | 显示全部楼层
gwh 发表于 2016-10-6 20:11
x=1:10;
y=[0.2 -0.32 -0.24 -0.2 0.3 0.24 0.5 0.45 0.36 -0.32];
area(x(y>=0),y(y>=0),'facecolor', ...

还是忍不住试了一下area函数。。
  1. [xx yy] = polybool('subtraction',[1 1 10 10],[0.8 0 0 0.8], [x x(end) x(1)], [y 0.8 0.8]);
  2. [xc yc] = polybool('subtraction',[1 1 10 10],[-0.4 0 0 -0.4], [x x(end) x(1)], [y -0.4 -0.4]);
  3. area(xx,yy,'facecolor','y','linestyle','none')
  4. hold on
  5. area(xc,yc,'facecolor',[0.3 0.3 1],'linestyle','none')
复制代码
绘制后图形如下:

                               
登录/注册后可看大图

解释一下:
polybool中前两个向量,第一个向量[1 1 10 10]和第二个向量[-0.4 0 0 -0.4]构成了一个矩形。
1和10分别代表x轴的 xlim 属性对应值,-0.4 表示 y轴 下限,0.8表示y轴的上限,0 表示 area函数中的 basevalue,也就是区分颜色的分割线,因为这里只需要区分正负值,所以是0,具体可以看一下area函数。
需要这个矩形就是为了和另一个多边形进行取差,看下图>>>>

                               
登录/注册后可看大图

图中有一个蓝色矩形和一个粉色多边形,两者取差之后保留蓝色矩形的剩余蓝色区域,这就是图一中的负值区。
图一的正值区是同样的道理而来>>>>

                               
登录/注册后可看大图


关于polybool函数你help看一下即可,不麻烦。
你可以把linestyle属性设置为其它线条,你会发现多了一条线,这个应该可以通过添加NaN到xc,yc,xx,yy中来解决,但是我没试,这个只能你来了,但是把 linestyle设置为 none 基本上就满足你的要求了。
明白这个方法之后你就可以写一个函数了,以后专门用于这种图形的绘制,如果解决掉多了线条的问题就更完美了。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2016-10-18 21:01:08 | 显示全部楼层
找到了一个函数可以解决这个问题,并且阔以设置填色上下限。
untitled.png

shade_anomaly.m

4.21 KB, 下载次数: 27, 下载积分: 金钱 -5

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

新浪微博达人勋

发表于 2016-10-19 09:12:26 | 显示全部楼层
谢谢分享,都是牛人
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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