summaryrefslogtreecommitdiff
path: root/modules/graphics/macros/barh.sci
diff options
context:
space:
mode:
Diffstat (limited to 'modules/graphics/macros/barh.sci')
-rwxr-xr-xmodules/graphics/macros/barh.sci281
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