2016-09-07 94 views
3

问题标签分组条形图上方

我生成的柱状图,并想以显示栏本身(YDATA)上述各条的高度。因此,对于下面这张图片来说,我希望在图表上方有标签。我无法找到解决办法。为了您的信息,我正在使用Matlab R2016a。

enter image description here

代码

目前我使用下面的代码来创建我的图表。

x={ '-5-0' '0-5' '5-10' '10-15' '15-20' '20-25' '25-30' '30-35' '35-40' '40-45' '45-50' '50-55'}; 
before= [0 27 28 18 9 6 5 3 2 1 1 0] 
after= [27 28 18 9 6 5 3 2 1 1 0 0] 
y=[before',after'] 

h=figure; 
hold on 
yyaxis left 
l1=bar([1:12],y,'grouped'); 

hYLabel=ylabel('Tonnage [%]'); 
yyaxis right 
hylabel=ylabel('Tonnage [%]'); 
l1(1).FaceColor = [ 0 0.447 0.7410]; 
l1(1).EdgeColor = [ 0 0.447 0.7410]; 
l1(2).FaceColor =[0.85 0.325 0.098] 
l1(2).EdgeColor =[0.85 0.325 0.098] 
hTitle=title('Test'); 
hXLabel = xlabel('Value [$/t]'); 
hLegend=legend([l1(1),l1(2)], 'Test1', 'Test2'); 
set([gca,hTitle,hXLabel,hYLabel,hLegend] , 'FontName' , 'Helvetica','FontSize', 8) 
set(hTitle,'FontSize', 11) 
set(hLegend,'Fontsize',8,'Location', 'southoutside', 'Orientation','horizontal') 
set(gca,'XTick',[1:12]) 
xlim([0.5 12.5]) 
set(gca,'xticklabel',x.') 
set(gca,'LineWidth',1.0) 

hold off 

什么我找 什么我寻找快速例证。很明显,我想在每列上面添加一个标签。任何帮助将非常感激。

enter image description here

回答

3

你行后:

l1=bar([1:12],y,'grouped'); 

添加下面几行:

x_shift = 0.15; 
text([1:12]-x_shift,y(:,1)+1,num2str(y(:,1)),... 
    'FontSize',12,'HorizontalAlignment','Center','Color',[0 0.447 0.7410]) 
text([1:12]+x_shift,y(:,2)+1,num2str(y(:,2)),... 
    'FontSize',12,'HorizontalAlignment','Center','Color',[0.85 0.325 0.098]) 

,你会得到:

Labeled bar

,如果你想要的百分比格式,并且还旋转,那么x_shift需要进行一点点调整,也y轴的限制,所以我把这里的全部代码为:

x={'-5-0' '0-5' '5-10' '10-15' '15-20' '20-25' '25-30' '30-35'... 
    '35-40' '40-45' '45-50' '50-55'}; 
before= [0 27 28 18 9 6 5 3 2 1 1 0]; 
after= [27 28 18 9 6 5 3 2 1 1 0 0]; 
y=[before',after']; 
ax = axes('xticklabel',x.','LineWidth',1.0,'XTick',1:12); 
yyaxis(ax,'left') 
l1 = bar(ax,y,'grouped'); 
x1_shift = -0.17; 
x2_shift = 0.11; 
text([1:12]+x1_shift,y(:,1)+1,[num2str(y(:,1)) repmat('%',numel(y(:,1)),1)],... 
    'FontSize',12,'Rotation',90,'HorizontalAlignment','left',... 
    'VerticalAlignment','middle','Color',[0 0.447 0.7410]) 
text([1:12]+x2_shift,y(:,2)+1,[num2str(y(:,2)) repmat('%',numel(y(:,2)),1)],... 
    'FontSize',12,'Rotation',90,'HorizontalAlignment','left',... 
    'VerticalAlignment','middle','Color',[0.85 0.325 0.098]) 
ylabel('Tonnage [%]','FontName','Helvetica','FontSize',8); 
ylim([0 35]) 
yyaxis(ax,'right') 
ylabel('Tonnage [%]','FontName','Helvetica','FontSize',8); 
l1(1).FaceColor = [0 0.447 0.7410]; 
l1(1).EdgeColor = [0 0.447 0.7410]; 
l1(2).FaceColor = [0.85 0.325 0.098]; 
l1(2).EdgeColor = [0.85 0.325 0.098]; 
title('Test','FontName','Helvetica','FontSize', 11); 
xlabel('Value [$/t]', 'FontName' , 'Helvetica','FontSize', 8); 
hLegend = legend([l1(1),l1(2)], 'Test1', 'Test2'); 
set(hLegend,'Location','southoutside','Orientation','horizontal',... 
    'FontName', 'Helvetica','FontSize', 8) 
xlim([0.5 12.5]) 
ylim([0 35]) 
box off 

,你会发现我改变你的代码一点,以使其更小巧,但它本质上不相同,并产生以下栏:

 percentage format

即使调整图形大小,此处的标签也将放置在相同的位置(相对于条形)。

+0

感谢您的回答,但即使您更改图形的大小,也无法让它们完全居中! – KiW

+0

@KiW我编辑了上面的代码,以便标签保持居中。如果您需要这些,我还添加了旋转和百分比格式。 – EBH

1

可以在this post 使用像添加hold off前此行:
text(1 , y(1,1)+30, ['y = ', num2str(10)], 'VerticalAlignment', 'top', 'FontSize', 8)
现在你可以用这些参数玩,并把它变成一个循环超过evrey栏添加标签。

编辑:
如果我理解你的权利,这是你想要的?
添加以下之前hold off

xt1=[1:12]-0.17; 
xt2=[1:12]+0.11; 
yt1=before+0.2; 
yt2=after+0.2; 

for i=1:12 
    text(xt1(i) , yt1(i), [num2str(y(i,1)), '%'], 'rotation', 90, 'FontSize', 6, 'Color',[0 0.447 0.7410]) 
    text(xt2(i) , yt2(i), [num2str(y(i,2)), '%'], 'rotation', 90, 'FontSize', 6, 'Color',[0.85 0.325 0.098]) 
end 

现在你也可以改变图形的大小和文本停留在需要的位置。
结果如下所示:以Matlab2015 Bar Graph with Labels for every bar 顺便说一句,我只访问,所以我不能用你的所有功能,但代码应该是罚款Matlab2016

+0

如果我想让我的身材达到15.75厘米宽,那么关于如何让标签完全在中间的任何想法? – KiW

+0

我编辑了我的初始文章。希望这是你正在寻找的东西。 – Koanashi