LoginSignup
0
0

More than 3 years have passed since last update.

JFreeChart-二次元分布チャート/レンダラを個別に指定する/特定データを強調する

Last updated at Posted at 2019-07-11

目次 ⇒ JFreeChartサンプル

package jp.avaj.lib.chart;

import java.awt.Rectangle;
import java.awt.Shape;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.Plot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.DefaultXYItemRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.xy.DefaultXYDataset;
import org.jfree.data.xy.XYDataset;

import jp.avaj.lib.algo.ArUtil;

/**
■ JFreeChart-二次元分布チャート/レンダラを個別に指定する/特定データを強調する
・Datasetの作成などは別サンプルを参照すること.

・レンダラはPlotに対して指定するのが基本。
  ・この場合は、点やバーのの形状や色を自動的が自動的に決定される.
・しかしグラフごとに指定することもできる.
  ・この場合は、形状や色はすべて明示的に指定する必要がある.
・またPlotにレンダラを指定した後で、特定グラフのレンダラを特別に指定することもできる.
  ・特定グラフの形状や色は明示的に指定する必要があり、他のグラフの指定との整合性は自己責任となる.
  ・多くの場合はPlot全体レンダラの指定を読み取って、望む部分だけ(例えば形を大きくするなど)の変更をするほうが実際的.

 */
public class Chart03_04 {
  // 目次-二次元分布チャート-XYDataset
  A_Chart03 a_chart03;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;

  public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    // グラフ名
    String[] names = new String[]{"A","B","C"};
    // DefaultXYDatasetを作成する
    DefaultXYDataset dataSet = new DefaultXYDataset();
    for (int i=0; i<names.length; i++){
      // 元のリスト
      List<XYPlotSample00Data> list = createTestData(i);
      // フィールド名(x)を指定してdouble[][]に変換する⇒dataSetに追加する
      // yはListのインデックス
      double[][] data = ArcDefaultXYDataset.createX(list,"x");
      dataSet.addSeries(names[i],data);
    }

    // 軸を指定する⇒上下限は自動的に判定⇒明示的に設定もできる
    // 対数軸なども指定できる
    NumberAxis yAxis = new NumberAxis();
    NumberAxis xAxis = new NumberAxis();

    // レンダラーを指定する⇒色や形を自動的に設定する
    // グラフ(A,B,C)ごとにレンダラーを設定することもできる
    DefaultXYItemRenderer renderer = new DefaultXYItemRenderer();
    // (通常は)順番がないデータなので、線は引かない.
    renderer.setBaseLinesVisible(false);

    // Plotを作成する⇒XYPlotを使用する
    XYPlot xyPlot = new XYPlot((XYDataset)dataSet,(ValueAxis)xAxis,(ValueAxis)yAxis,renderer);

    // チャートを作成する
    JFreeChart jfreeChart = new JFreeChart("XYチャート",(Plot)xyPlot);

    // チャートを表示する
    ChartFrame cFrame = new ChartFrame("XYチャート",(JFreeChart)jfreeChart);
    cFrame.pack();
    cFrame.setVisible(true);
    /*
    レンダラを個別設定する
    レンダラはplotからインデックス指定で取得できる.しかしキー(本例ではA,B,C)からは取得できない.
    なのでインデックスとキーを自分で管理するか、キー⇒インデックスの関係をdatasetから取得する.
    ここではdatesetから取得する方法で行う.
    */
    {
      // 目で確認するために、少し休む
      ArUtil.sleep(2000);
      // Bデータを強調したい.
      int index = dataSet.indexOf("B");
      // Plotのレンダラを取得する
      XYItemRenderer ren = xyPlot.getRenderer();
      // Shapeを取得する
      Shape shape = ren.getBaseShape();
      Rectangle rec = shape.getBounds();
      // 大きさを二倍にする
      Rectangle newRec = new Rectangle();
      newRec.setRect(-6,-6,12,12); // 本当は元の大きさを正確に取得して二倍すべき
      // 二倍にしたShapeをindexを指定して設定する
      ren.setSeriesShape(index,newRec);

      // 目で確認するために、少し休む
      ArUtil.sleep(2000);
      // 元の大きさに戻す
      ren.setSeriesShape(index,null);
    }

  }
  /** テストデータを生成する */
  private static List<XYPlotSample00Data> createTestData(int cnt) {
    Random ran = new Random();
    List<XYPlotSample00Data> list = new ArrayList<XYPlotSample00Data>();
    for (int i=0; i<20; i++) {
      list.add(new XYPlotSample00Data(cnt*2+ran.nextInt(20),cnt*4+ran.nextInt(15)));
    }
    return list;
  }
  /** テストデータを入れるクラス */
  public static class XYPlotSample00Data {
    public XYPlotSample00Data(int x,int y) {
      this.x = x;
      this.y = y;
    }
    private int x;
    private int y;
    public int getX() {
      return x;
    }
    public void setX(int x) {
      this.x = x;
    }
    public int getY() {
      return y;
    }
    public void setY(int y) {
      this.y = y;
    }
  }
}

無題.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