개별 지정 JFreeChart - 2D 분포도/렌더링/특정 데이터 강조

카탈로그
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;
    }
  }
}

JFreeChart 샘플

좋은 웹페이지 즐겨찾기