diff options
Diffstat (limited to 'modules/graphics/macros/barhomogenize.sci')
-rwxr-xr-x | modules/graphics/macros/barhomogenize.sci | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/modules/graphics/macros/barhomogenize.sci b/modules/graphics/macros/barhomogenize.sci new file mode 100755 index 000000000..1a43e97f0 --- /dev/null +++ b/modules/graphics/macros/barhomogenize.sci @@ -0,0 +1,194 @@ +// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab +// Copyright (C) 2005 - INRIA - Farid Belahcene +// 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 barhomogenize(varargin) + // barhomogenize(a,style,width) + // This function homogenizes the style and the widh of all the bars contained in the axes handle a (default is the handle of the current axes) + // + // Input : + // a : the handle of the axe containing the bares (default: a=gca()) + // style : a string, 'grouped' or 'stacked' (default: style='grouped') + // width : a double, the bar width, it's the percentage (0<width<1) of the width max of one bar which is wanted (default: width=0.8). + + if and(size(varargin)<>[0:3]) then + error(msprintf(gettext("%s: Wrong number of input argument(s): %d to %d expected.\n"), "barhomogenize", 0, 3)); + end + + // Default values + a=gca() + STYLE="grouped" + WIDTH=0.8 + varlist=varargin + pos="v" + + if size(varargin)<>0 then + if or(varlist($)==["h";"v"]) then + pos=varlist($) + varlist($)=null() + end + end + // detect and set the handle axes, the style and the width + if size(varlist) == 1 + if type(varlist(1))==9 + var1=varlist(1) + if var1.type == "Axes" + a=var1 + else + error(msprintf(gettext("%s: Wrong type for input argument #%d: Axes handle expected.\n"),"barhomogenize",1)); + end + varlist(1).type == "Axes" + a=varlist(1) + elseif or(varlist(1) == ["grouped","stacked"]) + STYLE=varlist(1) + elseif type(varlist(1)) == 1 + WIDTH=varlist(1) + else + error(msprintf(gettext("%s: Wrong type for input argument #%d: A handle, a string or a scalar expected.\n"),"barhomogenize", 1)); + end + elseif size(varlist) == 2 then + if type(varlist(1))==9 then + var1=varlist(1) + if (var1.type == "Axes") & or(varlist(2)==["grouped","stacked"]) then + a=var1 + STYLE=varlist(2) + elseif var1.type == "Axes" & type(varlist(2)) == 1 then + a=var1 + WIDTH=varlist(2) + else + error(msprintf(gettext("%s: Wrong type for input argument #%d: A string or a scalar expected.\n"),"barhomogenize", 2)); + end + elseif or(varlist(1) == ["grouped","stacked"]) & (type(varlist(2)) == 1) + STYLE=varlist(1) + WIDTH=varlist(2) + else + error(msprintf(gettext("%s: Wrong type for input arguments #%d and #%d: If argument #%d is a handle or a string, argument #%d must be a string or a scalar.\n"),"barhomogenize", 1, 2, 1, 2)); + end + elseif size(varlist) == 3 + if type(varlist(1))==9 then + var1 = varlist(1) + if var1.type == "Axes" & or(varlist(2)==["grouped","stacked"]) & (type(varlist(3)) == 1) + a=var1 + STYLE=varlist(2) + WIDTH=varlist(3) + end + end + end + + if ~isreal(WIDTH) + error(msprintf(gettext("%s: Wrong type for input argument #%d: A real expected for %s.\n"),"barhomogenize", length(varlist), "width")); + end + + hbarlist=[]; + + for i=1:size(a.children,"*") + hbarlist=searchbarhandle(a.children(i),hbarlist) + end + + + nbarhandle=size(hbarlist,"*") + if hbarlist<>[] then + X=hbarlist(1).data(:,1) + + for i=2:nbarhandle + if or(hbarlist(i).data(:,1) <> X) + error(msprintf(gettext("%s: The bars must have the same x data.\n"),"barhomogenize")); + end + end + else + error(msprintf(gettext("%s: Could not find any bar in the current graphic.\n"),"barhomogenize")); + end + + // Determinate the max width + 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 nbarhandle>1 + inter=inter*0.9 + end + else + inter=1 + end + + // Perform the x_shift + wmax=inter/nbarhandle + + + for i=1:nbarhandle + if modulo(nbarhandle,2)==0 then + x_shift=(i-1-nbarhandle/2)*wmax+wmax/2 + elseif modulo(nbarhandle,2)==1 then + x_shift=(i-1-floor(nbarhandle/2))*wmax + end + + // Perform the y_shift + if i==1 then + y_shift=zeros(size(X,"*"),1) + else + y_shift=hbarlist(i-1).data(:,2)+y_shift + end + + // Update axes data bounds + if pos=="v" + + if STYLE=="grouped" + a.data_bounds=[min(a.data_bounds(1,1),min(X)+x_shift-wmax/2) min(a.data_bounds(1,2),0,min(hbarlist(i).data(:,2))); max(a.data_bounds(2,1),max(X)+x_shift+wmax/2) max(a.data_bounds(2,2),0,max(hbarlist(i).data(:,2)))] + hbarlist(i).x_shift=x_shift*ones(size(X,"*"),1) + hbarlist(i).y_shift=zeros(size(X,"*"),1) + else + wmax=inter + a.data_bounds=[min(a.data_bounds(1,1),min(X)-wmax/2) min(a.data_bounds(1,2),0,min(y_shift+hbarlist(i).data(:,2))); max(a.data_bounds(2,1),max(X)+wmax/2) max(a.data_bounds(2,2),0,max(y_shift+hbarlist(i).data(:,2)))] + hbarlist(i).x_shift=zeros(size(X,"*"),1) + hbarlist(i).y_shift=y_shift + end + a.auto_ticks(2) = "on"; + a.x_ticks=tlist("ticks",Xtemp,string(Xtemp)) + hbarlist(i).polyline_style=6; + elseif pos=="h" then + if STYLE=="grouped" + a.data_bounds=[min(a.data_bounds(1,2),min(X)+x_shift-wmax/2) min(a.data_bounds(1,1),0,min(hbarlist(i).data(:,2))); max(a.data_bounds(2,2),max(X)+x_shift+wmax/2) max(a.data_bounds(2,1),0,max(hbarlist(i).data(:,2)))] + hbarlist(i).x_shift=x_shift*ones(size(X,"*"),1) + hbarlist(i).y_shift=zeros(size(X,"*"),1) + else + wmax=inter + a.data_bounds=[min(a.data_bounds(1,2),min(X)-wmax/2) min(a.data_bounds(1,1),0,min(y_shift+hbarlist(i).data(:,2))); max(a.data_bounds(2,1),max(y_shift+hbarlist(i).data(:,2))) max(a.data_bounds(2,2),0,max(X+x_shift)+wmax/2)] + hbarlist(i).x_shift=zeros(size(X,"*"),1) + hbarlist(i).y_shift=y_shift + end + a.auto_ticks(1) = "on"; + a.sub_ticks(2) = 0; + a.y_ticks=tlist("ticks",Xtemp,string(Xtemp)) + hbarlist(i).polyline_style=7; + end + + w=WIDTH*wmax + if hbarlist(i).background == -2 + hbarlist(i).background=hbarlist(i).foreground + end + hbarlist(i).bar_width=w + hbarlist(i).line_mode="off"; + end +endfunction + +function hbarlist=searchbarhandle(h,hbarlist) + // This function searches all the bares contained in an axes handle + // output : + // hbarlist: a list which contains the bars handles + if h.type=="Compound" then + for j=1:size(h.children,"*") + hbarlist=searchbarhandle(h.children(j),hbarlist) + end + elseif h.type == "Polyline" then + if h.polyline_style == 6 | h.polyline_style == 7 then + hbarlist = [hbarlist h]; + end + end +endfunction |