JFreeChart-X軸が共通な二つのグラフを重ねて表示する


目次 ⇒ [JFreeChartサンプル](https://qiita.com/artery/items/3e9c63e5c14a9e965c97)

```java
package jp.avaj.lib.chart;

import java.io.IOException;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;

/**
■ JFreeChart-X軸が共通な二つのグラフを重ねて表示する

・二種のデータを同時に表示したいときがある.この例では株価と出来高を同時に表示すれば、動きがよくわかる.

・やり方としては、まず一つのグラフでJFreeChartを作成する.
・そのJFreeChartに対して、もう一つのグラフを追加する.
・注、このような手順は気に入らないが、このやり方でないとできないようである(⇒試してみた).ネットにあるサンプルもこのようなやり方をしている.

・(2)出来高のデータを作成し、XYPlotに追加する.
・(3)出来高の軸を作成して出来高のデータと結びつける.
・注、なぜかdataSetIdとaxisIndexは同じ値でなければ動作しない.不思議なAPIだ(笑).2でもよい.

・(4)は、どちらを生かしても、両方コメントにしても、なぜか軸は右側に表示される.

・仕方がないことであろうが、複数のグラフが重なるとき、下に描かれたグラフが潰されて見えにくくなることがある.

 */
public class Chart18_08 {
  //
  public static void main(String[] args) throws IOException {
    //
    // 先にPlot(XYPlot)を作成しておく
    CategoryPlot plot = new CategoryPlot();
    // xyPlotに追加する
    {
      CategoryDataset dataset0 = createDataset0();
      NumberAxis yAxis = new NumberAxis("Sales");
      CategoryAxis xAxis = new CategoryAxis("BRANCH");
      LineAndShapeRenderer render0 = new LineAndShapeRenderer();
      plot.setRangeAxis(yAxis);
      plot.setDomainAxis(xAxis);
      plot.setRenderer(render0);
      plot.setDataset(dataset0);
    }
    //
    JFreeChart jfreeChart = new JFreeChart("SalesChart",(Plot)plot); // (1)
    //
    // もう一つのグラフををxyPlotに追加する
    {
      CategoryDataset dataset1 = createDataset1();
      BarRenderer renderer1 = new BarRenderer();
      ValueAxis yAxis = new NumberAxis("Sales");
      final int dataSetId = 1;
      plot.setDataset(dataSetId,dataset1); // (2)
      final int axisIndex = 1;
      plot.mapDatasetToRangeAxis(dataSetId,axisIndex); // (2)
      plot.setRangeAxis(dataSetId,yAxis); // (3)
      plot.setRenderer(dataSetId,renderer1);
    }
    //
    ChartFrame cFrame = new ChartFrame("TimeSeriesChartFrame",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
  }

  static final String BRAND0 = "Brand0";
  static final String BRAND1 = "Brand1";
  static final String BRAND2 = "Brand2";
  static final String BRAND3 = "Brand3";

  static final String BRANCH0 = "BRANCH0";
  static final String BRANCH1 = "BRANCH1";
  static final String BRANCH2 = "BRANCH2";
  static final String BRANCH3 = "BRANCH3";
  static final String BRANCH4 = "BRANCH4";
  static final String BRANCH5 = "BRANCH5";
  static final String BRANCH6 = "BRANCH6";
  static final String BRANCH7 = "BRANCH7";

  private static CategoryDataset createDataset0() {

    DefaultCategoryDataset localDefaultCategoryDataset = new DefaultCategoryDataset();
    localDefaultCategoryDataset.addValue(1.0D,BRAND0,BRANCH0);
    localDefaultCategoryDataset.addValue(4.0D,BRAND0,BRANCH1);
    localDefaultCategoryDataset.addValue(3.0D,BRAND0,BRANCH2);
    localDefaultCategoryDataset.addValue(5.0D,BRAND0,BRANCH3);
    localDefaultCategoryDataset.addValue(5.0D,BRAND0,BRANCH4);
    localDefaultCategoryDataset.addValue(7.0D,BRAND0,BRANCH5);
    localDefaultCategoryDataset.addValue(7.0D,BRAND0,BRANCH6);
    localDefaultCategoryDataset.addValue(8.0D,BRAND0,BRANCH7);
    localDefaultCategoryDataset.addValue(5.0D,BRAND1,BRANCH0);
    localDefaultCategoryDataset.addValue(7.0D,BRAND1,BRANCH1);
    localDefaultCategoryDataset.addValue(6.0D,BRAND1,BRANCH2);
    localDefaultCategoryDataset.addValue(8.0D,BRAND1,BRANCH3);
    localDefaultCategoryDataset.addValue(4.0D,BRAND1,BRANCH4);
    localDefaultCategoryDataset.addValue(4.0D,BRAND1,BRANCH5);
    localDefaultCategoryDataset.addValue(2.0D,BRAND1,BRANCH6);
    localDefaultCategoryDataset.addValue(1.0D,BRAND1,BRANCH7);
    return localDefaultCategoryDataset;
  }

  private static CategoryDataset createDataset1() {

    DefaultCategoryDataset localDefaultCategoryDataset = new DefaultCategoryDataset();
    localDefaultCategoryDataset.addValue(11.0D,BRAND2,BRANCH0);
    localDefaultCategoryDataset.addValue(14.0D,BRAND2,BRANCH1);
    localDefaultCategoryDataset.addValue(13.0D,BRAND2,BRANCH2);
    localDefaultCategoryDataset.addValue(15.0D,BRAND2,BRANCH3);
    localDefaultCategoryDataset.addValue(15.0D,BRAND2,BRANCH4);
    localDefaultCategoryDataset.addValue(17.0D,BRAND2,BRANCH5);
    localDefaultCategoryDataset.addValue(17.0D,BRAND2,BRANCH6);
    localDefaultCategoryDataset.addValue(18.0D,BRAND2,BRANCH7);
    localDefaultCategoryDataset.addValue(15.0D,BRAND3,BRANCH0);
    localDefaultCategoryDataset.addValue(17.0D,BRAND3,BRANCH1);
    localDefaultCategoryDataset.addValue(16.0D,BRAND3,BRANCH2);
    localDefaultCategoryDataset.addValue(18.0D,BRAND3,BRANCH3);
    localDefaultCategoryDataset.addValue(14.0D,BRAND3,BRANCH4);
    localDefaultCategoryDataset.addValue(14.0D,BRAND3,BRANCH5);
    localDefaultCategoryDataset.addValue(12.0D,BRAND3,BRANCH6);
    localDefaultCategoryDataset.addValue(11.0D,BRAND3,BRANCH7);
    return localDefaultCategoryDataset;
  }
}

```

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/600e9801-d6b5-c6f1-7a6f-17b7be0c696e.png)