• 灰度图Matlab


    [转载]matlab中pcolor绘图“少画一行”的问题

    本文是关于matlab pcolor函数(slice,surf函数的情况与这个类似)绘图的问题的一些解决方案,在此记录备用

    经 常处理三维(或者四维)数据体的同学们大概大多数都用过matlab里面的pcolor(slice)之类的函数,可能有人注意到过本文中的这类情况,即 本来要是画一个N×N的数据体,结果却画出来一个(N-1)*(N-1)的东西,我是一直都没有注意到这个情况,直到近日有人问我这个问题……示例代码如 下:
    %一个简单的matlab 脚本,用pcolor画色块图,本意是得到一个20*20的色块图:
    x=0:19;
    y=0:19;%注意这里有20个点
    [xx,yy]=meshgrid(x,y);
    data=sqrt(xx.^2+yy.^2);
    figure;
    hold on;
    h=pcolor(xx,yy,data);
    plot(x,y,'r+');
    colorbar;
    axis tight;
    hold off;
    pcolor1 
    注意实际上只得到了19*19的色块(无聊的人可以数一下……),这又是为什么呢?输入的xx,yy和数据明明都是20*20的……

    咳……实际上pcolor的默认的输入参数xx,yy在绘图的时候是直接输出给句柄中的xdata和ydata参数的,
    有兴趣的人可以尝试输入命令(在上面那串之后):
    get(h,’xdata’)
    get(h,’ydata’)
    会发现和xx,yy的值是完全一样的,而xdata和ydata的用途并非是确定色块的位置坐标,而是确定网格(实际上是那些黑色的网格线的节点)的位置坐标!这样一来,就不难明白为什么20*20的坐标只会生成19*19个网格了。(什么,不明白?想一想为什么一条线段(网格)有两个节点……笑)
    而给定的色块的颜色变量存储在句柄的cdata参数中,尝试:
    get(h,’cdata’)
    可以发现它和data变量的值也是完全相同的,有20*20个,这样一来问题就出现了,有20*20个颜色变量,却只有19*19个位置可以显示,所以matlab只能舍去最后的一行和一列不显示了……

    那么解决办法是?
    既然给出20×20个坐标只能显示19×19,那么想显示出20×20个色块就只有给出21×21个坐标了(没有技术含量的做法……),如:

    X=0:20;
    Y=0:20;%注意这里有21个点
    [XX,YY]=meshgrid(X,Y);
    data2=data;%复制之前的数据
    data2(21,:)=data2(20,:);%复制最后一行的值到21行上
    data2(:,21)=data2(:,20);%复制最后一列的值到21列上
    figure;
    hold on;
    pcolor(XX,YY,data2);
    plot(X,Y,'r+');
    colorbar;
    axis tight;
    hold off;
    pcolor2 
    这样就可以全部显示了……需要注意的是,由于最后一行和最后一列(这里是21)的颜色实际上是不能显示的,所以设成什么值其实都没关系……
    然而对于完美主义者们来说这还不够……注意到图中的红色“+”了吗,那是x,y的坐标位置,也就是网格的中心“应该在”的位置,由于前面所说的xdata,ydata的性质,每个网格的位置实际上是向右和向上恰好各偏了半个网格,不太符合一般的看图习惯。

    解决的方法同样没有技术含量:改坐标……
    X=-0.5:19.5;
    Y=-0.5:19.5;%X,Y各偏半个网格……这样网格的中心恰好在0:19上。
    [XX,YY]=meshgrid(X,Y);
    data2=data;
    data2(21,:)=data2(20,:);
    data2(:,21)=data2(:,20);
    figure;
    hold on;
    pcolor(XX,YY,data2);
    plot(x,y,'k+');
    colorbar;
    axis tight;
    hold off;

    pcolor3

    这样就好了……slice和surf函数也有类似的问题,解决方法也类似,这里不再赘述。

    本文节选自:http://hi.baidu.com/tdmxb/item/a43d5642c6e309ae61d7b93a
    引用地址:http://hi.baidu.com/tdmxb/item/a43d5642c6e309ae61d7b93a

  • 相关阅读:
    基于Python自动生成小学四则运算题目的命令行程序(软工第二次作业)
    第一次个人编程作业
    自我介绍+软工五问
    如何清理 Docker 占用的磁盘空间
    复审与事后分析
    团队作业5——测试与发布(Alpha版本)
    项目冲刺总结集合贴
    团队作业3:需求改进&系统设计
    团队作业2——需求规格说明书
    团队作业1——团队展示&选题
  • 原文地址:https://www.cnblogs.com/xiaoxuesheng993/p/8552196.html
Copyright © 2020-2023  润新知