操纵bar3的x轴值可生成空心的barplot

时间:2018-07-30 14:22:29

标签: matlab matlab-figure

由于没有更好的方法,因此我正在建立bar3图并操纵X轴值。我完全理解了安德·比古里(Ander Biguri)在回答该线程时提供的代码:How to set x and y values when using bar3 in Matlab?

事实证明,X轴值很好,但是不在边界处的条是原型形状的。可能与数据操作有关。

这是对应的情节:

bar3 Plot with hollow bars

我在此示例中使用的数据:

klasse_sig_a=[70 82 94 106 118 130 142 154 166 178 190];
klasse_sig_m=[-120 -102 -84 -66 -48 -30 -12 6 24 42 60];
RFMatrix=
[2  0   0   0   0   0   0   0   0   0;
0   0   0   0   0   0   0   0   0   0;
0   0   0   0   0   0   0   0   0   0;
0   0   0   0   0   0   0   0   0   0;
0   0   0   0   0   0   0   0   0   0;
0   0   0   0   0   0   0   1   0   0;
0   0   0   0   2   0   0   0   0   2;
0   0   0   0   1   0   0   0   0   0;
0   0   0   0   0   0   0   0   0   0;
0   0   0   0   2   0   0   0   0   0;]

我的代码:

b=bar3(klasse_sig_m(2:end),RFMatrix,1);
xlabel('\sigma_a [MPa]')
ylabel('\sigma_m [MPa]')
zlabel('N [-]')
axis tight

for k = 1:length(b)
    zdata = b(k).ZData;
    b(k).CData = zdata;
    b(k).FaceColor = 'interp';
end

Xdat=get(b,'XData');
diff=klasse_sig_a(2)-klasse_sig_a(1);
ONEMAT=ones(size(Xdat{1},1),size(Xdat{1},2)/2);

for ii=1:length(Xdat)
    MAT=(Xdat{ii}-0.5);
    if ii==1
        MAT=MAT+[ONEMAT*min(klasse_sig_a) ONEMAT*(min(klasse_sig_a)+diff)-ii];
        MAT_VOR=MAT(:,3:4);
    else
        MAT(:,1:2)=MAT_VOR;
        MAT(:,3:4)=MAT(:,3:4)+ONEMAT*(min(klasse_sig_a)+ii*diff)-ii;
        MAT_VOR=MAT(:,3:4);
    end
    Xdat{ii}=MAT;
    set(b(ii),'XData',Xdat{ii});
end
set(gca,'XTick', klasse_sig_a(1:2:end))
set(gca,'YTick', klasse_sig_m(1:2:end))

我注意到,对于每个xdata {ii},未经处理的数据在矩阵的左侧和右侧之间始终具有1的差异

   ...       ...       ...       ...
   NaN       NaN       NaN       NaN
   NaN    0.5000    1.5000       NaN
0.5000    0.5000    1.5000    1.5000
0.5000    0.5000    1.5000    1.5000
   NaN    0.5000    1.5000       NaN
   NaN    0.5000    1.5000       NaN
   NaN       NaN       NaN       NaN

设置我自己的数据时,差异变得更大,条形图变得空洞

   ...   ...   ...  ...
   NaN    70    82   NaN
    70    70    82    82
    70    70    82    82
   NaN    70    82   NaN
   NaN    70    82   NaN
   NaN   NaN   NaN   NaN

如何使条再次显示为实心?我猜数据处理是错误的。 谢谢你的帮助! 问候

1 个答案:

答案 0 :(得分:2)

请注意,the answer to the related question是专门为处理x值为连续整数(即bin宽度为1)的情况而设计的。您的情况更为笼统,箱宽为12。这需要稍微不同的逻辑。通过以下代码,我能够获得您想要的结果:

b = bar3(klasse_sig_m(2:end), RFMatrix,1);
xlabel('\sigma_a [MPa]');
ylabel('\sigma_m [MPa]');
zlabel('N [-]');
axis tight;

for k = 1:length(b)
  xData = b(k).XData;
  zData = b(k).ZData;
  set(b(k), 'XData', (xData-k).*diff(klasse_sig_a(k:(k+1)))+klasse_sig_a(k), ...
            'CData', zData, 'FaceColor', 'interp');
end

set(gca, 'XTick', klasse_sig_a(1:2:end), 'YTick', klasse_sig_m(1:2:end));

情节:

enter image description here