Java tutorial
package org.jfree.chart.demo; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.JSlider; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.CompassFormat; import org.jfree.chart.axis.ModuloAxis; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.NumberTickUnit; import org.jfree.chart.axis.TickUnits; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYAreaRenderer; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.data.Range; import org.jfree.data.time.Minute; import org.jfree.data.time.RegularTimePeriod; import org.jfree.data.time.TimeSeries; import org.jfree.data.time.TimeSeriesCollection; import org.jfree.data.xy.XYDataset; import org.jfree.ui.ApplicationFrame; import org.jfree.ui.RefineryUtilities; public class CompassFormatDemo2 extends ApplicationFrame { private static final long serialVersionUID = 1L; private static class DemoPanel extends JPanel implements ChangeListener { private static final long serialVersionUID = 1L; private XYDataset createDirectionDataset(int i) { TimeSeriesCollection timeseriescollection = new TimeSeriesCollection(); TimeSeries timeseries = new TimeSeries("Wind Direction"); Object obj = new Minute(); double d = 0.0D; for (int j = 0; j < i; j++) { timeseries.add(((RegularTimePeriod) (obj)), d); obj = ((RegularTimePeriod) (obj)).next(); d += (Math.random() - 0.5D) * 15D; if (d < 0.0D) { d += 360D; continue; } if (d > 360D) d -= 360D; } timeseriescollection.addSeries(timeseries); return timeseriescollection; } private XYDataset createForceDataset(int i) { TimeSeriesCollection timeseriescollection = new TimeSeriesCollection(); TimeSeries timeseries = new TimeSeries("Wind Force"); Object obj = new Minute(); double d = 3D; for (int j = 0; j < i; j++) { timeseries.add(((RegularTimePeriod) (obj)), d); obj = ((RegularTimePeriod) (obj)).next(); d = Math.max(0.5D, d + (Math.random() - 0.5D) * 0.5D); } timeseriescollection.addSeries(timeseries); return timeseriescollection; } private JFreeChart createChart() { XYDataset xydataset = createDirectionDataset(100); JFreeChart jfreechart = ChartFactory.createTimeSeriesChart("Time", "Date", "Direction", xydataset, true, true, false); XYPlot xyplot = (XYPlot) jfreechart.getPlot(); xyplot.getDomainAxis().setLowerMargin(0.0D); xyplot.getDomainAxis().setUpperMargin(0.0D); rangeAxis = new ModuloAxis("Direction", new Range(0.0D, 360D)); TickUnits tickunits = new TickUnits(); tickunits.add(new NumberTickUnit(180D, new CompassFormat())); tickunits.add(new NumberTickUnit(90D, new CompassFormat())); tickunits.add(new NumberTickUnit(45D, new CompassFormat())); tickunits.add(new NumberTickUnit(22.5D, new CompassFormat())); rangeAxis.setStandardTickUnits(tickunits); XYLineAndShapeRenderer xylineandshaperenderer = new XYLineAndShapeRenderer(); xylineandshaperenderer.setBaseLinesVisible(false); xylineandshaperenderer.setBaseShapesVisible(true); xyplot.setRenderer(xylineandshaperenderer); xyplot.setRangeAxis(rangeAxis); rangeAxis.setDisplayRange(-45D, 45D); XYAreaRenderer xyarearenderer = new XYAreaRenderer(); NumberAxis numberaxis = new NumberAxis("Force"); numberaxis.setRange(0.0D, 12D); xyarearenderer.setSeriesPaint(0, new Color(0, 0, 255, 128)); xyplot.setDataset(1, createForceDataset(100)); xyplot.setRenderer(1, xyarearenderer); xyplot.setRangeAxis(1, numberaxis); xyplot.mapDatasetToRangeAxis(1, 1); return jfreechart; } public void stateChanged(ChangeEvent changeevent) { if (changeevent.getSource() == directionSlider) { direction = directionSlider.getValue(); rangeAxis.setDisplayRange(direction - degrees, direction + degrees); } else if (changeevent.getSource() == fieldSlider) { degrees = fieldSlider.getValue(); rangeAxis.setDisplayRange(direction - degrees, direction + degrees); } } private JSlider directionSlider; private JSlider fieldSlider; private ModuloAxis rangeAxis; private double direction; private double degrees; public DemoPanel() { super(new BorderLayout()); direction = 0.0D; degrees = 45D; JPanel jpanel = new JPanel(new GridLayout(1, 2)); fieldSlider = new JSlider(1, 10, 180, 45); fieldSlider.setPaintLabels(true); fieldSlider.setPaintTicks(true); fieldSlider.setMajorTickSpacing(10); fieldSlider.setMinorTickSpacing(5); fieldSlider.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); fieldSlider.addChangeListener(this); directionSlider = new JSlider(1, 0, 360, 0); directionSlider.setMajorTickSpacing(30); directionSlider.setMinorTickSpacing(5); directionSlider.setPaintLabels(true); directionSlider.setPaintTicks(true); directionSlider.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); directionSlider.setPaintTrack(true); directionSlider.addChangeListener(this); jpanel.add(fieldSlider); jpanel.add(directionSlider); JFreeChart jfreechart = createChart(); ChartPanel chartpanel = new ChartPanel(jfreechart); chartpanel.setPreferredSize(new Dimension(500, 270)); add(jpanel, "West"); add(chartpanel); } } public CompassFormatDemo2(String s) { super(s); setContentPane(new DemoPanel()); } public static JPanel createDemoPanel() { return new DemoPanel(); } public static void main(String args[]) { CompassFormatDemo2 compassformatdemo2 = new CompassFormatDemo2("Compass Format Demo 2"); compassformatdemo2.pack(); RefineryUtilities.centerFrameOnScreen(compassformatdemo2); compassformatdemo2.setVisible(true); } }