
// DualAxisDemo.java
// http://www.java2s.com/Code/Java/Chart/JFreeChartDualAxisDemo2.htm
// Modified by Andrew Davison, ad@coe.psu.ac.th, Nov 2022

/* Two lines (with points) in a TimeSeries Chart, 
   with the data supplied in two TimeSeries
   but each line using a different y-axis.

   Neither y-axis starts at 0.

    Usage:
      > compile DualAxisDemo.java
      > run DualAxisDemo
*/


import java.awt.*;
import javax.swing.*;

import org.jfree.chart.*;
import org.jfree.chart.axis.*;
import org.jfree.chart.plot.*;
import org.jfree.chart.renderer.xy.*;

import org.jfree.data.time.*;
import org.jfree.data.xy.*;



public class DualAxisDemo extends JFrame
{

  public DualAxisDemo()
  {
    super("Dual Y-Axis Demo");

    // two time series collections are created
    XYDataset ds1 = createDataset1();
    XYDataset ds2 = createDataset2();

    JFreeChart chart = createChart(ds1, ds2);
    ChartPanel cp = new ChartPanel(chart);
    setContentPane(cp);

    // pack();
    setSize(800, 500);
    setResizable(false);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);
  }  // DualAxisDemo()


  private JFreeChart createChart(XYDataset ds1, XYDataset ds2)
  {
    JFreeChart chart = ChartFactory.createTimeSeriesChart(
             "Dual Y-Axis Demo", "Date", "LHS Price", ds1);

    XYPlot plot = chart.getXYPlot();

    // configure right hand side (RHS) y-axis
    NumberAxis axis2 = new NumberAxis("RHS Price");
    axis2.setAutoRangeIncludesZero(false);
    plot.setRangeAxis(1, axis2);   // '1' is the RHS of the plot
    plot.setDataset(1, ds2);
    plot.mapDatasetToRangeAxis(1, 1);  // '1' data set is the second collection


    // configure the default, LHS renderer
    XYItemRenderer renderer = plot.getRenderer();   // applied to ds1
    XYLineAndShapeRenderer rend = (XYLineAndShapeRenderer) renderer;
    rend.setSeriesShapesVisible(0, true);  
    rend.setSeriesShapesFilled(0, true);

    // RHS renderer
    XYLineAndShapeRenderer rend2 = new XYLineAndShapeRenderer();
    rend2.setSeriesPaint(0, Color.black);
    rend2.setSeriesShapesVisible(0, true);
    rend2.setSeriesShapesFilled(0, true);
    plot.setRenderer(1, rend2);  
               // rendering assigned to data on RHS (i.e. ds2)

    return chart;
  } /* createChart */



  private XYDataset createDataset1()
  {
    TimeSeries s1 = new TimeSeries("LHS Data");
    s1.add(new Month(2, 2021), 181.8);
    s1.add(new Month(3, 2021), 167.3);
    s1.add(new Month(4, 2021), 153.8);
    s1.add(new Month(5, 2021), 167.6);
    s1.add(new Month(6, 2021), 158.8);
    s1.add(new Month(7, 2021), 148.3);
    s1.add(new Month(8, 2021), 153.9);
    s1.add(new Month(9, 2021), 142.7);
    s1.add(new Month(10, 2021), 123.2);
    s1.add(new Month(11, 2021), 131.8);
    s1.add(new Month(12, 2021), 139.6);
    s1.add(new Month(1, 2022), 142.9);
    s1.add(new Month(2, 2022), 138.7);
    s1.add(new Month(3, 2022), 137.3);
    s1.add(new Month(4, 2022), 143.9);
    s1.add(new Month(5, 2022), 139.8);
    s1.add(new Month(6, 2022), 137.0);
    s1.add(new Month(7, 2022), 132.8);

    TimeSeriesCollection ds = new TimeSeriesCollection();
    ds.addSeries(s1);

    return ds;
  } /* createDataset1 */


  private XYDataset createDataset2()
  {
    TimeSeries s2 = new TimeSeries("RHS Data");
    s2.add(new Month(2, 2021), 429.6);
    s2.add(new Month(3, 2021), 323.2);
    s2.add(new Month(4, 2021), 417.2);
    s2.add(new Month(5, 2021), 624.1);
    s2.add(new Month(6, 2021), 422.6);
    s2.add(new Month(7, 2021), 619.2);
    s2.add(new Month(8, 2021), 416.5);
    s2.add(new Month(9, 2021), 512.7);
    s2.add(new Month(10, 2021), 501.5);
    s2.add(new Month(11, 2021), 306.1);
    s2.add(new Month(12, 2021), 410.3);
    s2.add(new Month(1, 2022), 511.7);
    s2.add(new Month(2, 2022), 611.0);
    s2.add(new Month(3, 2022), 709.6);
    s2.add(new Month(4, 2022), 613.2);
    s2.add(new Month(5, 2022), 711.6);
    s2.add(new Month(6, 2022), 708.8);
    s2.add(new Month(7, 2022), 501.6);

    TimeSeriesCollection ds = new TimeSeriesCollection();
    ds.addSeries(s2);

    return ds;
  } /* createDataset2 */


  public static void main(String[] args)
  {   new DualAxisDemo();  }


}  // DualAxisDemo class

