dragonwen 发表于 2008-3-25 21:49:29

在matlab中如何画这样的三维柱状图(柱状图叠加)[有代码]

本帖最后由 messenger 于 2010-11-7 21:13 编辑

如图,假设坐标以(x,y)表示,每个作标点对应两个不同的z值:
(1,1)对应两个z值:2,1
(1,2)对应两个z值:1,3
(1,3)对应两个z值:2,2
(2,1)对应两个z值:1,4
(2,2)对应两个z值:4,0
(2,3)对应两个z值:0,1
(只是假设,下图为在word里面画的示意图)
要将每个坐标对应的z值用柱状图叠加起来,如图所示
请问应该如何画?
谢谢!!

taohe 发表于 2008-3-25 22:13:09

好像没有现成的。在MathWorks的网站找到这个用户贡献的代码,评价好像不错。看看是不是能够实现你的要求。

_http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=11233&objectType=file

dragonwen 发表于 2008-3-26 14:12:57

谢谢taohe的回答我看了一下好像还是不一样啊
能不能这样:
我们用循环编程来解决这个问题,每个坐标点如果对应了n个值,那就用n次循环:
第一次循环,在每个坐标对应的地方画一个立柱,立柱的高度代表该坐标点对应的第一个z值;
第二次循环,依然在每个坐标对应的地方画一个立方柱,立柱的高度代表该坐标点对应的第二个z值,但是立方柱的起始位置是上一个循环中该坐标点处立方柱的高度值
第三次循环,同上,即下一个循环中每个坐标点的立方柱的起始位置是上次循环中该坐标处立方柱的最终高度
以此类推
希望高手看看这样可不可行...
我作图需要每个坐标点有三个对应的z值,表示该坐标点处的三种不同情况发生的次数
谢谢

Terrel123 发表于 2010-11-6 14:08:38

哎,我忘了咋画我的头像了。。。

Walker0728 发表于 2010-11-6 21:49:59

dragonwen 我认为你说的方法是可行的,不知道你写代码了没有,附上来看看

lin2009 发表于 2010-11-6 22:03:12


Z = magic(3);
bar3(Z)
hold on;
bar3(2*Z)
% 上下层调色比较难,
% 试了colormap和图形figure菜单/edit/Colormap...都没搞成
http://home.simwe.com/attachment/201011/6/418800_1289052137CgGf.jpg

feynmand 发表于 2010-11-7 20:52:59

本帖最后由 feynmand 于 2010-11-7 21:02 编辑

我汗啊,N久前的帖子被挖坟挖出来了。正好前两天写过一个类似的东西,适用于更一般化的情况。以上各楼提到的柱体都是正方形的而且截面积一致,位置相对固定,颜色不易分别控制。当时我考虑这个问题的时候偷了个懒,把bar3的函数打开,看了看人家怎么画的柱体。bar3采用surface函数画的,画之前需要对生成柱体顶点的坐标矩阵。(从程序可以看出,surface函数帮助文档写的很不好,根本没有介绍清楚surface函数所能够使用的坐标矩阵到底应该是什么结构)。bar3使用一套循环生成了坐标矩阵,这个循环我没看太明白,其实是没时间也懒地去搞明白。我就耍个流氓,把它生成的矩阵直接拿来用了,只要根据实际情况改改绝对值就可以了,结构是一样的。

画图的时候可以根据自己的需要改写以下程序的坐标,颜色。
clear
x=1:4:17;%每个立柱左下角的横坐标
x=;    %如果需要画双层的柱体可以这样使用
y=1:5;   %每个立柱左下角的纵坐标
y=;
z=rand(1,5)*4;   %底层每个立柱的高度
z=;   %上层立柱高度
w=rand(1,5)*2;   %每个立柱的宽度,如果截面不是正方形的需要稍微修改程序
w=;

%以下三个矩阵用来生成坐标
xx=[   NaN   0   4   NaN
   0   0   4   4
   0   0   4   4
   NaN   0   4   NaN
   NaN   0   4   NaN
   NaN   NaN   NaN   NaN];
yy=[ NaN   0   0   NaN
   0   0   0   0
   4   4   4   4
   NaN   4   4   NaN
   NaN   0   0   NaN
   NaN   NaN   NaN   NaN];
zz=[ NaN   0   0   NaN
   0   1   1   0
   0   1   1   0
   NaN   0   0   NaN
   NaN   0   0   NaN
   NaN   NaN   NaN   NaN];

nn=length(x)/2;

for n=1:nn
    XX=xx;
    YY=yy;
    ZZ=zz;
    XX(XX==4)=w(n);
    YY(YY==4)=w(n);
    ZZ(ZZ==1)=z(n+nn)+z(n);
    ZZ(ZZ==0)=z(n);
    X=XX+x(n);   %x轴
    Y=YY+y(n);   %y轴
    Z=ZZ;          %z轴
    cc = ones(size(yy,1),4).*rand*6;%颜色,这里是随机取的
    h=[];
    %下面循环用surface函数绘图
    for i=1:size(yy,2)/4
      h = [h,surface('xdata',X,...
                'ydata',Y(:,(i-1)*4+(1:4)), ...
                'zdata',Z(:,(i-1)*4+(1:4)),...
                'cdata',i*cc)];
    end
   
end

for n=1:nn
    XX=xx;
    YY=yy;
    ZZ=zz;
    XX(XX==4)=w(n);
    YY(YY==4)=w(n);
    ZZ(ZZ==1)=z(n);
    X=XX+x(n);   %x轴
    Y=YY+y(n);   %y轴
    Z=ZZ;          %z轴
    cc = ones(size(yy,1),4).*rand*6;%颜色,这里是随机取的
    h=[];
    %下面循环用surface函数绘图
    for i=1:size(yy,2)/4
      h = [h,surface('xdata',X,...
                'ydata',Y(:,(i-1)*4+(1:4)), ...
                'zdata',Z(:,(i-1)*4+(1:4)),...
                'cdata',i*cc)];
    end
   
end

view(30,60)    %控制视角
http://home.simwe.com/attachment/201011/7/304413_1289134613RLHH.jpg

messenger 发表于 2010-11-7 21:12:18

7# feynmand

嗯,那个循环我也看过,也没看懂..................

feynmand 发表于 2010-11-8 09:44:51

8# messenger

他那个循环就是生成我程序里面的矩阵,我觉得既然矩阵的形式是一致的,那么直接写出来速度更快,没有必要每次运行循环。程序的关键在于surface函数输入矩阵的使用方法,和是不是用了循环无关。

realyyy 发表于 2010-11-12 11:29:43

feynmand太强大了。。。
页: [1]
查看完整版本: 在matlab中如何画这样的三维柱状图(柱状图叠加)[有代码]