function barErrorbar(X,Y,E,varargin)
%
% barErrorbar(X,Y,E,...)
% 
% エラーバー付きバープロット
%
% 引数
% X
%   バーグループのX座標を示すn行1列または1行n列の配列を指定します。
% Y
%   バーの長さを示すn行m列の配列を指定します。
% E
%   エラーバーの長さを示すn行m列の配列を指定します。
%   
% オプション
% ErrorbarLineWidth
%   エラーバーの線の幅を指定します。省略時は1.0です。
% ErrorbarLineColor
%   エラーバーの色を指定します。省略時は'k'(黒)です。
% barwidth
%   バーの幅を指定します。1.0より小さければ隣り合うバーの間に隙間が空きます。
%   省略時は0.8です。
% 
% 補足
%   エラーバーの色はcolormapで指定します。
% 
% 
% 変更履歴
% 2010/6/10
% ・最初の公開
% 
% 作者
%   十河宏行(愛媛大学法文学部)
%   http://www.s12600.net/psy/
% お断り
%   この関数の使用によって生じるいかなる結果に関しても責任を
%   負いかねます。
% 

errorbarlinewidth = 1.0;
errorbarlinecolor = 'k';
barwidth = 0.8;

if mod(length(varargin),2)~=0
    error('Options must be paired.')
end

for i=1:length(varargin)/2
    switch(lower(varargin{2*i-1}))
        case 'errorbarlinewidth'
            errorbarlinewidth = varargin{2*i};
        case 'errorbarlinecolor'
            errorbarlinecolor = varargin{2*i};
        case 'barwidth'
            barwidth = varargin{2*i};
        otherwise
            error(['Unknown option: ' varargin{2*i-1}])
    end
end

h = bar(X,Y,barwidth,'hist');
hold on

numbars = size(Y,2);
if numbars>1
    xdata = get(h,'XData');
    centerX = cellfun(@(x)(x(1,:)+x(3,:))/2,xdata,'UniformOutput', false);
    for i = 1:numbars
        errorbar(centerX{i,:}, Y(:,i), E(:,i), 'linestyle', 'none','Color', errorbarlinecolor, 'LineWidth',errorbarlinewidth);
    end
else
    xdata = get(h,'XData');
    centerX = (xdata(1,:)+xdata(3,:))/2;
    errorbar(centerX(1,:), Y(:,1), E(:,1), 'linestyle', 'none', 'Color', errorbarlinecolor, 'LineWidth',errorbarlinewidth);
end
    
hold off
