/**
   * Displays an overlaid XYPlot with X and Y symbolic data.
   *
   * @param frameTitle the frame title.
   * @param data1 the dataset 1.
   * @param data2 the dataset 2.
   */
  private static void displayXYSymbolicOverlaid(
      String frameTitle, XYDataset data1, XYDataset data2) {

    String title = "Pollutant Overlaid";
    String xAxisLabel = "Contamination and Type";
    String yAxisLabel = "Pollutant";

    // combine the x symbolic values of the two data sets
    String[] combinedXSymbolicValues =
        SampleXYSymbolicDataset.combineXSymbolicDataset((XisSymbolic) data1, (XisSymbolic) data2);

    // combine the y symbolic values of the two data sets
    String[] combinedYSymbolicValues =
        SampleXYSymbolicDataset.combineYSymbolicDataset((YisSymbolic) data1, (YisSymbolic) data2);

    // make master dataset...
    CombinedDataset data = new CombinedDataset();
    data.add(data1);
    data.add(data2);

    // decompose data...
    XYDataset series0 = new SubSeriesDataset(data, 0);
    XYDataset series1 = new SubSeriesDataset(data, 1);

    // create overlaid plot...
    SymbolicAxis hsymbolicAxis = new SymbolicAxis(xAxisLabel, combinedXSymbolicValues);
    SymbolicAxis vsymbolicAxis = new SymbolicAxis(yAxisLabel, combinedYSymbolicValues);

    XYItemRenderer renderer1 = new StandardXYItemRenderer(StandardXYItemRenderer.SHAPES, null);
    XYPlot plot = new XYPlot(series0, hsymbolicAxis, vsymbolicAxis, renderer1);

    XYItemRenderer renderer2 = new StandardXYItemRenderer(StandardXYItemRenderer.SHAPES, null);
    plot.setSecondaryDataset(0, series1);
    plot.setSecondaryRenderer(0, renderer2);

    // make the chart...
    JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, true);
    chart.setBackgroundPaint(new GradientPaint(0, 0, Color.white, 0, 1000, Color.blue));

    // and present it in a frame...
    JFrame frame = new ChartFrame(frameTitle, chart);
    frame.pack();
    RefineryUtilities.positionFrameRandomly(frame);
    frame.show();
  }
  /**
   * Vertically combined sample1 and sample2 and display it.
   *
   * @param frameTitle the frame title.
   * @param data1 the dataset 1.
   * @param data2 the dataset 2.
   */
  private static void displayXYSymbolicCombinedVertically(
      String frameTitle, XYDataset data1, XYDataset data2) {

    String title = "Pollutant Vertically Combined";
    String xAxisLabel = "Contamination and Type";
    String yAxisLabel = "Pollutant";

    // combine the x symbolic values of the two data sets
    String[] combinedXSymbolicValues =
        SampleXYSymbolicDataset.combineXSymbolicDataset((XisSymbolic) data1, (XisSymbolic) data2);

    // make master dataset...
    CombinedDataset data = new CombinedDataset();
    data.add(data1);
    data.add(data2);

    // decompose data...
    XYDataset series0 = new SubSeriesDataset(data, 0);
    XYDataset series1 = new SubSeriesDataset(data, 1);

    // common horizontal and vertical axes
    SymbolicAxis hsymbolicAxis = new SymbolicAxis(xAxisLabel, combinedXSymbolicValues);

    SymbolicAxis vsymbolicAxis0 =
        new SymbolicAxis(yAxisLabel, ((YisSymbolic) data1).getYSymbolicValues());

    SymbolicAxis vsymbolicAxis1 =
        new SymbolicAxis(yAxisLabel, ((YisSymbolic) data2).getYSymbolicValues());

    // create the main plot...
    CombinedDomainXYPlot mainPlot = new CombinedDomainXYPlot(hsymbolicAxis);

    // add the sub-plots...
    XYItemRenderer renderer = new StandardXYItemRenderer(StandardXYItemRenderer.SHAPES, null);
    XYPlot subplot0 = new XYPlot(series0, null, vsymbolicAxis0, renderer);
    XYPlot subplot1 = new XYPlot(series1, null, vsymbolicAxis1, renderer);

    mainPlot.add(subplot0, 1);
    mainPlot.add(subplot1, 1);

    // make the chart...
    JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, mainPlot, true);
    chart.setBackgroundPaint(new GradientPaint(0, 0, Color.white, 0, 1000, Color.blue));

    // and present it in a frame...
    JFrame frame = new ChartFrame(frameTitle, chart);
    frame.pack();
    RefineryUtilities.positionFrameRandomly(frame);
    frame.show();
  }
  /**
   * Starting point for the application.
   *
   * @param args ignored.
   */
  public static void main(String[] args) {

    SampleXYSymbolicDataset s1 = createXYSymbolicSample1();
    SampleXYSymbolicDataset s2 = createXYSymbolicSample2();

    displayXYSymbolic("Example 1", s1, "Pollutant", "contamination", "pollutant");

    displayXYSymbolic("Example 2", s2, "Pollutant", "type", "pollutant");

    displayXYSymbolicCombinedHorizontally(
        "Example 3", (SampleXYSymbolicDataset) s1.clone(), (SampleXYSymbolicDataset) s2.clone());

    displayXYSymbolicCombinedVertically(
        "Example 4", (SampleXYSymbolicDataset) s1.clone(), (SampleXYSymbolicDataset) s2.clone());

    displayXYSymbolicOverlaid(
        "Example 5", (SampleXYSymbolicDataset) s1.clone(), (SampleXYSymbolicDataset) s2.clone());
  }