LoginSignup
0
0

More than 3 years have passed since last update.

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

Posted at

目次 ⇒ JFreeChartサンプル

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0