* Bug 15816 fixed: upstream drawlater ignored by polarplot, mesh, pie, contourf
[scilab.git] / scilab / modules / graphics / macros / hist3d.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
3 // Copyright (C) 2012 - Scilab Enterprises - Adeline CARNIS
4 // Copyright (C) 2012, 2018 - Samuel GOUGEON
5 //
6 // Copyright (C) 2012 - 2016 - Scilab Enterprises
7 //
8 // This file is hereby licensed under the terms of the GNU GPL v2.0,
9 // pursuant to article 5.3.4 of the CeCILL v.2.1.
10 // This file was originally licensed under the terms of the CeCILL v2.1,
11 // and continues to be available under such terms.
12 // For more information, see the COPYING file which you should have received
13 // along with this program.
14
15
16 function hist3d(f,theta,alpha,leg,flags,ebox)
17     //!
18     nep=8   // bars half widths = 1/nep
19
20     if ~isdef("theta","local") then theta = 35; end;
21     if ~isdef("alpha","local") then alpha = 45; end;
22     if ~isdef("leg","local") then leg = "X@Y@Z"; end;
23     if ~isdef("flags","local") then flags = [2 1 4]; end;
24
25     def=list(theta,alpha,leg,flags);
26     [lhs,rhs]=argn(0)
27     if rhs<=0 then  //demo
28         towns = ["Agen" "Bastia" "Chamonix" "Cognac" "Hyères" "Le Mans" "Le Puy" ..
29         "Lille" "Lorient" "Mende" ]
30         months = [_("January") _("Febuary") _("March") _("April") _("May") _("June")..
31         _("July") _("August") _("September") _("October") _("November") ..
32         _("December") _("Average") ]
33         months = "$\scalebox{1.3}{\rotatebox{90}{\mbox{" + months + "}}}$"
34
35         T = [5.7 5.9 9.8 12.1 16.0 19.4 21.8 21.5 18.4 14.7 9.3 5.2 13.5
36         9.4 9.4 11.2 13.3 17.3 21.0 24.1 24.5 21.2 17.6 13.3 10.4 16.1
37         -2.3 -0.8 3.0 6.6 11.2 14.4 15.5 15.9 12.5 8.6 2.7 -1.6 7.2
38         6.1 5.9 9.7 11.9 15.8 19.0 21.1 20.9 17.9 14.4 9.3 5.6 13.3
39         8.7 8.9 11.0 13.1 16.7 20.3 23.2 23.3 20.2 16.8 12.6 9.8 15.4
40         5.0 5.5 8.3 10.7 14.5 17.8 19.9 19.7 18.5 12.8 8.1 5.4 12.8
41         1.0 1.3 4.8 7.2 11.3 14.3 17.6 17.1 13.5 9.9 4.6 1.8 8.8
42         3.7 4.1 7.1 9.8 13.5 16.2 18.6 18.5 15.5 11.7 7.2 4.2 10.8
43         6.6 6.7 8.6 10.3 13.6 16.2 18.1 18.0 16.0 13.0 9.4 7.0 12.0
44         0.6 1.3 3.7 5.5 9.6 13.1 16.2 16.0 12.8 8.8 3.8 1.8 7.8
45         ];
46         initDrawingMode = gcf().immediate_drawing;
47         gcf().immediate_drawing = "off";
48         hist3d(T)
49         ax = gca()
50         ax.y_ticks = tlist(["ticks" "locations" "labels"], (0:12)+0.5, months)
51         ax.x_ticks = tlist(["ticks" "locations" "labels"], (0:9)+0.5, towns)
52         zlabel("T [°C]")
53         xtitle(_("Average monthly temperatures in french cities"),"","")
54         ax.title.font_size = 3
55         ax.rotation_angles = [28 19]
56         ax.children.color_mode = color("violet")
57         // ax.children.color_flag = 1
58         gcf().immediate_drawing = initDrawingMode;
59         return
60     end
61     if typeof(f)=="list" then
62         [f,x,y]=f(1:3);
63         sx=prod(size(x));
64         sy=prod(size(y));
65         if [sx-1,sy-1]<>size(f) then
66             write(%io(2),"f: Incompatible length ");
67             return;
68         end
69         dx=(x(2)-x(1))/nep;
70         dy=(y(2)-y(1))/nep;
71         bnds=[x(1) x($), y(1) y($),min(0,min(f)) max(0,max(f))]
72         x=(x(1:sx-1)+x(2:sx))/2;
73         y=(y(1:sy-1)+y(2:sy))/2;
74         [nl,nc]=size(f);
75     else
76         [nl,nc]=size(f);
77         x=(1:nl)-(0.5)*ones(1,nl);
78         y=(1:nc)-(0.5)*ones(1,nc);
79         dx=1/nep; dy=1/nep;
80         bnds=[0 nl,0 nc,min(0,min(f)) max(0,max(f))]
81     end
82     x = matrix([x-dx ; x+dx], 1, -1);
83     y = matrix([y-dy ; y+dy], 1, -1);
84     a=[0;0;1;1]
85     b=[0;1;1;0]
86     c=[0;0;0;0]
87     d=[1;1;1;1]
88     ix=[b,(1-b),a,(1-a),c,d];
89     iy=[a,a,c,d,b,(1-b)];
90     indx=ones(1,nc) .*. (ones(1,nl).*.ix +(1:2:2*nl-1).*.ones(ix));
91     iy=matrix(iy,24,1);
92     //indy=(ones(1,nl).*.iy+(1:2:2*nl-1).*.ones(iy)) .*. ones(1,nc);
93     indy=(ones(1,nc).*.iy+(1:2:2*nc-1).*.ones(iy)) .*. ones(1,nl);
94     indy=matrix(indy,4,6*nc*nl);
95     [nnl,nnc]=size(indx);
96
97     xx=matrix(x(matrix(indx,1,nnl*nnc)),nnl,nnc);
98     yy=matrix(y(matrix(indy,1,nnl*nnc)),nnl,nnc);
99     f = matrix(f,1,-1);
100     zz = f.*.[c,d,b,b,a,a];
101     // bars with f < 0 => faces orientation must be inverted:
102     f = f .*.ones(4,6);
103     b = f<0
104     zz(b) = f(b) - zz(b)
105
106     if ~isdef("ebox","local") then ebox = bnds; else "ebox = ebox"; end;
107     plot3d(xx,yy,zz,def(1),def(2),def(3),def(4),ebox)
108
109 endfunction
110