Matlab 将bar3 x轴值操纵到空心条形图中
我正在设置一个Matlab 将bar3 x轴值操纵到空心条形图中,matlab,matlab-figure,Matlab,Matlab Figure,我正在设置一个bar3绘图,并操纵X轴值,因为没有更好的方法。我仔细阅读了Ander Biguri在回答这个问题时提供的代码: 结果表明,X轴值很好,但不位于边界处的条形是原型形状。这可能与数据操作有关 下面是相应的图表: 我在本例中使用的数据: 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= [
bar3
绘图,并操纵X轴值,因为没有更好的方法。我仔细阅读了Ander Biguri在回答这个问题时提供的代码:
结果表明,X轴值很好,但不位于边界处的条形是原型形状。这可能与数据操作有关
下面是相应的图表:
我在本例中使用的数据:
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))
我注意到,对于每个扩展数据{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
如何使条形图再次显示为实心?我猜数据操作是错误的。
谢谢你的帮助!
关于请注意,这是专门为处理x值为连续整数(即箱子宽度为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));
情节是:
“…操纵X轴值,因为没有更好的方法”什么是“如此”?请注意,Ander在2015年的回答是针对MATLAB的旧版本,在新的图形系统“HG2”被引入之前。对于最新的MATLAB版本,应该有一种不同的方法来实现这一点。请解释一下你想要达到的目标是什么,它给了你这些空心棒!谢谢你的回答。我试图设置自己的X轴值,请参见
klasse\u sig\u a
。由于bar3仅打印(Y,Z),因此只能通过操纵来设置X轴。到目前为止,我还没有看到更好的方法,甚至在我的matlab版本中也没有。我用的是2016a.yes,那代码很旧了。也许现在有更好的办法。三维条形图。将两个世界中最糟糕的结合起来…:p如果你和我一样有数据可视化的目标,我可能会建议一个更好的选择。