2package umontreal.ssj.charts;
5import org.jfree.data.general.DatasetChangeEvent;
6import org.jfree.data.statistics.HistogramBin;
7import org.jfree.data.statistics.HistogramType;
8import org.jfree.data.xy.AbstractIntervalXYDataset;
9import org.jfree.data.xy.IntervalXYDataset;
10import org.jfree.util.ObjectUtilities;
11import org.jfree.util.PublicCloneable;
45 implements IntervalXYDataset, Cloneable, PublicCloneable {
48 private List<Map> list;
58 list =
new ArrayList<Map>();
59 type = HistogramType.FREQUENCY;
77 throw new IllegalArgumentException(
"Null 'type' argument");
80 notifyListeners(
new DatasetChangeEvent(
this,
this));
92 public void addSeries(Comparable key,
double values[],
int bins) {
93 double minimum = getMinimum(values);
94 double maximum = getMaximum(values);
95 addSeries(key, values, bins, minimum, maximum);
106 public void addSeries(Comparable key,
double values[],
int numPoints,
int bins) {
107 double minimum = getMinimum(values);
108 double maximum = getMaximum(values);
109 addSeries(key, values, numPoints, bins, minimum, maximum);
124 public void addSeries(Comparable key,
double values[],
int bins,
double minimum,
double maximum) {
125 addSeries(key, values, values.length, bins, minimum, maximum);
142 public void addSeries(Comparable key,
double values[],
int numPoints,
int bins,
double minimum,
double maximum) {
144 throw new IllegalArgumentException(
"Null 'key' argument.");
146 throw new IllegalArgumentException(
"Null 'values' argument.");
148 throw new IllegalArgumentException(
"The 'bins' value must be at least 1.");
149 double binWidth = (maximum - minimum) / (
double) bins;
150 double lower = minimum;
151 final double EPS = 1.0e-15;
152 List<HistogramBin> binList =
new ArrayList<HistogramBin>(bins);
153 for (
int i = 0; i < bins; i++) {
156 bin =
new HistogramBin(lower, maximum * (1.0 + EPS));
158 double upper = minimum + (double) (i + 1) * binWidth;
159 bin =
new HistogramBin(lower, upper);
165 ArrayList<Double> valuesList =
new ArrayList<Double>(numPoints);
166 for (
int i = 0; i < numPoints; i++)
167 valuesList.add(Double.valueOf(values[i]));
169 synchronizeValuesAndBins(binList, valuesList);
170 Map map =
new HashMap();
172 map.put(
"values", valuesList);
173 map.put(
"bins", binList);
174 map.put(
"numPoints", Integer.valueOf(numPoints));
175 map.put(
"bin width", Double.valueOf(binWidth));
187 public void addSeries(Comparable key,
double values[], HistogramBin bins[]) {
188 addSeries(key, values, values.length, bins);
200 public void addSeries(Comparable key,
double values[],
int numPoints, HistogramBin bins[]) {
202 throw new IllegalArgumentException(
"Null 'key' argument.");
204 throw new IllegalArgumentException(
"Null 'values' argument.");
205 if (bins ==
null || bins.length < 2)
206 throw new IllegalArgumentException(
207 "The 'bins' table must contain at least 1 org.jfree.data.statistics.HistogramBin.");
208 List binList =
new ArrayList(bins.length);
209 for (
int i = 0; i < bins.length; i++)
210 binList.add(bins[i]);
212 ArrayList valuesList =
new ArrayList(numPoints);
213 for (
int i = 0; i < numPoints; i++)
214 valuesList.add(Double.valueOf(values[i]));
216 synchronizeValuesAndBins(binList, valuesList);
217 Map map =
new HashMap();
219 map.put(
"values", valuesList);
220 map.put(
"bins", binList);
221 map.put(
"numPoints", Integer.valueOf(numPoints));
222 map.put(
"bin width", Double.valueOf(-1D));
234 private double getMinimum(
double values[]) {
235 if (values ==
null || values.length < 1)
236 throw new IllegalArgumentException(
"Null or zero length 'values' argument.");
237 double min = 1.7E+308D;
238 for (
int i = 0; i < values.length; i++)
253 private double getMaximum(
double values[]) {
254 if (values ==
null || values.length < 1)
255 throw new IllegalArgumentException(
"Null or zero length 'values' argument.");
256 double max = -1.7E+308D;
257 for (
int i = 0; i < values.length; i++)
276 Map map = (Map) list.get(series);
277 return (List) map.get(
"bins");
291 double minimum = getMinimum(
getValues(series));
292 double maximum = getMaximum(
getValues(series));
293 setBins(series, bins, minimum, maximum);
308 public void setBins(
int series,
int bins,
double minimum,
double maximum) {
309 Map map = (Map) list.get(series);
310 List currentValues = (List) map.get(
"values");
311 double binWidth = (maximum - minimum) / (
double) bins;
312 double lower = minimum;
313 List binList =
new ArrayList(bins);
314 double EPS = 1.0e-15;
315 for (
int i = 0; i < bins; i++) {
318 bin =
new HistogramBin(lower, maximum * (1.0 + EPS));
320 double upper = minimum + (double) (i + 1) * binWidth;
321 bin =
new HistogramBin(lower, upper);
327 synchronizeValuesAndBins(binList, currentValues);
328 map.put(
"values", currentValues);
329 map.put(
"bins", binList);
342 public void setBins(
int series, HistogramBin bins[]) {
343 Map map = (Map) list.get(series);
344 List currentValues = (List) map.get(
"values");
345 ArrayList binList =
new ArrayList(bins.length);
346 for (
int i = 0; i < bins.length; i++)
347 binList.add(bins[i]);
349 synchronizeValuesAndBins(binList, currentValues);
350 map.put(
"values", currentValues);
351 map.put(
"bins", binList);
366 Map map = (Map) list.get(series);
367 return (List) map.get(
"values");
382 List valuesList = (List) ((Map) list.get(series)).get(
"values");
383 ListIterator iter = valuesList.listIterator();
384 double retour[] =
new double[valuesList.size()];
385 for (
int i = 0; iter.hasNext(); i++)
386 retour[i] = ((Double) iter.next()).doubleValue();
402 Map map = (Map) list.get(series);
403 List currentBins = (List) map.get(
"bins");
404 synchronizeValuesAndBins(currentBins, valuesList);
405 map.put(
"values", valuesList);
406 map.put(
"bins", currentBins);
420 ArrayList valuesList =
new ArrayList(values.length);
421 for (
int i = 0; i < values.length; i++)
422 valuesList.add(
new Double(values[i]));
424 setValues(series, ((List) (valuesList)));
433 private void synchronizeValuesAndBins(List bins, List values) {
434 ListIterator iterBins = bins.listIterator(0);
435 ListIterator iterValues = values.listIterator();
437 for (; iterBins.hasNext(); iterBins.set(
new HistogramBin(bin.getStartBoundary(), bin.getEndBoundary())))
438 bin = (HistogramBin) iterBins.next();
440 iterBins = bins.listIterator(0);
441 while (iterValues.hasNext()) {
442 double currentValue = ((Double) iterValues.next()).doubleValue();
443 boolean continu =
true;
444 iterBins = bins.listIterator(0);
445 while (continu && iterBins.hasNext()) {
446 HistogramBin tempBin = (HistogramBin) iterBins.next();
447 if (currentValue >= tempBin.getStartBoundary() && currentValue < tempBin.getEndBoundary()) {
448 tempBin.incrementCount();
463 Map map = (Map) list.get(series);
464 return ((Integer) map.get(
"numPoints")).intValue();
475 Map map = (Map) list.get(series);
476 return ((Double) map.get(
"bin width")).doubleValue();
500 Map map = (Map) list.get(series);
501 return (Comparable) map.get(
"key");
533 public Number
getX(
int series,
int item) {
535 HistogramBin bin = (HistogramBin) bins.get(item);
536 double x = (bin.getStartBoundary() + bin.getEndBoundary()) / 2D;
537 return new Double(x);
553 public Number
getY(
int series,
int item) {
555 HistogramBin bin = (HistogramBin) bins.get(item);
558 if (
type == HistogramType.FREQUENCY)
559 return new Double(bin.getCount());
560 if (
type == HistogramType.RELATIVE_FREQUENCY)
561 return new Double((
double) bin.getCount() / total);
562 if (
type == HistogramType.SCALE_AREA_TO_1)
563 return new Double((
double) bin.getCount() / (binWidth * total));
565 throw new IllegalStateException();
582 HistogramBin bin = (HistogramBin) bins.get(item);
583 return new Double(bin.getStartBoundary());
600 HistogramBin bin = (HistogramBin) bins.get(item);
601 return new Double(bin.getEndBoundary());
619 return getY(series, item);
637 return getY(series, item);
653 if (!ObjectUtilities.equal(
type, that.
type))
655 return ObjectUtilities.equal(list, that.list);
665 public Object
clone() throws CloneNotSupportedException {
666 return super.clone();
void addSeries(Comparable key, double values[], int numPoints, int bins, double minimum, double maximum)
Adds a series to the dataset.
void addSeries(Comparable key, double values[], int bins)
Adds a series to the dataset, using the specified number of bins.
int getSeriesCount()
Returns the number of series in the dataset.
void addSeries(Comparable key, double values[], HistogramBin bins[])
Adds a series to the dataset.
void setBins(int series, int bins, double minimum, double maximum)
Sets the bins for a series.
double[] getValues(int series)
Returns the values for a series.
Number getY(int series, int item)
Returns the y-value for a bin (calculated to take into account the histogram type).
double getBinWidth(int series)
Returns the bin width for a series.
void setType(HistogramType type)
Sets the histogram type and sends a DatasetChangeEvent to all registered listeners.
Object clone()
Returns a clone of the dataset.
void addSeries(Comparable key, double values[], int numPoints, int bins)
Adds a series to the dataset, using the specified number of bins.
Number getStartY(int series, int item)
Returns the start y-value for a bin (which is the same as the y-value).
HistogramType type
The histogram type.
Number getEndY(int series, int item)
Returns the end y-value for a bin (which is the same as the y-value).
boolean equals(Object obj)
Tests this dataset for equality with an arbitrary object.
List getBins(int series)
Returns the bins for a series.
Comparable getSeriesKey(int series)
Returns the key for a series.
List getValuesList(int series)
Returns the values for a series.
void setBins(int series, int bins)
Sets the bins for a series.
HistogramType getType()
Returns the histogram type.
void addSeries(Comparable key, double values[], int bins, double minimum, double maximum)
Adds a series to the dataset.
int getItemCount(int series)
Returns the number of data items for a series.
Number getEndX(int series, int item)
Returns the end value for a bin.
Number getStartX(int series, int item)
Returns the start value for a bin.
int getTotal(int series)
Returns the total number of observations for a series.
void addSeries(Comparable key, double values[], int numPoints, HistogramBin bins[])
Adds a series to the dataset.
void setValues(int series, List valuesList)
Sets the values for a series.
Number getX(int series, int item)
Returns the X value for a bin.
CustomHistogramDataset()
Creates a new (empty) dataset with a default type of HistogramType.FREQUENCY.
void setValues(int series, double values[])
Sets the values for a series.
void setBins(int series, HistogramBin bins[])
Sets the bins for a series.