Irregular chart generation (Code attached)

A discussion forum for JFreeChart (a 2D chart library for the Java platform).
Locked
kanishk
Posts: 10
Joined: Mon May 01, 2006 2:57 am

Irregular chart generation (Code attached)

Post by kanishk » Thu Aug 24, 2006 2:30 am

Hello,
Given below is code of the 2 classes being used. The output image for both the methods is coming out different. I am unable to figure out why? Please suggest.

Thanks,
Kanishk

Code: Select all

import java.awt.Color;
import java.awt.Font;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.Vector;

import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.CombinedDomainCategoryPlot;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

/**
 * 
 * 
 * @author Kanishk Panwar
 */
public class ImageEngine {

	private static int index = 0;

	Vector readings[][] = null;

	int moteId;

	Vector reading[] = null;

	/**
	 * for single mote
	 * 
	 * @param reading
	 * @param moteId
	 */
	public ImageEngine(Vector reading[][], int moteId) {

		this.readings = reading;
		this.moteId = moteId;

	}

	/**
	 * 
	 * @param reading
	 */
	public ImageEngine(Vector reading[]) {

		this.reading = reading;

	}

	/**
	 * 
	 * @param reading
	 * @return
	 */
	public JFreeChart averageReadingImage() throws IOException {

		if (reading == null)
			return null;

		CategoryAxis domainAxis = new CategoryAxis("Readings");
		CombinedDomainCategoryPlot plot = new CombinedDomainCategoryPlot(
				domainAxis);
		MyDrawingSupplier mySupplier = new MyDrawingSupplier();
		plot.setDrawingSupplier(mySupplier);

		JFreeChart result = new JFreeChart("Current Status of Sensor Network",
				new Font("SansSerif", Font.BOLD, 16), plot, true);

		NumberAxis rangeAxis1 = new NumberAxis("Value");
		rangeAxis1.setUpperBound(getMax(reading[1])+10);
		
		rangeAxis1.setStandardTickUnits(NumberAxis.createStandardTickUnits());
		// LineAndShapeRenderer renderer1 = new LineAndShapeRenderer();
		MyRenderer renderer1 = new MyRenderer();
		
		renderer1.setItemLabelsVisible(true);
		renderer1
				.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());

		renderer1
				.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		renderer1.setItemLabelsVisible(true);

		CategoryPlot temperature = new CategoryPlot(getDataset("Temperature"),
				null, rangeAxis1, renderer1);
		temperature.setDomainGridlinesVisible(true);

		NumberAxis rangeAxis2 = new NumberAxis("Value");
		rangeAxis2.setUpperBound(getMax(reading[0])+20);
		rangeAxis2.setAutoRangeIncludesZero(false);
		rangeAxis2.setStandardTickUnits(NumberAxis.createStandardTickUnits());
		MyRenderer renderer2 = new MyRenderer();
		renderer2
				.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());

		renderer2
				.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		renderer2.setItemLabelsVisible(true);

		CategoryPlot humidity = new CategoryPlot(getDataset("Humidity"), null,
				rangeAxis2, renderer2);
		humidity.setDomainGridlinesVisible(true);

		NumberAxis rangeAxis3 = new NumberAxis("Value");
		rangeAxis3.setUpperBound(getMax(reading[2])+10);
		rangeAxis3.setStandardTickUnits(NumberAxis.createStandardTickUnits());
		MyRenderer renderer3 = new MyRenderer();
		renderer3
				.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());

		renderer3
				.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		renderer3.setItemLabelsVisible(true);

		CategoryPlot light = new CategoryPlot(getDataset("Light"), null,
				rangeAxis3, renderer3);
		light.setDomainGridlinesVisible(true);

		NumberAxis rangeAxis4 = new NumberAxis("Value");
		rangeAxis4.setStandardTickUnits(NumberAxis.createStandardTickUnits());
		MyRenderer renderer4 = new MyRenderer();
		renderer4
				.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());

		renderer4
				.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		renderer4.setItemLabelsVisible(true);

		renderer4.setSeriesFillPaint(3, Color.BLACK);
		rangeAxis4.setUpperBound(getMax(reading[3])+10); 
		
		CategoryPlot power = new CategoryPlot(getDataset("Power"), null,
				rangeAxis4, renderer4);
		power.setDomainGridlinesVisible(true);

		plot.add(temperature, 1);
		plot.add(humidity, 1);
		plot.add(light, 1);
		plot.add(power, 1);

		ChartUtilities.saveChartAsJPEG(new File("c:\\sys.jpg"), result, 600,
				800);

		return result;

	}

	/**
	 * 
	 * @param reading
	 * @param moteId
	 * @return
	 * @throws IOException
	 */
	public JFreeChart currentMoteReadingImage() throws IOException {

		CategoryAxis domainAxis = new CategoryAxis("Readings");
		CombinedDomainCategoryPlot plot = new CombinedDomainCategoryPlot(
				domainAxis);
		MyDrawingSupplier mySupplier = new MyDrawingSupplier();
		plot.setDrawingSupplier(mySupplier);

		JFreeChart result = new JFreeChart("Current System Reading for MOTE# "
				+ moteId, new Font("SansSerif", Font.BOLD, 16), plot, true);

		NumberAxis rangeAxis1 = new NumberAxis("Value");
		rangeAxis1.setStandardTickUnits(NumberAxis.createStandardTickUnits());
		rangeAxis1.setUpperBound(getMax(readings[0][1])+10);
		// LineAndShapeRenderer renderer1 = new LineAndShapeRenderer();
		MyRenderer renderer1 = new MyRenderer(WSNUtil
				.vectorToBoolean(readings[1][1]));
		renderer1
				.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());
		renderer1
				.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		renderer1.setItemLabelsVisible(true);
		CategoryPlot temperature = new CategoryPlot(getDataset("Temperature"),
				null, rangeAxis1, renderer1);
		temperature.setDomainGridlinesVisible(true);
		renderer1.setUseFillPaint(true);
		renderer1.setUseOutlinePaint(true);

		NumberAxis rangeAxis2 = new NumberAxis("Value");
		rangeAxis2.setStandardTickUnits(NumberAxis.createStandardTickUnits());
		rangeAxis1.setUpperBound(getMax(readings[0][0])+20);
		MyRenderer renderer2 = new MyRenderer(WSNUtil
				.vectorToBoolean(readings[1][0]));
		renderer2
				.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());
		renderer2
				.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		renderer2.setItemLabelsVisible(true);
		CategoryPlot humidity = new CategoryPlot(getDataset("Humidity"), null,
				rangeAxis2, renderer2);
		humidity.setDomainGridlinesVisible(true);
		renderer2.setUseFillPaint(true);
		renderer2.setUseOutlinePaint(true);

		NumberAxis rangeAxis3 = new NumberAxis("Value");
		rangeAxis3.setStandardTickUnits(NumberAxis.createStandardTickUnits());
		rangeAxis1.setUpperBound(getMax(readings[0][2])+10);
		MyRenderer renderer3 = new MyRenderer(WSNUtil
				.vectorToBoolean(readings[1][2]));
		renderer3
				.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());
		renderer3
				.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		renderer3.setItemLabelsVisible(true);
		CategoryPlot light = new CategoryPlot(getDataset("Light"), null,
				rangeAxis3, renderer3);
		light.setDomainGridlinesVisible(true);
		renderer3.setUseFillPaint(true);
		renderer3.setUseOutlinePaint(true);

		NumberAxis rangeAxis4 = new NumberAxis("Value");
		rangeAxis4.setStandardTickUnits(NumberAxis.createStandardTickUnits());
		rangeAxis1.setUpperBound(getMax(readings[0][3])+10);
		MyRenderer renderer4 = new MyRenderer(WSNUtil
				.vectorToBoolean(readings[1][3]));
		renderer4
				.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());
		renderer4
				.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
		renderer4.setItemLabelsVisible(true);
		renderer4.setSeriesFillPaint(3, Color.BLACK);
		CategoryPlot power = new CategoryPlot(getDataset("Power"), null,
				rangeAxis4, renderer4);
		power.setDomainGridlinesVisible(true);
		renderer4.setUseFillPaint(true);
		renderer4.setUseOutlinePaint(true);

		plot.add(temperature, 1);
		plot.add(humidity, 1);
		plot.add(light, 1);
		plot.add(power, 1);

		ChartUtilities.saveChartAsJPEG(new File("c:\\a.jpg"), result, 600, 800);

		return result;
	}

	/**
	 * 
	 * @param reading
	 * @param moteId
	 * @return
	 */
	public BufferedImage getChartAsBufferedImage() {

		try {
			return currentMoteReadingImage().createBufferedImage(600, 800);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 
	 * @param reading
	 * @return
	 */
	private CategoryDataset getDataset(String type) {

		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		Double myReading[] = null;
		Vector[] temp = null;

		if (reading == null) {

			temp = new Vector[4];
			temp[0] = readings[0][0];
			temp[1] = readings[0][1];
			temp[2] = readings[0][2];
			temp[3] = readings[0][3];

		} else {

			temp = reading;
		}

		if (type.equals("Temperature"))
			myReading = WSNUtil.vectorToDouble(temp[1]);

		if (type.equals("Humidity"))
			myReading = WSNUtil.vectorToDouble(temp[0]);

		if (type.equals("Light"))
			myReading = WSNUtil.vectorToDouble(temp[2]);

		if (type.equals("Power"))
			myReading = WSNUtil.vectorToDouble(temp[3]);

		for (int i = 0; i < myReading.length; i++) {
			dataset.addValue(myReading[i].doubleValue(), type, new Integer(i)
					.toString());
		}

		return dataset;
	}

	private double getMax(Vector data) {

		double val = 0d;
		double max = val;
		Iterator iter = data.iterator();

		while (iter.hasNext()) {
			val = ((Double) iter.next()).doubleValue();
			
			if (val > max)
				max = val;
		}
		System.out.println(max);
		return max;
	}

	/**
	 * 
	 * @param args
	 */
	public static void main(String[] args) {

		Vector[][] temp = new Vector[2][4];
		temp[0][0] = new Vector();
		temp[0][1] = new Vector();
		temp[0][2] = new Vector();
		temp[0][3] = new Vector();
		
		temp[1][0] = new Vector();
		temp[1][1] = new Vector();
		temp[1][2] = new Vector();
		temp[1][3] = new Vector();
		
		temp[0][0].add(new Double(80.24));
		temp[0][0].add(new Double(80.25));
		temp[0][0].add(new Double(80.26));
		temp[0][0].add(new Double(80.24));
		temp[0][0].add(new Double(90.94));

		temp[0][1].add(new Double(49.46));
		temp[0][1].add(new Double(49.40));
		temp[0][1].add(new Double(49.23));
		temp[0][1].add(new Double(49.85));
		temp[0][1].add(new Double(49.05));

		temp[0][2].add(new Double(3.4));
		temp[0][2].add(new Double(3.1));
		temp[0][2].add(new Double(3.1));
		temp[0][2].add(new Double(3.2));
		temp[0][2].add(new Double(3.0));

		temp[0][3].add(new Double(3.4));
		temp[0][3].add(new Double(3.1));
		temp[0][3].add(new Double(3.8));
		temp[0][3].add(new Double(3.1));
		temp[0][3].add(new Double(3.2));

		
		for(int i=0;i<5;i++) {
			
			temp[1][0].add(new Boolean(true));
			temp[1][1].add(new Boolean(true));
			temp[1][2].add(new Boolean(true));
			temp[1][3].add(new Boolean(true));
		}
		
		try {
			new ImageEngine(temp,1).currentMoteReadingImage();
		} catch (Throwable e) {
			e.printStackTrace();
		}
		

		Vector[] t = new Vector[4];
		t[0] = new Vector();
		t[1] = new Vector();
		t[2] = new Vector();
		t[3] = new Vector();

		t[0].add(new Double(80.24));
		t[0].add(new Double(80.25));
		t[0].add(new Double(80.26));
		t[0].add(new Double(80.24));
		t[0].add(new Double(90.94));

		t[1].add(new Double(49.46));
		t[1].add(new Double(49.40));
		t[1].add(new Double(49.23));
		t[1].add(new Double(49.85));
		t[1].add(new Double(49.05));

		t[2].add(new Double(3.4));
		t[2].add(new Double(3.1));
		t[2].add(new Double(3.1));
		t[2].add(new Double(3.2));

		t[3].add(new Double(3.4));
		t[3].add(new Double(3.1));
		t[3].add(new Double(3.1));
		t[3].add(new Double(3.2));

		try {
			new ImageEngine(t).averageReadingImage();
		} catch (Throwable e) {
			e.printStackTrace();
		}
		
	}
}

Code: Select all

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.geom.Rectangle2D;

import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.renderer.category.CategoryItemRendererState;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.CategoryDataset;

/**
 * 
 * 
 * @author Kanishk Panwar
 */
public class MyRenderer extends LineAndShapeRenderer {

	private Boolean[] anomaly;

	/**
	 * 
	 * @param anomaly
	 */
	public MyRenderer(Boolean[] anomaly) {

		super();
		this.anomaly = anomaly;
	}

	/**
	 * 
	 * 
	 */
	public MyRenderer() {

		this(null);
	}

	/**
	 * 
	 */
	public void drawItem(Graphics2D g2, CategoryItemRendererState state,
			Rectangle2D dataArea, CategoryPlot plot, CategoryAxis domainAxis,
			ValueAxis rangeAxis, CategoryDataset dataset, int row, int column,
			int pass) {

		super.drawItem(g2, state, dataArea, plot, domainAxis, rangeAxis,
				dataset, row, column, pass);
	}

	/**
	 * 
	 */
	public Paint getItemFillPaint(int series, int item) {

		if (anomaly == null)
			return super.getItemPaint(series, item);

		if (anomaly[item].booleanValue())
			return Color.BLACK;

		return super.getItemPaint(series, item);
	}

}

kanishk
Posts: 10
Joined: Mon May 01, 2006 2:57 am

Post by kanishk » Thu Aug 24, 2006 2:33 am

oops...
there is another class that you need.

Code: Select all

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Iterator;
import java.util.Vector;

public class WSNUtil {



	/**
	 * 
	 * @param v
	 * @return
	 */
	public static Boolean[] vectorToBoolean(Vector v) {

		Boolean[] arr = new Boolean[v.size()];

		Iterator iter = v.iterator();
		int i = 0;
		while (iter.hasNext()) {
			arr[i] = (Boolean) iter.next();
			i++;
		}
		return arr;
	}

	/**
	 * 
	 * @param v
	 * @return
	 */
	public static Double[] vectorToDouble(Vector v) {

		Double[] arr = new Double[v.size()];

		Iterator iter = v.iterator();
		int i = 0;
		while (iter.hasNext()) {
			arr[i] = (Double) iter.next();
			i++;
		}
		return arr;
	}

	/**
	 * 
	 * @param v
	 * @return
	 */
	public static String[] vectorToString(Vector v) {

		String[] arr = new String[v.size()];

		Iterator iter = v.iterator();
		int i = 0;
		while (iter.hasNext()) {
			arr[i] = (String) iter.next();
			i++;
		}
		return arr;
	}

}

Locked