我想在matlab中将数据添加到分组条形图中。但是,我无法将每个数据放在每个条形图的顶部。使用this question作为常规栏和this one,我尝试使用以下代码进行分组图表,但xpos和ypos不正确。任何帮助表示赞赏。
a=[0.92,0.48,0.49];
b=[0.74,0.60,0.30];
c=[0.70,0.30,0.10];
X=[a;b;c];
hbar = bar(X, 'grouped');
for i=1:length(hbar)
XDATA=get(hbar(i),'XData')';
YDATA=get(hbar(i),'YData')';
labels = cellstr(num2str(YDATA));
ygap=0.01;
for j=1:size(XDATA,2)
xpos=XDATA(i,1);
ypos=YDATA(i,1)+ygap;
t=[num2str(YDATA(1,j),3)];text(xpos,ypos,t,'Color','k','HorizontalAlignment','left','Rotation',90)
end
end
答案 0 :(得分:1)
您的代码中存在两个主要错误:
XDATA
是一个(N x 1)
数组,因此内部循环只进行一次迭代,因为size(XDATA,2)
是1
。这会使您的标签添加到每个组的中心栏t
设置为标签(t=[num2str(YDATA(1,j),3)];
;然后使用相同的变量作为text
函数的输出(t = text(xpos,ypos,labels{i});
;然后你在另一个text
调用中使用该变量,但现在它包含标签的句柄而不再是标签字符串。这会产生错误。要正确添加标签,您需要修改代码,以便识别标签的X
位置。
您必须检索组中每个条形的位置:每个条形的X
位置由其XDATA
值以及相对于组中心的偏移量给出。偏移值存储在条形的XOffset
属性中(注意:这是hidden / undocumented property)。
这是一种可能的实施方式:
% Generate some data
bar_data=rand(4,4)
% Get the max value of data (used ot det the YLIM)
mx=max(bar_data(:))
% Draw the grouped bars
hbar=bar(bar_data)
% Set the axes YLIM (increaed wrt the max data value to have room for the
% label
ylim([0 mx*1.2])
grid minor
% Get the XDATA
XDATA=get(hbar(1),'XData')';
% Define the vertical offset of the labels
ygap=mx*0.1;
% Loop over the bar's group
for i=1:length(hbar)
% Get the YDATA of the i-th bar in each group
YDATA=get(hbar(i),'YData')';
% Loop over the groups
for j=1:length(XDATA)
% Get the XPOS of the j-th bar
xpos=XDATA(j);
% Get the height of the bar and increment it with the offset
ypos=YDATA(j)+ygap;
% Define the labels
labels=[num2str(YDATA(j),3)];
% Add the labels
t = text(xpos+hbar(i).XOffset,ypos,labels,'Color','k','HorizontalAlignment','center','Rotation',90)
end
end
希望这有帮助,
Qapla'