将数据标签添加到matlab中的分组条形图中

时间:2017-05-01 07:13:33

标签: matlab bar-chart

我想在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

1 个答案:

答案 0 :(得分:1)

您的代码中存在两个主要错误:

  • 内部循环的定义:XDATA是一个(N x 1)数组,因此内部循环只进行一次迭代,因为size(XDATA,2)1。这会使您的标签添加到每个组的中心栏
  • 在innser循环中,您首先将变量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

enter image description here

希望这有帮助,

Qapla'