我如何获得功能栏3和每个栏不同的宽度? [英] How I obtain bars with function bar3 and different widths for each bar?

查看:144
本文介绍了我如何获得功能栏3和每个栏不同的宽度?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下代码:

  values = [1.0 0.6 0.1; 0.0 1.0 0.3; 0.9 0.4 1.0]; 
h = bar3(values);
着色interp
for i = 1:长度(h)
%获取当前组的ZData矩阵
zdata = get(h(i),'Zdata');
set(h(i),'Cdata',zdata)
end
set(h,'EdgeColor','k')
view(-61,68);
colormap cool
colorbar

这就是这张图的样子:





我想根据栏的高度为每个栏获取不同的宽度。



我想要的图片看起来像< a href =http://www.sdtools.com/help/ii_mac.html =nofollow noreferrer> http://www.sdtools.com/help/ii_mac.html 。



blah http://www.sdtools.com /help/mac.gif

解决方案

这很难弄清楚,但一旦得到该模式。每个 h(i)'XData''YData' c $ c>是定义每个小节的x和y宽度的矩阵。这些矩阵的每行6行定义一个条。所以诀窍是根据值修改'XData''YData' code>。

 值= [1.0 0.6 0.1; 0.0 1.0 0.3; 0.9 0.4 1.0]; 
h = bar3(values);
m = max(values(:))* 2; %//标准化条宽常量
着色interp
for i = 1:长度(h)
%获取当前组的ZData矩阵
xdata = get(h( i)中, '扩展数据');
ydata = get(h(i),'Ydata');
zdata = get(h(i),'Zdata');
set(h(i),'Cdata',zdata)
for k = 1:6:size(xdata,1)
xdatak = xdata(k +(0:5),: );
xdatak = round(xdatak)+ sign(xdatak-round(xdatak))* values(ceil(k / 6),i)/ m;
xdata(k +(0:5),:) = xdatak;
ydatak = ydata(k +(0:5),:);
ydatak = round(ydatak)+ sign(ydatak-round(ydatak))* values(ceil(k / 6),i)/ m;
ydata(k +(0:5),:) = ydatak;
end
set(h(i),'XData',xdata);
set(h(i),'YData',ydata);
end
set(h,'EdgeColor','k')
view(-61,68);
colormap cool
colorbar


请注意,上面的代码会按比例缩放线性尺寸(宽度)根据。要缩放区域,只需使用值的平方根

  values = [1.0 0.6 0.1; 0.0 1.0 0.3; 0.9 0.4 1.0]; 
h = bar3(values);
svalues = sqrt(values);
m = max(svalues(:))* 2; %//标准化条宽常量
着色interp
for i = 1:长度(h)
%获取当前组的ZData矩阵
xdata = get(h( i)中, '扩展数据');
ydata = get(h(i),'Ydata');
zdata = get(h(i),'Zdata');
set(h(i),'Cdata',zdata)
for k = 1:6:size(xdata,1)
xdatak = xdata(k +(0:5),: );
xdatak = round(xdatak)+ sign(xdatak-round(xdatak))* svalues(ceil(k / 6),i)/ m;
xdata(k +(0:5),:) = xdatak;
ydatak = ydata(k +(0:5),:);
ydatak = round(ydatak)+ sign(ydatak-round(ydatak))* svalues(ceil(k / 6),i)/ m;
ydata(k +(0:5),:) = ydatak;
end
set(h(i),'XData',xdata);
set(h(i),'YData',ydata);
end
set(h,'EdgeColor','k')
view(-61,68);
colormap cool
colorbar

在上述任何一种情况下,如果您想要全部高度相等的酒吧只需将第二行替换为

  h = bar3(ones(size(values))); 

或者如果您更喜欢2D视图,请使用

  view(-90,90)%//从上方查看
轴等于%//在x和y中设置相同比例


I have the code:

values = [1.0 0.6 0.1;  0.0 1.0 0.3;  0.9 0.4 1.0];
h = bar3(values);
shading interp
for i = 1:length(h)
    % Get the ZData matrix of the current group
    zdata = get(h(i),'Zdata');
    set(h(i),'Cdata',zdata)
end
set(h,'EdgeColor','k')
view(-61, 68);
colormap cool
colorbar

And this is what the figure looks like:

I want to obtain different widths for each bar dependent on the height of the bar.

What I want looks like a picture in http://www.sdtools.com/help/ii_mac.html.

blah http://www.sdtools.com/help/mac.gif

解决方案

This was a little hard to figure out, but it's easy once you get the pattern. The 'XData' and 'YData' properties of each h(i) are matrices that define the x- and y- width of each bar. Each group of 6 rows of those matrices defines a bar. So the trick is to modify 'XData' and 'YData' according to values.

values = [1.0 0.6 0.1;  0.0 1.0 0.3;  0.9 0.4 1.0];
h = bar3(values);
m = max(values(:))*2; %// normalizing constant for bar width
shading interp
for i = 1:length(h)
    % Get the ZData matrix of the current group
    xdata = get(h(i),'Xdata');
    ydata = get(h(i),'Ydata');
    zdata = get(h(i),'Zdata');
    set(h(i),'Cdata',zdata)
    for k = 1:6:size(xdata,1)
        xdatak = xdata(k+(0:5),:);
        xdatak = round(xdatak)+sign(xdatak-round(xdatak))*values(ceil(k/6),i)/m;
        xdata(k+(0:5),:) = xdatak;
        ydatak = ydata(k+(0:5),:);
        ydatak = round(ydatak)+sign(ydatak-round(ydatak))*values(ceil(k/6),i)/m;
        ydata(k+(0:5),:) = ydatak;
    end
    set(h(i),'XData',xdata);
    set(h(i),'YData',ydata);
end
set(h,'EdgeColor','k')
view(-61, 68);
colormap cool
colorbar

Note that the above code scales linear size (width) according to values. To scale area just use the square root of values:

values = [1.0 0.6 0.1;  0.0 1.0 0.3;  0.9 0.4 1.0];
h = bar3(values);
svalues= sqrt(values);
m = max(svalues(:))*2; %// normalizing constant for bar width
shading interp
for i = 1:length(h)
    % Get the ZData matrix of the current group
    xdata = get(h(i),'Xdata');
    ydata = get(h(i),'Ydata');
    zdata = get(h(i),'Zdata');
    set(h(i),'Cdata',zdata)
    for k = 1:6:size(xdata,1)
        xdatak = xdata(k+(0:5),:);
        xdatak = round(xdatak)+sign(xdatak-round(xdatak))*svalues(ceil(k/6),i)/m;
        xdata(k+(0:5),:) = xdatak;
        ydatak = ydata(k+(0:5),:);
        ydatak = round(ydatak)+sign(ydatak-round(ydatak))*svalues(ceil(k/6),i)/m;
        ydata(k+(0:5),:) = ydatak;
    end
    set(h(i),'XData',xdata);
    set(h(i),'YData',ydata);
end
set(h,'EdgeColor','k')
view(-61, 68);
colormap cool
colorbar

In either of the above, if you want all bars with equal height just replace the second line by

h = bar3(ones(size(values)));

Or if you prefer a 2D view, use

view(-90,90) %// view from above
axis equal %// set the same scale in x and y

这篇关于我如何获得功能栏3和每个栏不同的宽度?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆