我如何获得具有功能bar3和每个条形宽度不同的条形图?

JMS*_*MSH 11 graphics matlab graph width matlab-figure

我有代码:

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
Run Code Online (Sandbox Code Playgroud)

这就是图中的样子:

在此输入图像描述

我想根据条的高度为每个条获得不同的宽度.

我想要的看起来像http://www.sdtools.com/help/ii_mac.html中的图片.

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

Lui*_*ndo 7

这有点难以弄清楚,但是一旦你得到这个模式就很容易了.的'XData''YData'每一个属性h(i)是定义x轴和每个条的宽度Y-矩阵.每组6行的那些矩阵定义了一个条形.所以诀窍是修改'XData''YData'根据 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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

注意,上面的代码根据线性尺寸(宽度)进行缩放values.要缩放区域,只需使用以下平方根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
Run Code Online (Sandbox Code Playgroud)

在上面的任何一个中,如果你想要所有高度相等的柱子,只需用第二条线替换

h = bar3(ones(size(values)));
Run Code Online (Sandbox Code Playgroud)

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

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

在此输入图像描述

  • 嘿Matlab首席执行官!专业人士参与其中,来接受他们. (2认同)
  • @ user3749418问题是一个很好的挑战:-) (2认同)