annotate yetilab/plot/plot.yeti @ 128:c5dd12a15993

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