
// OverlaidBarChartDemo.java
// http://www.java2s.com/Code/Java/Chart/JFreeChartOverlaidBarChartDemo.htm
// Modified by Andrew Davison, ad@coe.psu.ac.th, Nov 2022

/* Overlays a bar chart made up of two groups, with a line chart.

    Usage:
      > compile OverlaidBarChartDemo.java
      > run OverlaidBarChartDemo
*/


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.category.*;

import org.jfree.data.category.*;




public class OverlaidBarChartDemo extends JFrame
{

  public OverlaidBarChartDemo()
  {
    super("Overlaid Bar Chart Demo");

    CategoryDataset ds1 = createDataset1();
    CategoryDataset ds2 = createDataset2();

    JFreeChart chart = createChart(ds1, ds2);

    ChartPanel cp = new ChartPanel(chart);
    setContentPane(cp);

    // pack();
    setSize(800, 400);
    setResizable(false);
    setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setVisible(true);
  } // OverlaidBarChartDemo()



  private CategoryDataset createDataset1()
  // bar chart data for two groups, "S1" and "S2"
  {
    DefaultCategoryDataset ds = new DefaultCategoryDataset();

    ds.addValue(1.0, "S1", "Category 1");   // value, row key, column key
    ds.addValue(4.0, "S1", "Category 2");
    ds.addValue(3.0, "S1", "Category 3");
    ds.addValue(5.0, "S1", "Category 4");
    ds.addValue(5.0, "S1", "Category 5");
    ds.addValue(7.0, "S1", "Category 6");
    ds.addValue(7.0, "S1", "Category 7");
    ds.addValue(8.0, "S1", "Category 8");

    ds.addValue(5.0, "S2", "Category 1");
    ds.addValue(7.0, "S2", "Category 2");
    ds.addValue(6.0, "S2", "Category 3");
    ds.addValue(8.0, "S2", "Category 4");
    ds.addValue(4.0, "S2", "Category 5");
    ds.addValue(4.0, "S2", "Category 6");
    ds.addValue(2.0, "S2", "Category 7");
    ds.addValue(1.0, "S2", "Category 8");
    return ds;
  } /* createDataset1 */



  private CategoryDataset createDataset2()
  // line chart data; uses the same column keys as bar data
  {
    DefaultCategoryDataset ds = new DefaultCategoryDataset();
    ds.addValue(9.0, "T1", "Category 1");   // value, row key, column key
    ds.addValue(7.0, "T1", "Category 2");
    ds.addValue(2.0, "T1", "Category 3");
    ds.addValue(6.0, "T1", "Category 4");
    ds.addValue(6.0, "T1", "Category 5");
    ds.addValue(9.0, "T1", "Category 6");
    ds.addValue(5.0, "T1", "Category 7");
    ds.addValue(4.0, "T1", "Category 8");
    return ds;
  } /* createDataset2 */


  private JFreeChart createChart(CategoryDataset ds1,
                                 CategoryDataset ds2)
  // build a category plot first, then the chart
  {
    CategoryPlot plot = new CategoryPlot();  // general purpose plotting
    plot.setDomainAxis(new CategoryAxis("Category"));
    plot.setRangeAxis(new NumberAxis("Value"));
    plot.setDomainGridlinesVisible(true);

    // bar chart uses first dataset and renderer...
    BarRenderer rend1 = new BarRenderer();
    rend1.setSeriesItemLabelsVisible(0, true);
    rend1.setBarPainter( new StandardBarPainter());  // solid color
    rend1.setShadowVisible(false);  // no shadows
    plot.setDataset(0, ds1);
    plot.setRenderer(0, rend1);

    // line chart uses second dataset and renderer...
    LineAndShapeRenderer rend2 = new LineAndShapeRenderer();
    rend2.setSeriesPaint(0, Color.BLACK);  // was green
    plot.setDataset(1, ds2);
    plot.setRenderer(1, rend2);

    // rendering order: bar chart first then line
    plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);

    return new JFreeChart("Overlaid Bar Chart", plot);
  } // end of createChart()


  // -------------------------------------------------------

  public static void main(String[] args)
  {  new OverlaidBarChartDemo();  } 

}  // OverlaidBarChartDemo class
