文章目录

  • 1.问题提出
  • 2.MATLAB工程图形处理方式
  • 3.什么是colormap
  • 4.什么是CData
  • 5.Scaled方式
  • 6.pcolor函数不能胜任
  • 7.patch登场

1.问题提出

如图1所示MATLAB输出的二维颜色图,这个图使用pcolor(x,y,Er)指令产生,x,y是对应的坐标,x=0:0.5:50;y=0:05:50;Er(101*101矩阵)表示(x,y)点计算出来的误差值。现在如果想把Er中小于0.05的所有点设置显示为白色,该如何做?

图1 原始图

2.MATLAB工程图形处理方式

在解决这个问题之前,先来说一下MATLAB对彩色图形的处理方式。MATLAB中的图形常见的有以下几类:

  1. Truecolor:数码相机的格式,广泛用于计算机图形。
  2. Indexed 和 scaled indexed;经常用来显示科学或者工程数据,使用的不同的颜色深浅可以代表不同的数据大小。
  3. Grayscale:经常用在图像处理和图像分析算法中;
  4. Binary:经常用做为一个封装来表示图形的分割结果或者是感兴趣的区域。

那么图1这种图形就属于第2种,使用颜色比例代表不同的数据大小。在上述图形中,Er中不同的值,是如何对应到不同的颜色的呢?使用pcolor画图时,需要介绍两个关键的数据,一个是colormap,一个是Cdata。

3.什么是colormap

先来看colormap。当用figure产生一个图窗时,里面就包含了一个预先设置的颜色数据矩阵,这个颜色数据矩阵的尺寸一般是64*3,每一行为介于0.0到1.0之间的值组成的RGB颜色数据。可以用MAPX=colormap,获取当前figure的颜色数据矩阵,如图2所示。实际上MATLAB预先提供了一些预定义的颜色数据矩阵,这些颜色数据矩阵的名称和对应的色阶如图3所示。

图2,颜色数据矩阵

图3 MATLAB预定义的颜色矩阵名称与色阶

通常,MATLAB默认使用的颜色矩阵就是jet,大家看图1中的颜色条和jet色阶是不是一样的?都是从深蓝开始到深红结束。这些预定义的颜色矩阵都是64行(即64种颜色)。可以使用jet(n)指令,重新设置jet的行数,如jet(256),这样就把jet颜色扩充到256种颜色。需要注意的是,虽然扩展到了256种颜色,但是还是从深蓝开始到深红结束。只不过原来这两种颜色中间划分了64种颜色,而现在划分了256种颜色,划分的颜色更细腻而已。

我们可以把新的颜色矩阵应用到figure中,例如:

MAP=jet(256);
colormap(MAP);

这样,figure中使用的颜色矩阵就是被扩充到256色的jet颜色,而不是原来64色的jet颜色。

4.什么是CData

下面再来看CData数据。我们知道,图1中的颜色代表了Er的数值大小,即Er数值越大,颜色越红,Er数值越小,颜色越蓝。那么这种数据大小是如何对应到不同的颜色中的呢?实际上MATLAB是使用Er的值作为索引值,在colormap颜色矩阵中进行查表,从而知道该点对应的颜色。在MATLAB中,这种索引机制有两种,一种是直接索引direct,另一种是scaled,即按比例索引。到底用哪种索引方式,由当前图形句柄的’CDatamapping’属性决定。

h=pcolor(x,y,Er);
get(h,’ CDatamapping’);

输出为scaled,这表明当前使用的索引方式是按比例索引。

那么CData数据是什么呢?实际上当我们用h=pcolor(x,y,Er)画图时,真正使用的索引数据并不是Er,而是CData数据。CData是一个矩阵,大小和Er相同,在调用pcolor时,由Er按比例计算得到(即Er中数值大的对应的CData中的值就大,Er中数值小的对应的CData中的值就小)。一般而言,初始得到的CData的值和Er的值是相同的。可以使用Cdatat=get(h,‘CData’),获取当前的CData数据,如图4所示。

图4 CData数据

5.Scaled方式

索引方式使用scaled方式时,CData的最小值对应colormap中颜色矩阵的第1行的颜色,CData的最大值对应colormap中的最后1行颜色,CData的中间值,就按比例关系,计算出对应的colormap中的行数,即该点的颜色。例如,假设colormap中共有64行颜色,CData的最大值为cmax(对应第64行),最小值为cmin(对应第1行),若CData有一个数据,值为cind,该值在colormap对应的行数为ind。那么按照比例原则,可列出如下公式:(cmax-cind)/(cind-cmin)=(64-ind)/(ind-1)。如果令k=(cmax-cind)/(cind-cmin),那么可计算出ind=(64+k)/(k+1),因为是行数,计算出来的值取整数。

这样,根据CData中的数值大小,计算出在colormap中对应的行数,CData的值越小,对应的行号越小,CData的值越大,对应的行号越大。而CData是由Er按比例得到的,因此就实现了Er中不同的值,对应的颜色不同,即图1中的颜色图。

另外,scaled比例的最大值和最小值一般就是CData中的最大值和最小值,但这个值也可以由axes的Clim属性控制。可以用cm=caxis获取当前scaled比例的最大值和最小值。cm(1)是最小值,cm(2)是最大值。可以使用caxis([newmin,newmax])来设置比例的最小值和最大值。此时CData中所有比newmin小的值,都对应colormap的第一行颜色,CData中所有比newmax大的值,都对应colormap的最后一行颜色。

如果索引方式是direct,那么就用CData的真实值进行索引颜色,如Cdata的值是1.2,那对应的颜色就是colormap中的第1行,如CData的值是1000.4(超过了colormap的最大行数),那么就对应colormap中的最后一行。

事实上,在获取CData的数据之后,我们还可以对获取的CData数据进行调整,然后把调整之后的CData数据重新应用到图形中。使用如下指令使用新的CData数据:set(h,‘CData’,Cdatat)。Cdatat是新调整后的CData数据。

做一个梳理:
当使用h=pcolor(x,y,Er)画图时,完成了下列工作:
(1)根据Er,按比例计算CData矩阵;
(2)CData的最小值对应colormap中的第1行颜色,CData的最大值对应colormap中最后一行颜色,CData的中间值按照比例关系进行计算对应的颜色。
(3)索引出来每个点的颜色之后,使用该颜色对该点着色,得到图1。

那么回过头来,看当初的问题。对于图1所示的图,如何把Er中小于0.05的数值显示为白色呢?一种思路是这样:
(A)获取当前图形的colormap颜色数据;
(B)在颜色数据的最前面插入一行白色[1,1,1];
(C)获取当前CData值;
(D)把所有的Er<=0.05对应的CData值设为CData的最小值,这样这些点就对应到了colormap中的第一行颜色(白色)
(E)把修改后的CData数据应用到图形中。

6.pcolor函数不能胜任

但是这种方法会带来一些问题。如果Er中的数据大小分布比较均匀,用这种方法或许是可行的。但是如果Er中有突变数据,用这种方法就有可能带来一些问题。比如Er中有个别点的值非常大,Er中大于0.05的点(比如0.051),通过比例公式计算出来的行号有可能是1,而对应到了白色。显然按照要求,0.051对应的点不应显示白色,这样就造成了一些误差。有时甚至会带来严重的错误(比如0.051这种值很多,得到的结论就严重错误)。

这个问题的根源是由于Er数值对应的颜色是按照比例关系计算得到的,而colormap中的颜色数量不够大(一般小于256,再多的行数意义也不大),但Er的尺寸可能非常大(导致Er中的每一点的值和colormap中的颜色不是一一对应的),而且里面的数据有可能有突变。对于Er中稍微大于0.05的值,按照比例关系索引出来的颜色有可能是白色,从而造成误差,甚至严重错误。

7.patch登场

如何解决这个问题呢?要改用另一个函数画图,使用patch函数画图。
patch函数的一种用法是patch(X,Y,C);用来构建一个或者多个可填充的多边形,其使用X和Y作为每个点的坐标值,patch将会按顺序连接每个点。如果要得到一个多边形,将X和Y设置为向量;如果要得到多个多边形,将X和Y设置为矩阵,每一列对应一个多边形。C决定多边形的颜色,可以是系统认定的字符,也可以是一个数值,也可以是RGB向量。

对于图1中的问题,实际上是100100个小方块,我们给这100100个小方块着色,其中Er值小于0.05对应的小方块着色为白色,大于0.05的方块按照比例关系在colormap中索引相应的颜色来着色。

为了完成这个工作,需要做两件事:
(1)构造这100*100个小方块的顶点数据矩阵X和Y;
(2)设置每个小方块相应的颜色数据矩阵C。

先看第一个。根据patch帮助手册,X和Y的列数对应整幅图中多边形的个数,X和Y的行数,对应每个多边形的顶点数。图1中有10000个小方块,每个小方块有4个顶点,把每个小方块4个顶点的x坐标存放在X每一列中,所以X矩阵尺寸为4*10000;同样,每个小方块4个顶点的y坐标存放在Y每一列中,如果已知每个小方块左下角顶点的坐标为(x0,y0),那么按照逆时针方向,其余三个顶点坐标依次是(x0+dx,y0)、(x0+dx,y0+dy)、(x0,y0+dy),如图5所示。已知x坐标和y坐标的范围及步长,就能把X和Y构造出来。

图5 小方块四个顶点坐标

再看如何确定C。这里摘抄一段patch的帮助。

When X and Y are matrices, if C is a 1xn, where n is the number of columns in X and Y, then each face j=1:n is flat colored by the colormap index C(j). Note the special case of a 1x3 C is always assumed to be an RGB triplet ColorSpec and specifies the same flat color for each face. If C is a matrix the same size as X and Y, then it specifies the colors at the vertices as colormap indices and bilinear interpolation is used to color the faces. If C is 1xnx3, where n is the number of columns of X and Y, then each face j is flat colored by the RGB triplet C(1,j,:). If C is mxnx3, where X and Y are mxn, then each vertex (X(i,j),Y(i,j)) is colored by the RGB triplet C(i,j,:) and the face is colored using interpolation.

关注一下黄色底纹部分:如果C是1xnx3矩阵(这里n是X和Y的列数,也就是小方块数),那么第j个小方块的颜色就被C(1,j,:)对应的RGB颜色着色(以flat方式,整个小方块着单色,如果是以interpolation方式,那么这个小方块以插值方式着色,小方块内是渐变色。显然这里我们要用flat方式)。

我们可以定义一个C(1,n,3)矩阵,其中n是小方块数(10000),如果该方块对应的Er值小于0.05,那么就对C(1,j,:)直接赋值[1,1,1](白色),如果Er大于0.05,则按照前文所述的scaled方式,计算该点对应的colormap中的行数,把colormap中该行的颜色赋值给C(1,j,:)。这种方法就不会存在pcolor中的误差,是精确的显示结果。最终显示的结果如图6所示。

图6 图1中小于0.05的点着色白色

附带MATLAB程序如下:

clc;
clear;
load eremback.mat;%载入Er数据
err_level=0.05;%误差门限
xt=0:0.5:50;%生成x坐标
yt=0:0.5:50;%生成y坐标
n=length(xt);
X=zeros(4,(n-1)*(n-1));
Y=zeros(4,(n-1)*(n-1));
C=zeros(1,(n-1)*(n-1),3);
emax=max(max(Er));%Er的最大值
emin=min(min(Er));%Er的最小值
MAPX=jet((n-1)*(n-1));%对jet颜色矩阵扩展。这一步要不要关系不大
lenMAPX=length(MAPX);
for i=1:n-1for j=1:n-1X(1,100*(i-1)+j)=xt(i);X(2,100*(i-1)+j)=xt(i)+0.5;%构造X位置矩阵X(3,100*(i-1)+j)=xt(i)+0.5;X(4,100*(i-1)+j)=xt(i);Y(1,100*(i-1)+j)=yt(j);Y(2,100*(i-1)+j)=yt(j);%构造Y位置矩阵Y(3,100*(i-1)+j)=yt(j)+0.5;Y(4,100*(i-1)+j)=yt(j)+0.5;if Er(i,j)<=err_level;C(1,100*(i-1)+j,:)=[1,1,1];%如果该位置对应的Er值小于err_level,着白色else%Er大于0.05的值,从colormap中索引确定颜色kk=(emax-Er(i,j))/(Er(i,j)-emin);ind=round((lenMAPX+kk)/(kk+1));C(1,100*(i-1)+j,:)=MAPX(ind,:);%把colormap中的颜色赋值给C。endend
end
h=patch(X,Y,C);
set(h,'edgecolor','none');
xlabel('x/m');
ylabel('y/m');
title('Er');
colorbar;
caxis([emin,emax]);

MATLAB颜色图中,小于某个值的所有点设为白色相关推荐

  1. Matlab图形(Figure)中使用差值光标提取数据

    0. 原由 示波器中常用差值光标,用于捕捉曲线中的特征点,并计算出特征点之间的坐标差值. 差值光标在分析图形数据时很有用.可惜在Matlab的Figure工具栏中并没有提供,自带的数据提取功能似乎不如 ...

  2. matlab 获取edit,关于matlab的gui中获取edit值的问题

    本帖最后由 李昊波 于 2017-7-16 11:12 编辑 想请教一个问题,制作了一个有24个edit的gui程式,想获取edit中的数值然后用这些数值来做排列组合,但是运行结果显示为生成了一个空的 ...

  3. MATLAB去除矩阵中的NAN值

    //I1为待去除的矩阵 for i=1:m for j=1:n if isnan(I1(i,j)) I1(i,j)=0; end end end

  4. xyz坐标图_“色觉地图”的建立(二):辐照度与亮度、rgb空间、“颜色图”的混色方式...

    上篇""色觉地图"的建立(一):光感受器.色匹配实验与CIE RGB坐标系"中说到,人的色觉是线性的,我们可以用叠加原理"混色"--这意味着 ...

  5. MATLAB—colormap设置颜色图

    语法 colormap map colormap(map) colormap(target,map) cmap = colormap cmap = colormap(target) 说明 示例 col ...

  6. MATLAB函数解析:colormap——查看并设置当前颜色图

    MATLAB函数解析:colormap 语法 说明 示例 更改图窗的颜色图 将颜色图设置回默认值 对图窗中的每个坐标区使用不同的颜色图 指定颜色图的颜色数 创建自定义颜色图 返回用在绘图中的颜色图值 ...

  7. matlab 保存色图,如何在matlab中制作“色图”图?

    默认情况下,网格将基于(默认)喷射色彩映射(即,较热)来显示表面值.您还可以使用冲浪填充表面贴片,并将"EdgeColor"属性设置为"无"(因此补丁边缘不可见 ...

  8. Matlab 散点图(Scatter)和颜色图(Colormap)

    目录 一.什么是散点图? 二.什么数据需要用散点图来呈现? 三.matlab 中的颜色如何表示和调用? 四.颜色和透明度在散点图中的灵活应用 二维散点图 三维散点图 数据分组! 五.Scatter 的 ...

  9. Matlab渐变颜色图(colormap)生成/编辑器—ColorMap

    渐变配色在科研绘图时十分常用. 比如三维柱状图: 特征渲染散点图: 热图: 等等,都需要使用渐变配色. 作为一个Matlab用户,你大概听说过jet.parula.hsv.hot这些耳熟能详的颜色图( ...

最新文章

  1. linux可以远程装机吗,linux 远程装机
  2. 建立jackrabbit内容仓库实例
  3. IAR调试按钮功能说明及调试主要看哪些内容
  4. 2-09 CentOS系统参数优化
  5. 成功解决from nets import inception_resnet_v2 ModuleNotFoundError: No module named 'nets'
  6. sublime-编辑器的使用-基本
  7. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之按键驱动框架
  8. c语言编程科学计数法,c语言编程 科学计数法
  9. HTML+CSS静态页面网页设计作业:我的家乡网站设计——我的家乡-莆仙(6页)
  10. 解决AndroidStudio报错问题:Missing essential plugin
  11. 失业的程序员(十二):潜意识的智商
  12. windows下快速安装nginx并配置开机自启动的方法
  13. 解决Field xxService in x.controller.x required a bean of type ‘x.service.x‘ that could no be found的方法
  14. 学习C语言需要学oracle,什么是C语言? 为什么要学习C语言?
  15. 2019年第一届长安杯解析,深入科普,理清思路,流量部分不太会,其他部分基本有详细解。
  16. d作者:d中导入C编程
  17. python通过关键字搜索淘宝商品详细信息
  18. 纯css实现蓝色圆角效果水平导航菜单代码
  19. DMCTF部分题目writeup
  20. Excel数据表格操作01~~使用JXL操作数据

热门文章

  1. HR 开发技术(abap 转载)
  2. java生成表格图片(请假条为例)
  3. 晕菜了,TFS居然把vss里的那个rollback功能cut掉了,还好有人写了工具.
  4. 考研英语(七)——状语和状语从句
  5. Java 能创建多少线程
  6. 拍照已经成为我们手机中必备的功能之一,但是我们很多人都无法使用手机原相机拍出好看的图片,这是为什么呢?
  7. 前端如何处理十万级别的大量数据
  8. matlab创建纯色图片
  9. ESP Wi-Fi 连接异常断开原因排查分析
  10. python常用PEP收集