Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

目次 ⇒ 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

artery
キム・ベイシンガー
https://ameblo.jp/artery3000/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away