MATSIM
CountsSimRealPerHourGraph.java
Go to the documentation of this file.
1 /* *********************************************************************** *
2  * project: org.matsim.*
3  * CountsSimRealPerHourGraph.java
4  * *
5  * *********************************************************************** *
6  * *
7  * copyright : (C) 2007 by the members listed in the COPYING, *
8  * LICENSE and WARRANTY file. *
9  * email : info at matsim dot org *
10  * *
11  * *********************************************************************** *
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * See also COPYING, LICENSE and WARRANTY file *
18  * *
19  * *********************************************************************** */
20 
21 package org.matsim.counts.algorithms.graphs;
22 
23 import java.awt.Color;
24 import java.awt.Font;
25 import java.awt.geom.Ellipse2D;
26 import java.awt.geom.Rectangle2D;
27 import java.util.ArrayList;
28 import java.util.Collections;
29 import java.util.Iterator;
30 import java.util.List;
31 import java.util.Vector;
32 
33 import org.jfree.chart.ChartFactory;
34 import org.jfree.chart.JFreeChart;
35 import org.jfree.chart.annotations.XYTextAnnotation;
36 import org.jfree.chart.axis.LogarithmicAxis;
37 import org.jfree.chart.labels.CustomXYToolTipGenerator;
38 import org.jfree.chart.plot.PlotOrientation;
39 import org.jfree.chart.plot.XYPlot;
40 import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
41 import org.jfree.chart.urls.CustomXYURLGenerator;
42 import org.jfree.data.xy.DefaultXYDataset;
43 import org.jfree.data.xy.XYSeries;
44 import org.jfree.data.xy.XYSeriesCollection;
48 
49 public final class CountsSimRealPerHourGraph extends CountsGraph{
54  private int hour;
55 
56  public CountsSimRealPerHourGraph(final List<CountSimComparison> ccl, final int iteration, final String filename){
57  super(ccl, iteration, filename, filename);
58  }
59 
63  @Override
64  public JFreeChart createChart(final int hour) {
65  this.hour = hour;
66 
67  XYSeriesCollection dataset0=new XYSeriesCollection();
68  XYSeries series=new XYSeries("MATSim volumes");
69  // easier to use another dataset
70  XYSeriesCollection dataset_outliers=new XYSeriesCollection();
71  XYSeries series_outliers=new XYSeries("MATSim outliers");
72 
73  CustomXYURLGenerator url_gen=new CustomXYURLGenerator();
74  CustomXYToolTipGenerator tt_gen=new CustomXYToolTipGenerator();
75 
76  final ArrayList<String> urls = new ArrayList<String>();
77  final ArrayList<String> tooltips = new ArrayList<String>();
78  List<Comp> comps=new Vector<Comp>();
79 
80  Iterator<CountSimComparison> l_it = this.ccl_.iterator();
81  //int elementCounter=0;
82  while (l_it.hasNext()) {
83  CountSimComparison cc= l_it.next();
84 
85  /* values with simVal==0.0 or countVal==0.0 are drawn on the x==1 or/and y==1-line
86  * Such values are the result of a poor simulation run, but they can also represent
87  * a valid result (closing summer road during winter time)
88  *
89  */
90  if (cc.getHour()==hour) {
91  //elementCounter++;
92  double realVal=1.0;
93  double simVal=1.0;
94  if (cc.getCountValue()>0.0 && cc.getSimulationValue()>0.0) {
95  realVal = cc.getCountValue();
96  simVal=cc.getSimulationValue();
97  series.add(realVal,simVal);
98  comps.add(new Comp(realVal, "link"+cc.getId()+".html", "Link "+cc.getId()+"; " +
99  "Count: "+ realVal +", Sim: "+ simVal));
100  }
101  else {
102  realVal=Math.max(1.0, cc.getCountValue());
103  simVal=Math.max(1.0, cc.getSimulationValue());
104  series_outliers.add(realVal, simVal);
105  }
106 
107 
108  }//if
109  }//while
110  dataset0.addSeries(series);
111  dataset_outliers.addSeries(series_outliers);
112 
113 
114  /* first we have to sort the vector according to the rendering ordering
115  * (which is the x value).
116  * REALLY??? After hours of searching no better solution found!
117  * please help!
118  */
119 
120  Collections.sort(comps, new MyComparator());
121 
122  for (Iterator<Comp> iter = comps.iterator(); iter.hasNext();) {
123  Comp cp = iter.next();
124  urls.add(cp.getURL());
125  tooltips.add(cp.getTooltip());
126  }
127 
128  url_gen.addURLSeries(urls);
129  tt_gen.addToolTipSeries(tooltips);
130 
131  String title="Volumes " + (hour - 1) +":00 - "+ (hour) + ":00, Iteration: "+this.iteration_;
132  this.setChartTitle(title);
133  this.chart_ = ChartFactory.createXYLineChart(
134  title,
135  "Count Volumes [veh/h]", // x axis label
136  "Sim Volumes [veh/h]", // y axis label
137  dataset0, // data
138  PlotOrientation.VERTICAL,
139  false, // include legend
140  true, // tooltips
141  true // urls
142  );
143  XYPlot plot=this.chart_.getXYPlot();
144  final LogarithmicAxis axis_x = new LogarithmicAxis("Count Volumes [veh/h]");
145  final LogarithmicAxis axis_y = new LogarithmicAxis("Sim Volumes [veh/h]");
146  axis_x.setAllowNegativesFlag(false);
147  axis_y.setAllowNegativesFlag(false);
148 
149  //regular values
150  XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
151  renderer.setDefaultLinesVisible(false);
152  renderer.setURLGenerator(url_gen);
153  renderer.setSeriesPaint(0, Color.black);
154  renderer.setSeriesToolTipGenerator(0, tt_gen);
155  renderer.setSeriesShape(0, new Rectangle2D.Double(-1.5, -1.5, 3.0, 3.0));
156 
157 
158 
159  //outliers
160  XYLineAndShapeRenderer renderer2 = new XYLineAndShapeRenderer();
161  renderer2.setDefaultLinesVisible(false);
162  renderer2.setSeriesPaint(0, Color.red);
163  renderer2.setSeriesShape(0, new Ellipse2D.Double(-3.0, -3.0, 6.0, 6.0));
164 
165 
166 
167  // error band
168  DefaultXYDataset dataset1=new DefaultXYDataset();
169  dataset1.addSeries("f1x", new double[][] {{1.0, 10000.0},{1.0, 10000.0}});
170  dataset1.addSeries("f2x", new double[][] {{1.0, 10000.0},{2.0, 20000.0}});
171  dataset1.addSeries("f05x", new double[][] {{2.0, 10000.0},{1.0, 5000.0}});
172 
173  XYLineAndShapeRenderer renderer3 = new XYLineAndShapeRenderer();
174  renderer3.setDefaultShapesVisible(false);
175  renderer3.setSeriesPaint(0, Color.blue);
176  renderer3.setSeriesPaint(1, Color.blue);
177  renderer3.setSeriesPaint(2, Color.blue);
178  renderer3.setDefaultSeriesVisibleInLegend(false);
179  renderer3.setSeriesItemLabelsVisible(0, true);
180  renderer3.setSeriesItemLabelsVisible(1, false);
181  renderer3.setSeriesItemLabelsVisible(2, false);
182 
183  XYTextAnnotation annotation0=new XYTextAnnotation("2.0 count",12000.0, 15500.0);
184  annotation0.setFont(new Font("SansSerif", Font.BOLD, 11));
185  plot.addAnnotation(annotation0);
186  XYTextAnnotation annotation1=new XYTextAnnotation("count",13000.0, 10000.0);
187  annotation1.setFont(new Font("SansSerif", Font.BOLD, 11));
188  plot.addAnnotation(annotation1);
189  XYTextAnnotation annotation2=new XYTextAnnotation("0.5 count",11000.0, 3500.0);
190  annotation2.setFont(new Font("SansSerif", Font.BOLD, 11));
191  plot.addAnnotation(annotation2);
192 
193  plot.setDomainAxis(axis_x);
194  plot.setRangeAxis(axis_y);
195  plot.setRenderer(0, renderer);
196 
197  plot.setRenderer(1, renderer2);
198  plot.setDataset(1, dataset_outliers);
199 
200  plot.setRenderer(2, renderer3);
201  plot.setDataset(2, dataset1);
202 
203  plot.getRangeAxis().setRange(1.0, 19000.0);
204  plot.getDomainAxis().setRange(1.0, 19000.0);
205 
206  return this.chart_;
207  }//drawGraph
208 
209 
214  public int getHour() {
215  return this.hour;
216  }
217 }
218 
219 
CountsSimRealPerHourGraph(final List< CountSimComparison > ccl, final int iteration, final String filename)
void setChartTitle(final String chartTitle)