matlab中pcolor命令为何只能显示(m-1)*(n-1)个格子?

标签:
matlabpcolorit |
转自:http://www.stdlogic.net/blog/?p=365
最近受启发想根据一组数据做个热区图,查了半天在MATLAB里叫做伪彩色图或者棋盘图(pseudocolor plot or checkerboard plot),画图函数是pcolor。欣喜的以为画图成功后发现少了一行一列,故详细研究了一下做个笔记。
生成一个矩阵C来试验几个例子。
C=zeros(5)
for i=1:5
for j=1:5
C(i,j)=5*i+j;
end
end
C =
1
6
11
16
21
先看下直接用pcolor函数画图的结果。
pcolor(C),colorbar;
http://www.stdlogic.net/blog/wp-content/uploads/2013/01/pcolor1.png
pcolor函数根据矩阵C各行各列元素的值决定单元格的颜色。矩阵C的第1行(最上面一行)对应棋盘图的最下面一行(y=1)。
但是可以看到矩阵是5×5,棋盘图是4×4,少了一行一列。
查看文档,里面写的很清楚:
“The default shading is faceted, which colors each cell with a single color. The last row and column of C are not used in this case.”
默认的shading模式为faceted,矩阵C的最后一行一列未被用到。
“With shading interp, each cell is colored by bilinear interpolation of the colors at its four vertices, using all elements of C.”
如果改变shading模式为interp,可以使用到C中的所有元素,但不再是一格一个颜色,C的值将被赋予每个网格节点,每个格子中的颜色为格子四个顶点的插值。
hold on;shading interp;
http://www.stdlogic.net/blog/wp-content/uploads/2013/01/pcolor2.png
解决棋盘图少一行一列问题的办法就是给矩阵C的最后增加一行一列。
C=zeros(6);
for i=1:5
for j=1:5
C(i,j)=5*(i-1)+j;
end
end
C =
1
6
11
16
21
0
pcolor(C),colorbar;
http://www.stdlogic.net/blog/wp-content/uploads/2013/01/pcolor3.png
这时如果改变shading,可以看到边缘颜色值掉下去。
hold on;shading interp;
http://www.stdlogic.net/blog/wp-content/uploads/2013/01/pcolor4.png
以上调用pcolor函数只给了一个参数矩阵C,还可以同时给X、Y两个坐标矩阵,其中X、Y定义的是网格的节点坐标,即每个格四个顶点的坐标(黑线位置)。X、Y、C三个矩阵的维度应该一致。
[X,Y]=meshgrid(6:-1:1,1:1:6)
X =
6
6
6
6
6
6
Y =
1
2
3
4
5
6
pcolor(X,Y,C),colorbar;
http://www.stdlogic.net/blog/wp-content/uploads/2013/01/pcolor5.png
对比一下,可以看出色块位置的变化。
subplot(1,2,1);
pcolor(C);
title(‘pcolor(C)’);
subplot(1,2,2);
pcolor(X,Y,C);
title(‘pcolor(X,Y,C)’);
http://www.stdlogic.net/blog/wp-content/uploads/2013/01/pcolor6.png
还有一点点问题就是,棋盘图绘制的是离散格子的数据,坐标最好只以整数显示在每格的中间。为此可以做如下调整:
[X,Y]=meshgrid(0.5:1:5.5,0.5:1:5.5);
X =
0.5000
0.5000
0.5000
0.5000
0.5000
0.5000
Y =
0.5000
1.5000
2.5000
3.5000
4.5000
5.5000
pcolor(X,Y,C);colorbar;
set(gca,’XTick’,[1:1:5]);
set(gca,’YTick’,[1:1:5]);
http://www.stdlogic.net/blog/wp-content/uploads/2013/01/pcolor7.png
格子不多的话其实更简单点直接把坐标轴隐藏好了~
axis off;
http://www.stdlogic.net/blog/wp-content/uploads/2013/01/pcolor8.png
–END–
关于如何修改pcolor图中colorbar的范围:见链接:http://blog.sina.com.cn/s/blog_700aa8830101g75b.html