Chris@108
|
1 module yetilab.plot.plot;
|
Chris@108
|
2
|
Chris@108
|
3 import org.jzy3d.plot3d.builder: Mapper;
|
Chris@119
|
4 import org.jzy3d.maths: Range, Coord3d;
|
Chris@126
|
5 import org.jzy3d.plot3d.primitives: Shape, HistogramBar, FlatLine2d, Polygon, Quad, Point;
|
Chris@119
|
6 import org.jzy3d.plot3d.primitives.axes.layout.providers: StaticTickProvider;
|
Chris@119
|
7 import org.jzy3d.plot3d.primitives.axes.layout.renderers: TickLabelMap;
|
Chris@108
|
8 import org.jzy3d.chart: Chart, ChartLauncher;
|
Chris@108
|
9 import org.jzy3d.plot3d.builder: Builder;
|
Chris@108
|
10 import org.jzy3d.plot3d.builder.concrete: OrthonormalGrid;
|
Chris@108
|
11 import org.jzy3d.colors.colormaps: ColorMapRainbow;
|
Chris@119
|
12 import org.jzy3d.colors: ColorMapper, Color;
|
Chris@108
|
13 import org.jzy3d.plot3d.rendering.canvas: Quality;
|
Chris@119
|
14 import org.jzy3d.plot3d.rendering.view.modes: ViewPositionMode;
|
Chris@108
|
15
|
Chris@108
|
16 newMatrixMapper matrix =
|
Chris@108
|
17 (class MMapper extends Mapper
|
Chris@108
|
18 double f(double x, double y)
|
Chris@117
|
19 result = matrix.getAt y x;
|
Chris@117
|
20 println "f(\(x),\(y)) -> \(result)";
|
Chris@117
|
21 result
|
Chris@108
|
22 end;
|
Chris@108
|
23 new MMapper());
|
Chris@108
|
24
|
Chris@108
|
25 newMatrixLogMapper matrix =
|
Chris@108
|
26 (class MMapper extends Mapper
|
Chris@108
|
27 double f(double x, double y)
|
Chris@108
|
28 ln (matrix.getAt y x)
|
Chris@108
|
29 end;
|
Chris@108
|
30 new MMapper());
|
Chris@108
|
31
|
Chris@108
|
32 newMapper mapFunction =
|
Chris@108
|
33 (class FMapper extends Mapper
|
Chris@108
|
34 double f(double x, double y)
|
Chris@108
|
35 mapFunction x y
|
Chris@108
|
36 end;
|
Chris@108
|
37 new FMapper());
|
Chris@108
|
38
|
Chris@115
|
39 plotMatrix matrix =
|
Chris@117
|
40 (mapper = newMatrixMapper matrix;
|
Chris@108
|
41 size = matrix.size;
|
Chris@119
|
42 xrange = new Range(0, size.columns - 1);
|
Chris@119
|
43 yrange = new Range(0, size.rows - 1);
|
Chris@108
|
44 grid = new OrthonormalGrid(xrange, size.columns, yrange, size.rows);
|
Chris@112
|
45 println "Matrix size: \(size)";
|
Chris@117
|
46 surface = Builder#buildOrthonormal(grid, mapper); //??? big?
|
Chris@117
|
47 println "Z Bounds: \(surface#getBounds()#getZmin()) -> \(surface#getBounds()#getZmax())";
|
Chris@121
|
48 surface#setFaceDisplayed(true);
|
Chris@108
|
49 surface#setWireframeDisplayed(true);
|
Chris@108
|
50 surface#setWireframeColor(Color#BLACK);
|
Chris@112
|
51 // chart = new Chart(Quality#Fastest, "swing");
|
Chris@112
|
52 chart = new Chart(Quality#Nicest);
|
Chris@108
|
53 chart#getScene()#getGraph()#add(surface);
|
Chris@115
|
54 ChartLauncher#openChart(chart);
|
Chris@115
|
55 ());
|
Chris@108
|
56
|
Chris@119
|
57 plotBarChart keys unit values =
|
Chris@119
|
58 (chart = new Chart(Quality#Nicest);
|
Chris@119
|
59 var n = 0;
|
Chris@119
|
60 scene = chart#getScene();
|
Chris@119
|
61 ticks = new float[length keys];
|
Chris@119
|
62 tickLabels = new TickLabelMap();
|
Chris@119
|
63 for keys do k:
|
Chris@119
|
64 bar = new HistogramBar();
|
Chris@119
|
65 bar#setData(new Coord3d(n, 0, 0), values[k], 0.45, Color#random());
|
Chris@119
|
66 bar#setWireframeDisplayed(false);
|
Chris@119
|
67 scene#add(bar);
|
Chris@119
|
68 ticks[n] := n;
|
Chris@119
|
69 tickLabels#register(n, k);
|
Chris@119
|
70 n := n + 1;
|
Chris@119
|
71 done;
|
Chris@119
|
72 chart#getView()#setViewPoint(new Coord3d(pi/2, 0, 0));
|
Chris@119
|
73 axes = chart#getAxeLayout();
|
Chris@119
|
74 axes#setXAxeLabelDisplayed(false);
|
Chris@119
|
75 axes#setYAxeLabelDisplayed(false);
|
Chris@119
|
76 axes#setZAxeLabelDisplayed(true);
|
Chris@119
|
77 axes#setZAxeLabel(unit);
|
Chris@119
|
78 axes#setXTickProvider(new StaticTickProvider(ticks));
|
Chris@119
|
79 axes#setXTickRenderer(tickLabels);
|
Chris@119
|
80 axes#setYTickLabelDisplayed(false);
|
Chris@119
|
81 ChartLauncher#openChart(chart);
|
Chris@119
|
82 ());
|
Chris@119
|
83
|
Chris@124
|
84 plotLines xkeys unit values =
|
Chris@124
|
85 (chart = new Chart(Quality#Nicest);
|
Chris@124
|
86 scene = chart#getScene();
|
Chris@124
|
87 keys = keys values;
|
Chris@124
|
88 n = length xkeys;
|
Chris@124
|
89 var z = 0;
|
Chris@124
|
90 for keys do k:
|
Chris@124
|
91 v = values[k];
|
Chris@124
|
92 x = new float[n];
|
Chris@124
|
93 y = new float[n];
|
Chris@124
|
94 var i = 0;
|
Chris@124
|
95 for xkeys do xk:
|
Chris@124
|
96 x[i] := i;
|
Chris@124
|
97 y[i] := if xk in v then v[xk] else 0 fi;
|
Chris@124
|
98 i := i + 1;
|
Chris@124
|
99 done;
|
Chris@124
|
100 line = new FlatLine2d(x, y, z);
|
Chris@124
|
101 line#setWireframeDisplayed(true);
|
Chris@124
|
102 line#setWireframeColor(Color#random());
|
Chris@124
|
103 line#setWireframeWidth(2);
|
Chris@124
|
104 line#setFaceDisplayed(false);
|
Chris@124
|
105 scene#add(line);
|
Chris@124
|
106 z := z + 1;
|
Chris@124
|
107 done;
|
Chris@124
|
108 chart#getView()#setViewPoint(new Coord3d(0, 0, 0));
|
Chris@124
|
109 axes = chart#getAxeLayout();
|
Chris@124
|
110 axes#setXAxeLabelDisplayed(false);
|
Chris@124
|
111 axes#setYAxeLabelDisplayed(false);
|
Chris@124
|
112 axes#setZAxeLabelDisplayed(true);
|
Chris@124
|
113 axes#setZAxeLabel(unit);
|
Chris@124
|
114 axes#setYTickLabelDisplayed(false);
|
Chris@124
|
115 ChartLauncher#openChart(chart);
|
Chris@124
|
116 ());
|
Chris@124
|
117
|
Chris@125
|
118 stack keys xkeys values =
|
Chris@125
|
119 (stacked = mapIntoHash id \(mapIntoHash id \0 xkeys) keys;
|
Chris@125
|
120 prev = mapIntoHash id \0 xkeys;
|
Chris@125
|
121 for xkeys do xk:
|
Chris@125
|
122 for keys do k:
|
Chris@125
|
123 value = if xk in values[k] then values[k][xk] else 0 fi;
|
Chris@125
|
124 height = prev[xk] + value;
|
Chris@125
|
125 stacked[k][xk] := height;
|
Chris@125
|
126 prev[xk] := height;
|
Chris@125
|
127 done;
|
Chris@125
|
128 done;
|
Chris@125
|
129 stacked);
|
Chris@125
|
130
|
Chris@125
|
131 plotStacked keys xkeys unit values =
|
Chris@125
|
132 (chart = new Chart(Quality#Nicest);
|
Chris@125
|
133 scene = chart#getScene();
|
Chris@125
|
134 stacked = stack keys xkeys values;
|
Chris@125
|
135 var z = 0;
|
Chris@126
|
136 newRect x height z colour is number -> number -> number -> ~Color -> 'a =
|
Chris@126
|
137 (poly = new Quad();
|
Chris@126
|
138 poly#add(new Point(new Coord3d(x + 0.5, z, 0)));
|
Chris@126
|
139 poly#add(new Point(new Coord3d(x + 0.5, z, height)));
|
Chris@126
|
140 poly#add(new Point(new Coord3d(x - 0.5, z, height)));
|
Chris@126
|
141 poly#add(new Point(new Coord3d(x - 0.5, z, 0)));
|
Chris@126
|
142 poly#setWireframeDisplayed(true);
|
Chris@126
|
143 poly#setWireframeColor(colour);
|
Chris@126
|
144 poly#setFaceDisplayed(true);
|
Chris@126
|
145 poly#setColor(colour);
|
Chris@126
|
146 poly);
|
Chris@125
|
147 for keys do k:
|
Chris@125
|
148 heights = stacked[k];
|
Chris@125
|
149 var x = 0;
|
Chris@126
|
150 c = Color#random();
|
Chris@125
|
151 for xkeys do xk:
|
Chris@126
|
152 poly = newRect x heights[xk] z c;
|
Chris@126
|
153 scene#add(poly);
|
Chris@125
|
154 x := x + 1;
|
Chris@125
|
155 done;
|
Chris@126
|
156 z := z - 1;
|
Chris@125
|
157 done;
|
Chris@126
|
158 // chart#getView()#setViewPoint(new Coord3d(0, 0, 0));
|
Chris@125
|
159 axes = chart#getAxeLayout();
|
Chris@125
|
160 axes#setXAxeLabelDisplayed(false);
|
Chris@125
|
161 axes#setYAxeLabelDisplayed(false);
|
Chris@125
|
162 axes#setZAxeLabelDisplayed(true);
|
Chris@125
|
163 axes#setZAxeLabel(unit);
|
Chris@125
|
164 axes#setYTickLabelDisplayed(false);
|
Chris@125
|
165 ChartLauncher#openChart(chart);
|
Chris@125
|
166 ());
|
Chris@124
|
167
|
Chris@110
|
168 plotStructure structure =
|
Chris@110
|
169 case structure of
|
Chris@110
|
170 Grid matrix:
|
Chris@115
|
171 plotMatrix matrix;
|
Chris@110
|
172 //!!!
|
Chris@110
|
173 _: failWith "Cannot plot this structure (only grids implemented so far)";
|
Chris@110
|
174 esac;
|
Chris@108
|
175
|
Chris@115
|
176 {
|
Chris@119
|
177 newMatrixMapper,
|
Chris@119
|
178 newMatrixLogMapper,
|
Chris@119
|
179 newMapper,
|
Chris@115
|
180 plotMatrix,
|
Chris@124
|
181 plotBarChart,
|
Chris@124
|
182 plotLines,
|
Chris@125
|
183 stack,
|
Chris@125
|
184 plotStacked,
|
Chris@119
|
185 plotStructure,
|
Chris@115
|
186 }
|
Chris@110
|
187
|