2

我想在条形图中显示标签(如果可能,删除颜色)。例如,这是一个创建彩色条形图的代码片段:

S=[1 4 1 2 3 4];
R=[4 4 4 10 6 1];
f=zeros(5,6);
for i=1:5
 for j=1:numel(S)
     if S(j)==i
     f(i,j)=R(j);
  end
 end
end
barplot=bar(f,'stacked');

我想要的是看起来像这样的东西:

在此处输入图像描述

我该怎么做?你可以帮帮我吗?提前致谢!

4

2 回答 2

2

首先,要删除条的颜色(制作条),您可以使用返回的句柄向量bar

set(barplot, 'FaceColor', 'w'); % // w = white

将文本添加到条形图有点棘手——您必须使用 添加单独的文本标签text,为此,您必须计算每个标签的 x 和 y 坐标。这是如何完成的:

H = nonzeros(R) / 2;            % // Relative offset of each text label 
Y = cumsum(f, 2);
Y = nonzeros(Y(f > 0)') - H;    %'// Y coordinates of text labels
X = S - 0.2;                    % // X coordinates of text labels
for k = 1:numel(Y)
    text(X(k), Y(k), labels{k}) % // Show text label
end

其中labels是要显示的文本字符串的元胞数组。

顺便说一句,您可以将两个嵌套循环简化为一个语句:

f = full(sparse(S, 1:numel(S), R, 5, numel(S)));

例子

S = [1 4 1 2 3 4];
R = [4 4 4 10 6 1];

%// Bar plot
f = full(sparse(S, 1:numel(S), R, 5, numel(S)));
barplot = bar(f, 'stacked');

%// Set color of bars to white
set(barplot, 'FaceColor', 'w')

%// Add text labels
labels = {'data1', 'data2', 'data3', 'data4', 'data5', 'data6'};
H = nonzeros(R) / 2;
Y = cumsum(f, 2);
Y = nonzeros(Y(f > 0)') - H;     %'// Y coordinates
X = S - 0.2;                     % // X coordinates
for k = 1:numel(Y)
    text(X(k), Y(k), labels{k})
end

这将产生以下图:

结果

玩得开心 :)

于 2013-06-23T17:24:16.213 回答
0

如果可以将标签放在 x 轴刻度标签中,请考虑改用http://www.mathworks.com/matlabcentral/fileexchange/8722-rotate-tick-label。您也许可以修改它以自动将文本垂直放置在每个条形内,但我不建议这样做。

于 2013-06-23T12:29:19.903 回答