diff options
Diffstat (limited to 'modules/graphics/macros/barh.sci')
-rwxr-xr-x | modules/graphics/macros/barh.sci | 281 |
1 files changed, 281 insertions, 0 deletions
diff --git a/modules/graphics/macros/barh.sci b/modules/graphics/macros/barh.sci new file mode 100755 index 000000000..8d6e43e11 --- /dev/null +++ b/modules/graphics/macros/barh.sci @@ -0,0 +1,281 @@ +// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab +// Copyright (C) 2005 - INRIA - Farid Belahcene +// Copyright (C) 2012 - Michael Baudin +// This file must be used under the terms of the CeCILL. +// This source file is licensed as described in the file COPYING, which +// you should have received as part of this distribution. The terms +// are also available at +// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt + + +function barh(varargin) + + // barh(x,y,width,style,color) + // Input : + // x : a scalar or a vector of reals + // y : a sclar, a vector or a matrix of reals + // width : a double, the bar width, it's the percentage (0<width<1) of the max width of one bar which is wanted (default: width=0.8) + // style : a string, 'grouped' or 'stacked' (default: style='grouped') + + if and(size(varargin)<>[1:5]) then + error(msprintf(gettext("%s: Wrong number of input argument(s): %d to %d expected.\n"), "barh", 1, 5)); + end + + styletab=["grouped","stacked"] + COLORBOOL=%f + + // Default values + STYLE="grouped" + WIDTH=0.8 + COLORBOOL=%f + + // Check RHS arguments + ListArg = varargin; + + // Detect and set the current axes now: + if type(ListArg(1)) == 9 + hdle = ListArg(1); + if (hdle.type == "Axes") + sca(ListArg(1)); + ListArg(1) = null(); // remove this parameter from the list + else + warning(msprintf(gettext("%s: Wrong type for input argument #%d: Axes handle expected.\n"),"barh",1)); + return; + end + end + if size(ListArg) == 4 then + COLOR=ListArg(4); + if type(COLOR) <> 10 then + error(msprintf(gettext("%s: Wrong type for input argument #%d: A string expected.\n"),"barh",4)); + end + end + if size(ListArg) == 5 then + STYLE=ListArg(5); + if type(STYLE) <> 10 then + error(msprintf(gettext("%s: Wrong type for input argument #%d: A string expected.\n"),"barh",5)); + end + end + + nv = size(ListArg) + + T=[]; + + for k=1:nv + T(k) = type(ListArg(k)) + end + + argdb=find(T==1) + argstr=find(T==10) + + if size(argdb,"*")<> argdb($) then + error(msprintf(gettext("%s: Wrong type for input arguments: Matrix expected for %s, %s and %s.\n"),"barh", "x", "y", "width")); + end + + if size(argstr,"*") <> nv-argdb($) then + error(msprintf(gettext("%s: Wrong type for input arguments: String expected for %s and %s.\n"),"barh", "color", "style")); + end + + // Set the double argument : x,y,width + // barh(y,...) + if size(argdb,"*")==1 + Y=ListArg(1) + if or(size(Y)==1) then + Y=Y(:) + end + X=1:size(Y,1) + end + + if size(argdb,"*")==2 + if size(ListArg(2),"*")==1 then + // barh(x,y,...) + if size(ListArg(1),"*")==1 then + X=ListArg(1) + Y=ListArg(2) + else + //barh(y,width,...) + WIDTH=ListArg(2) + Y=ListArg(1) + if or(size(Y)==1) then + Y=Y(:) + end + X=1:size(Y,1) + end + else + // barh(x,y,...) + X=ListArg(1) + Y=ListArg(2) + if or(size(X)==1) then + if size(X,"*")<>1 then // X is a vector + if or(size(Y)==1) then // Y is a vector + Y=Y(:) + end + if size(X,"*")<>size(Y,1) + error(msprintf(gettext("%s: Wrong size for input arguments #%d and #%d: The number of rows of argument #%d must be equal to the size of argument #%d.\n"),"bar",1, 2, 2, 1)); + end + elseif size(Y,1)>1 then + error(msprintf(gettext("%s: Wrong size for input arguments #%d: A scalar or a column vector expected.\n"),"bar",2)); + end + else + error(msprintf(gettext("%s: Wrong type for input argument #%d: A scalar or a vector expected.\n"),"barh",1)); + end + end + end + + // barh(x,y,width,...) + if size(argdb,"*")==3 + X=ListArg(1) + Y=ListArg(2) + WIDTH=ListArg(3) + if size(WIDTH,"*")<>1 then + error(msprintf(gettext("%s: Wrong type for input argument #%d: A scalar expected.\n"),"barh",3)); + elseif or(size(X)==1) then + if size(X,"*")<>1 then // X is a vector + if or(size(Y)==1) then // Y is a vector + Y=Y(:) + end + if size(X,"*")<>size(Y,1) + error(msprintf(gettext("%s: Wrong size for input arguments #%d and #%d: The number of rows of argument #%d must be equal to the size of argument #%d.\n"),"bar",1, 2, 2, 1)); + end + elseif size(Y,1)>1 then + error(msprintf(gettext("%s: Wrong size for input arguments #%d: A scalar or a column vector expected.\n"),"bar",2)); + end + else + error(msprintf(gettext("%s: Wrong type for input argument #%d: A scalar or a vector expected.\n"),"barh",1)); + end + end + + X=X(:) + + // Set the string argument + for i=1:size(argstr,"*") + // barh(...,style) + if or(ListArg(argstr(i))==styletab) then + STYLE=ListArg(argstr(i)) + else + COLOR=ListArg(argstr(i)) + COLORBOOL=%t + end + end + + // Verify if there are data bounds which are defined before creation the horizontal bars creation, in order to merge the data bounds + a=gca() + if size(a.children)<>0 then + gca_children_empty=%t + a_data_bounds=a.data_bounds + else + gca_children_empty=%f + end + + //drawlater + curFig = gcf(); + immediate_drawing = curFig.immediate_drawing; + + if COLORBOOL + plot(X,Y,COLOR); // plot manages immediate_drawing property itself to avoid flickering + else + plot(X,Y); // plot manages immediate_drawing property itself to avoid flickering + end + + curFig.immediate_drawing = "off"; + + barh_number=size(Y,2) + + if size(X,"*")>1 then + Xtemp=gsort(X,"r","i") + inter=Xtemp(2)-Xtemp(1) + for i=2:size(Xtemp,"*")-1 + inter=min(Xtemp(i+1)-Xtemp(i),inter) + end + if barh_number>1 + inter=inter*0.9 + end + else + inter=1 + end + + wmax=inter/barh_number + y_shift=zeros(size(X,"*"),1) + bar_number= size(Y,2) + e=gce() + a=gca() + a.sub_ticks(2) = 0 + + for i=bar_number:-1:1 + + ei = e.children(i) + + // Perform x_shift + if modulo(bar_number,2)==0 then + x_shift=(-i+bar_number/2)*wmax+0.4*wmax + elseif modulo(bar_number,2)==1 then + x_shift=(-i+1+floor(bar_number/2))*wmax + end + + // Perform y_shift + if i==bar_number then + y_shift=zeros(size(X,"*"),1) + else + y_shift=Y(:,bar_number-i)+y_shift + end + + // Update axes data bounds + // case 'grouped' + if STYLE=="grouped" + if i <> bar_number then + ymin=min(a.data_bounds(1,1),min(Y(:,bar_number-i+1)),0) + xmin=min(a.data_bounds(1,2),min(X)+x_shift-0.4*wmax) + ymax=max(a.data_bounds(2,1),max(Y(:,bar_number-i+1)),0) + xmax=max(a.data_bounds(2,2),max(X)+x_shift+0.4*wmax) + else + if ~gca_children_empty + ymin=min(min(Y(:,bar_number-i+1)),0) + xmin=min(X)+x_shift-0.4*wmax + ymax=max(max(Y(:,bar_number-i+1)),0) + xmax=max(X)+x_shift+0.4*wmax + else + ymin=min(a_data_bounds(1,1),min(Y(:,bar_number-i+1)),0) + xmin=min(a_data_bounds(1,2),min(X)+x_shift-0.4*wmax) + ymax=max(a_data_bounds(2,1),max(Y(:,bar_number-i+1)),0) + xmax=max(a_data_bounds(2,2),max(X)+x_shift+0.4*wmax) + end + end + a.data_bounds=[ymin xmin;ymax xmax] + ei.x_shift=x_shift*ones(size(X,"*"),1) + else // case 'stacked' + wmax=inter + if i <> bar_number then + ymin=min(a.data_bounds(1,1),min(Y(:,bar_number-i+1)+y_shift)) + xmin=min(a.data_bounds(1,2),0,min(X-0.4*wmax)) + ymax=max(a.data_bounds(2,1),max(Y(:,bar_number-i+1)+y_shift)) + xmax=max(a.data_bounds(2,2),0,max(X+0.4*wmax)) + else + if ~gca_children_empty + ymin=min(Y(:,bar_number-i+1)+y_shift) + xmin=min(0,min(X-0.4*wmax)) + ymax=max(Y(:,bar_number-i+1)+y_shift) + xmax=max(0,max(X+0.4*wmax)) + else + ymin=min(a_data_bounds(1,1),min(Y(:,bar_number-i+1)+y_shift)) + xmin=min(a_data_bounds(1,2),0,min(X-0.4*wmax)) + ymax=max(a_data_bounds(2,1),max(Y(:,bar_number-i+1)+y_shift)) + xmax=max(a_data_bounds(2,2),0,max(X+0.4*wmax)) + end + end + a.data_bounds=[ymin xmin; ymax xmax] + ei.y_shift=y_shift + end + + a.y_ticks=tlist("ticks",Xtemp,string(Xtemp)) + w=WIDTH*wmax + ei.bar_width=w + ei.background=ei.foreground + ei.polyline_style=7; // bar type + ei.background=ei.foreground + ei.foreground = -1; // black by default + ei.line_mode="off"; + end + + //drawnow + curFig.immediate_drawing = immediate_drawing; + +endfunction |