URGENT - Making mass spectra - histogram bar width?

A discussion forum for JFreeChart (a 2D chart library for the Java platform).
Locked
dancraggs
Posts: 3
Joined: Wed Apr 30, 2008 3:40 am

URGENT - Making mass spectra - histogram bar width?

Post by dancraggs » Wed Apr 30, 2008 3:44 am

I'm trying to make a mass spectrometer application, and I need JFreeChart to display a graph similar to the one here:

Code: Select all

chemfacilities.chem.indiana.edu/facilities/masspec/images/centroid2.jpg
The bars need to be positioned wherever they need to be, and they should ideally always be 1px wide, even when zoomed.

I'm using a Histogram at the moment, but this produces wide bars. What options do I have, or is this not possible with JFreeChart?

Thanks in advance!

paradoxoff
Posts: 1634
Joined: Sat Feb 17, 2007 1:51 pm

Re: URGENT - Making mass spectra - histogram bar width?

Post by paradoxoff » Thu May 01, 2008 9:32 am

dancraggs wrote:

Code: Select all

chemfacilities.chem.indiana.edu/facilities/masspec/images/centroid2.jpg
Possibility one: write your own renderer that extends AbstractXYItemRenderer which draws for every xy-point a line from (x,0) to (x,y).
Possibility 2: Use an YIntervalRenderer and an IntervalXYDataset. See below. The given implementation of IntervalXYDataset takes the following factors into account:
a) The return values for getX(),getStartX and getEndX are the same.
b) The return value for getStartY() is always 0, getY() and getEnd(Y) have the same return value.
Regards, paradoxoff

Code: Select all

package mycharts;

import javax.swing.JFrame;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.YIntervalRenderer;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.data.xy.DefaultIntervalXYDataset;
import org.jfree.data.xy.DefaultXYDataset;
import org.jfree.data.xy.IntervalXYDataset;
import org.jfree.data.xy.XYDataset;

public class IntervalDemo{
	public IntervalDemo() {
        JFrame frame = new JFrame("Mass spec demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        DefaultYIntervalXYDataset set = new DefaultYIntervalXYDataset();
        set.addSeries("measured",new double[][]{{1.0,12.0,300.0},{13.0,148.0,69.0}});
        set.addSeries("calc",new double[][]{{1.4,12.4,300.4},{18.0,124.0,64.0}});
		XYPlot plot = new XYPlot(set,new NumberAxis("m/z"),new NumberAxis("Counts"),new YIntervalRenderer());
		JFreeChart chart = new JFreeChart(plot);
		frame.getContentPane().add(new ChartPanel(chart));
		frame.pack();
		frame.setVisible(true);
    }
    public static void main(String[] args){
    	IntervalDemo demo = new IntervalDemo();
    }
    class DefaultYIntervalXYDataset extends DefaultXYDataset implements IntervalXYDataset{
    	public DefaultYIntervalXYDataset(){
    		super();
    	}
    	public Number getStartX(int series,int item){
    		return super.getX(series,item);
    	}
    	public Number getEndX(int series,int item){
    		return super.getX(series,item);
    	}
    	public Number getStartY(int series,int item){
    		return 0;
    	}
    	public Number getEndY(int series,int item){
    		return super.getY(series,item);
    	}
    	public double getStartXValue(int series,int item){
    		return super.getXValue(series,item);
    	}
    	public double getEndXValue(int series,int item){
    		return super.getXValue(series,item);
    	}
    	public double getStartYValue(int series,int item){
    		return 0;
    	}
    	public double getEndYValue(int series,int item){
    		return super.getYValue(series,item);
    	}
    	
    	
    }
}

dancraggs
Posts: 3
Joined: Wed Apr 30, 2008 3:40 am

Post by dancraggs » Fri May 02, 2008 12:46 am

Wow, thanks for all those hints and especially the code, paradoxoff. I'll definitely go and have a look at that one now :)

Locked