comparison gnv-artifacts/src/main/java/de/intevation/gnv/chart/AbstractXYLineChart.java @ 376:d8f3ef441bf2

merged gnv-artifacts/0.3
author Thomas Arendsen Hein <thomas@intevation.de>
date Fri, 28 Sep 2012 12:13:47 +0200
parents 2413273f1c13
children d41c155db337
comparison
equal deleted inserted replaced
293:6b0ef2324d02 376:d8f3ef441bf2
1 package de.intevation.gnv.chart;
2
3 import java.awt.Color;
4 import java.awt.geom.Ellipse2D;
5 import java.text.NumberFormat;
6 import java.util.Collection;
7 import java.util.Iterator;
8 import java.util.Locale;
9 import java.util.Map;
10
11 import org.apache.log4j.Logger;
12
13 import org.jfree.chart.JFreeChart;
14 import org.jfree.chart.ChartFactory;
15 import org.jfree.chart.axis.Axis;
16 import org.jfree.chart.axis.NumberAxis;
17 import org.jfree.chart.axis.NumberTickUnit;
18 import org.jfree.chart.axis.AxisLocation;
19 import org.jfree.chart.plot.PlotOrientation;
20 import org.jfree.chart.plot.XYPlot;
21 import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
22 import org.jfree.chart.title.TextTitle;
23 import org.jfree.data.xy.XYDataset;
24 import org.jfree.data.Range;
25 import org.jfree.data.general.Series;
26
27 import de.intevation.gnv.geobackend.base.Result;
28 import de.intevation.gnv.state.describedata.KeyValueDescibeData;
29
30
31 /**
32 * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
33 */
34 public abstract class AbstractXYLineChart
35 extends AbstractChart
36 {
37 public static final double LOWER_MARGIN = 0.05D;
38 public static final double UPPER_MARGIN = 0.05D;
39
40 private static Logger log = Logger.getLogger(AbstractXYLineChart.class);
41
42 protected static Color[] COLOR = {
43 Color.black, Color.red, Color.green, Color.blue, Color.yellow,
44 Color.gray, Color.orange, Color.pink, Color.cyan
45 };
46
47 protected static int nextColor = 0;
48
49 protected PlotOrientation PLOT_ORIENTATION = PlotOrientation.VERTICAL;
50
51 /** Map to store datasets for each parameter */
52 protected Map datasets;
53
54 /** Map to store max ranges of each parameter (axis.setAutoRange(true)
55 * doesn't seem to work */
56 protected Map ranges;
57
58 protected abstract void initData();
59 protected abstract void addValue(Result row, Series series);
60 protected abstract void addSeries(Series series, String label, int idx);
61 protected abstract void localizeDomainAxis(Axis axis, Locale locale);
62 protected abstract String createSeriesName(
63 String breakPoint1,
64 String breakPoint2,
65 String breakPoint3
66 );
67
68
69 public JFreeChart generateChart() {
70 log.debug("generate XYLineChart");
71 nextColor = 0;
72
73 if (chart != null)
74 return chart;
75
76 initChart();
77
78 chart.addSubtitle(new TextTitle(labels.getSubtitle()));
79
80 theme.apply(chart);
81 initData();
82
83 adjustPlot((XYPlot)chart.getPlot());
84
85 return chart;
86 }
87
88
89 protected void initChart() {
90 chart = ChartFactory.createXYLineChart(
91 labels.getTitle(),
92 labels.getDomainAxisLabel(),
93 null,
94 null,
95 PLOT_ORIENTATION,
96 true,
97 false,
98 false
99 );
100 }
101
102
103 protected void prepareAxis(String seriesKey, int idx) {
104 log.debug("prepare axis of xychart");
105
106 XYPlot plot = chart.getXYPlot();
107 Axis xAxis = plot.getDomainAxis();
108 NumberAxis yAxis = new NumberAxis(seriesKey);
109
110 localizeDomainAxis(xAxis, locale);
111 localizeRangeAxis(yAxis, locale);
112
113 // litte workarround to adjust the max range of axes.
114 // NumberAxis.setAutoRange(true) doesn't seem to work properly.
115 Range yRange = (Range) ranges.get(seriesKey);
116 yAxis.setRange(Range.expand(yRange, LOWER_MARGIN, UPPER_MARGIN));
117 log.debug("Max Range of dataset is: " + yRange.toString());
118
119 if (seriesKey.contains("richtung")) {
120 yAxis.setTickUnit(new NumberTickUnit(30.0));
121 yAxis.setUpperBound(360.0);
122 yAxis.setLowerBound(0.0);
123 }
124 else {
125 yAxis.setFixedDimension(10.0);
126 yAxis.setAutoRangeIncludesZero(false);
127 }
128
129 plot.setRangeAxis(idx, yAxis);
130 yAxis.configure();
131
132 if (idx % 2 != 0)
133 plot.setRangeAxisLocation(idx, AxisLocation.BOTTOM_OR_RIGHT);
134 else
135 plot.setRangeAxisLocation(idx, AxisLocation.BOTTOM_OR_LEFT);
136 }
137
138
139 protected void adjustRenderer(
140 int idx,
141 int seriesCount,
142 boolean renderLines,
143 boolean renderShapes
144 ) {
145 log.debug("Adjust render of series");
146 XYLineAndShapeRenderer renderer = null;
147 XYPlot plot = chart.getXYPlot();
148
149 try {
150 renderer = (XYLineAndShapeRenderer)((XYLineAndShapeRenderer)
151 (plot.getRenderer())).clone();
152 }
153 catch (CloneNotSupportedException cnse) {
154 log.warn("Error while cloning renderer.", cnse);
155 renderer = new XYLineAndShapeRenderer(renderLines, renderShapes);
156 renderer.setBaseShape(new Ellipse2D.Double(-2,-2,4,4));
157 }
158
159 for (int i = 0; i < seriesCount; i++) {
160 renderer.setSeriesShape(i, renderer.getSeriesShape(0));
161 renderer.setSeriesPaint(i, COLOR[nextColor%COLOR.length]);
162 renderer.setSeriesShapesVisible(i, renderShapes);
163 renderer.setSeriesLinesVisible(i, renderLines);
164 nextColor++;
165 }
166 plot.setRenderer(idx, renderer);
167 }
168
169
170 protected void adjustPlot(XYPlot plot) {
171 if (plot.getRangeAxisCount() > 1)
172 plot.setRangeGridlinesVisible(false);
173 }
174
175
176 protected void localizeRangeAxis(Axis axis, Locale locale) {
177 if (locale == null)
178 return;
179
180 log.debug(
181 "Set language of axis [" + axis.getLabel() + "] " +
182 "to " + locale.toString()
183 );
184
185 NumberFormat format = NumberFormat.getInstance(locale);
186 ((NumberAxis) axis).setNumberFormatOverride(format);
187 }
188
189
190 public Range getMaxRangeOfDataset(XYDataset dataset) {
191 int seriesCount = dataset.getSeriesCount();
192 double upper = Double.NEGATIVE_INFINITY;
193 double lower = Double.POSITIVE_INFINITY;
194
195 for (int i = 0; i < seriesCount; i++) {
196 int itemCount = dataset.getItemCount(i);
197
198 for (int j = 0; j < itemCount; j++) {
199 Number num = dataset.getY(i, j);
200
201 if (num != null) {
202 double y = num.doubleValue();
203 lower = y < lower ? y : lower;
204 upper = y > upper ? y : upper;
205 }
206 }
207 }
208
209 return new Range(lower, upper);
210 }
211
212
213 public Range getMaxRangeOfDatasetWithMargin(
214 XYDataset dataset,
215 double percent
216 ) {
217 Range range = getMaxRangeOfDataset(dataset);
218 double length = range.getLength();
219 double upper = range.getUpperBound() + length /100 * percent;
220 double lower = range.getLowerBound() - length /100 * percent;
221
222 return new Range(lower, upper);
223 }
224
225
226 protected String findParameter(String label) {
227 Iterator iter = parameters.iterator();
228
229 while (iter.hasNext()) {
230 KeyValueDescibeData data = (KeyValueDescibeData) iter.next();
231 String key = data.getValue();
232
233 if (label.indexOf(key) > -1)
234 return key;
235 }
236
237 return label;
238 }
239
240
241 protected String findValueTitle(Collection values, String id) {
242 log.debug("find description of dataset");
243
244 if (values != null){
245 Iterator it = values.iterator();
246 while (it.hasNext()) {
247 KeyValueDescibeData data = (KeyValueDescibeData) it.next();
248
249 if (id.equals(data.getKey()))
250 return data.getValue();
251 }
252 }
253 return "";
254 }
255
256
257 protected void storeMaxRange(double value, String parameter) {
258 Range range = null;
259
260 range = ranges.containsKey(parameter)
261 ? (Range) ranges.get(parameter)
262 : new Range(value, value);
263
264 double lower = range.getLowerBound();
265 double upper = range.getUpperBound();
266
267 lower = value < lower ? value : lower;
268 upper = value > upper ? value : upper;
269
270 ranges.put(parameter, new Range(lower, upper));
271 }
272 }
273 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org