找回密码
 注册
Simdroid-非首页
查看: 354|回复: 9

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

[复制链接]
发表于 2008-3-25 21:49:29 | 显示全部楼层 |阅读模式 来自 江苏苏州
本帖最后由 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值用柱状图叠加起来,如图所示
请问应该如何画?
谢谢!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2008-3-25 22:13:09 | 显示全部楼层 来自 新加坡
Simdroid开发平台
好像没有现成的。在MathWorks的网站找到这个用户贡献的代码,评价好像不错。看看是不是能够实现你的要求。

_http://www.mathworks.com/matlabc ... amp;objectType=file

评分

1

查看全部评分

回复 不支持

使用道具 举报

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

使用道具 举报

发表于 2010-11-6 14:08:38 | 显示全部楼层 来自 美国
哎,我忘了咋画我的头像了。。。
回复 不支持

使用道具 举报

发表于 2010-11-6 21:49:59 | 显示全部楼层 来自 河北秦皇岛
dragonwen 我认为你说的方法是可行的,不知道你写代码了没有,附上来看看
回复 不支持

使用道具 举报

发表于 2010-11-6 22:03:12 | 显示全部楼层 来自 湖南湘潭

  1. Z = magic(3);
  2. bar3(Z)
  3. hold on;
  4. bar3(2*Z)
  5. % 上下层调色比较难,
  6. % 试了colormap和图形figure菜单/edit/Colormap...都没搞成
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-11-7 20:52:59 | 显示全部楼层 来自 河北廊坊
本帖最后由 feynmand 于 2010-11-7 21:02 编辑

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

画图的时候可以根据自己的需要改写以下程序的坐标,颜色。

  1. clear
  2. x=1:4:17;  %  每个立柱左下角的横坐标
  3. x=[x,x];    %  如果需要画双层的柱体可以这样使用
  4. y=1:5;     %  每个立柱左下角的纵坐标
  5. y=[y y];
  6. z=rand(1,5)*4;     %  底层每个立柱的高度
  7. z=[z rand(1,5)*4];   %  上层立柱高度
  8. w=rand(1,5)*2;     %  每个立柱的宽度,如果截面不是正方形的需要稍微修改程序
  9. w=[w w];

  10. %  以下三个矩阵用来生成坐标
  11. xx=[   NaN     0     4   NaN
  12.      0     0     4     4
  13.      0     0     4     4
  14.    NaN     0     4   NaN
  15.    NaN     0     4   NaN
  16.    NaN   NaN   NaN   NaN];
  17. yy=[ NaN     0     0   NaN
  18.      0     0     0     0
  19.      4     4     4     4
  20.    NaN     4     4   NaN
  21.    NaN     0     0   NaN
  22.    NaN   NaN   NaN   NaN];
  23. zz=[ NaN     0     0   NaN
  24.      0     1     1     0
  25.      0     1     1     0
  26.    NaN     0     0   NaN
  27.    NaN     0     0   NaN
  28.    NaN   NaN   NaN   NaN];

  29. nn=length(x)/2;

  30. for n=1:nn
  31.     XX=xx;
  32.     YY=yy;
  33.     ZZ=zz;
  34.     XX(XX==4)=w(n);
  35.     YY(YY==4)=w(n);
  36.     ZZ(ZZ==1)=z(n+nn)+z(n);
  37.     ZZ(ZZ==0)=z(n);
  38.     X=XX+x(n);     %  x轴
  39.     Y=YY+y(n);     %  y轴
  40.     Z=ZZ;          %  z轴
  41.     cc = ones(size(yy,1),4).*rand*6;  %  颜色,这里是随机取的
  42.     h=[];
  43.     %  下面循环用surface函数绘图
  44.     for i=1:size(yy,2)/4
  45.         h = [h,surface('xdata',X,...
  46.                 'ydata',Y(:,(i-1)*4+(1:4)), ...
  47.                 'zdata',Z(:,(i-1)*4+(1:4)),...
  48.                 'cdata',i*cc)];
  49.     end
  50.    
  51. end

  52. for n=1:nn
  53.     XX=xx;
  54.     YY=yy;
  55.     ZZ=zz;
  56.     XX(XX==4)=w(n);
  57.     YY(YY==4)=w(n);
  58.     ZZ(ZZ==1)=z(n);
  59.     X=XX+x(n);     %  x轴
  60.     Y=YY+y(n);     %  y轴
  61.     Z=ZZ;          %  z轴
  62.     cc = ones(size(yy,1),4).*rand*6;  %  颜色,这里是随机取的
  63.     h=[];
  64.     %  下面循环用surface函数绘图
  65.     for i=1:size(yy,2)/4
  66.         h = [h,surface('xdata',X,...
  67.                 'ydata',Y(:,(i-1)*4+(1:4)), ...
  68.                 'zdata',Z(:,(i-1)*4+(1:4)),...
  69.                 'cdata',i*cc)];
  70.     end
  71.    
  72. end

  73. view(30,60)    %  控制视角
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-11-7 21:12:18 | 显示全部楼层 来自 黑龙江哈尔滨
7# feynmand

嗯,那个循环我也看过,也没看懂..................
回复 不支持

使用道具 举报

发表于 2010-11-8 09:44:51 | 显示全部楼层 来自 河北廊坊
8# messenger

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

使用道具 举报

发表于 2010-11-12 11:29:43 | 显示全部楼层 来自 香港
feynmand太强大了。。。
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-5 11:27 , Processed in 0.053563 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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