我想在条形图中显示标签(如果可能,删除颜色)。例如,这是一个创建彩色条形图的代码片段:
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');
我想要的是看起来像这样的东西:
我该怎么做?你可以帮帮我吗?提前致谢!
首先,要删除条的颜色(即制作条),您可以使用返回的句柄向量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
这将产生以下图:
玩得开心 :)
如果可以将标签放在 x 轴刻度标签中,请考虑改用http://www.mathworks.com/matlabcentral/fileexchange/8722-rotate-tick-label。您也许可以修改它以自动将文本垂直放置在每个条形内,但我不建议这样做。