/*
* RapidMiner
*
* Copyright (C) 2001-2011 by Rapid-I and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapid-i.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package com.rapidminer.gui.plotter.charts;
import java.awt.BasicStroke;
import java.awt.Graphics2D;
import java.awt.Stroke;
import java.awt.geom.Rectangle2D;
import java.util.Iterator;
import java.util.List;
import org.jfree.chart.axis.SymbolAxis;
import org.jfree.chart.axis.ValueTick;
import org.jfree.ui.RectangleEdge;
import com.rapidminer.gui.plotter.PlotterAdapter;
import com.rapidminer.tools.math.MathFunctions;
/**
* This symbol axis draws a yellowisch background according to the axis weight.
*
* @author Ingo Mierswa
*/
public class WeightBasedSymbolAxis extends SymbolAxis {
private static final long serialVersionUID = -2836199514919011137L;
private double[] weights;
private double maxWeight;
public WeightBasedSymbolAxis(String name, String[] symbols, double[] weights) {
super(name, symbols);
this.weights = weights;
for (double d : weights) {
maxWeight = MathFunctions.robustMax(Math.abs(d), maxWeight);
}
}
/**
* Draws the grid bands for the axis when it is at the top or bottom of
* the plot.
*
* @param g2 the graphics device.
* @param drawArea the area within which the chart should be drawn.
* @param plotArea the area within which the plot should be drawn (a
* subset of the drawArea).
* @param firstGridBandIsDark True: the first grid band takes the
* color of <CODE>gridBandPaint<CODE>.
* False: the second grid band takes the
* color of <CODE>gridBandPaint<CODE>.
* @param ticks a list of ticks.
*/
@Override
protected void drawGridBandsVertical(Graphics2D g2,
Rectangle2D drawArea,
Rectangle2D plotArea,
boolean firstGridBandIsDark,
List ticks) {
double xx = plotArea.getX();
double yy1, yy2;
//gets the outline stroke width of the plot
double outlineStrokeWidth;
Stroke outlineStroke = getPlot().getOutlineStroke();
if (outlineStroke != null && outlineStroke instanceof BasicStroke) {
outlineStrokeWidth = ((BasicStroke) outlineStroke).getLineWidth();
}
else {
outlineStrokeWidth = 1d;
}
Iterator iterator = ticks.iterator();
ValueTick tick;
Rectangle2D band;
while (iterator.hasNext()) {
tick = (ValueTick) iterator.next();
int weightIndex = (int)tick.getValue();
yy1 = valueToJava2D(tick.getValue() + 0.5d, plotArea,
RectangleEdge.LEFT);
yy2 = valueToJava2D(tick.getValue() - 0.5d, plotArea,
RectangleEdge.LEFT);
g2.setColor(PlotterAdapter.getWeightColor(this.weights[weightIndex], this.maxWeight));
band = new Rectangle2D.Double(xx + outlineStrokeWidth, yy1,
plotArea.getMaxX() - xx - outlineStrokeWidth, yy2 - yy1);
g2.fill(band);
}
g2.setPaintMode();
}
/**
* Draws the grid bands for the axis when it is at the top or bottom of
* the plot.
*
* @param g2 the graphics device.
* @param plotArea the area within which the chart should be drawn.
* @param dataArea the area within which the plot should be drawn
* (a subset of the drawArea).
* @param firstGridBandIsDark True: the first grid band takes the
* color of <CODE>gridBandPaint<CODE>.
* False: the second grid band takes the
* color of <CODE>gridBandPaint<CODE>.
* @param ticks the ticks.
*/
@Override
protected void drawGridBandsHorizontal(Graphics2D g2,
Rectangle2D plotArea,
Rectangle2D dataArea,
boolean firstGridBandIsDark,
List ticks) {
double yy = dataArea.getY();
double xx1, xx2;
//gets the outline stroke width of the plot
double outlineStrokeWidth;
if (getPlot().getOutlineStroke() != null) {
outlineStrokeWidth
= ((BasicStroke) getPlot().getOutlineStroke()).getLineWidth();
}
else {
outlineStrokeWidth = 1d;
}
Iterator iterator = ticks.iterator();
ValueTick tick;
Rectangle2D band;
while (iterator.hasNext()) {
tick = (ValueTick) iterator.next();
int weightIndex = (int)tick.getValue();
xx1 = valueToJava2D(tick.getValue() - 0.5d, dataArea,
RectangleEdge.BOTTOM);
xx2 = valueToJava2D(tick.getValue() + 0.5d, dataArea,
RectangleEdge.BOTTOM);
g2.setColor(PlotterAdapter.getWeightColor(this.weights[weightIndex], this.maxWeight));
band = new Rectangle2D.Double(xx1, yy + outlineStrokeWidth,
xx2 - xx1, dataArea.getMaxY() - yy - outlineStrokeWidth);
g2.fill(band);
}
g2.setPaintMode();
}
}