JFreeChart-二次元分布チャート-XYSeriesCollection-特定データを強調する


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

```java
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.plot.Plot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

import jp.avaj.lib.algo.ArUtil;
import jp.avaj.lib.test.L;

/**
■ JFreeChart-二次元分布チャート-XYSeriesCollection-特定データを強調する

 */
public class Chart15_04 {
  // 目次-二次元分布チャート
  A_Chart15 a_Chart15;
  // 目次-Artery-JFreeChart用のライブラリ
  A_Chart00 a_LibChartSampeContents;


  public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    XYSeriesCollection dataSet = createXYDataset();
    // (1)レンダラの指定
    // 最初の引数はラインを引くかどうか⇒今回はラインは引かない
    // 次の引数はデータの場所に形を表示するか否か⇒今回は形を表示する.
    XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(false,true);
    // 軸の指定
    NumberAxis xAxis = new NumberAxis();
    NumberAxis yAxis = new NumberAxis();
    // Plotの生成
    XYPlot xyPlot = new XYPlot((XYDataset)dataSet,xAxis,yAxis,(XYItemRenderer)renderer);
    // チャートを表示する
    JFreeChart jfreeChart = new JFreeChart("XYPlot",(Plot)xyPlot);
    ChartFrame cFrame = new ChartFrame("XYPlot",(JFreeChart)jfreeChart);  // (1)
    cFrame.pack();
    cFrame.setVisible(true);

    /*
    特定データを強調する⇒レンダラを個別設定する
    レンダラはplotからインデックス指定で取得できる.しかしキー(本例ではSn)からは取得できない.
    なのでインデックスとキーを自分で管理するか、キー⇒インデックスの関係をdatasetから取得する.
    ここではdatesetから取得する方法で行う.
    */
    {
      // 目で確認するために、少し休む
      ArUtil.sleep(2000);
      // S2データを強調したい.
      int index = dataSet.indexOf("S2");
      L.p("index="+index);
      // 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(12000);
      // 元の大きさに戻す
      ren.setSeriesShape(index,null);
    }
  }

  /** 表示データ(XYSeriesCollection)を作成する */
  public static XYSeriesCollection createXYDataset() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
    XYSeriesCollection xySeriesCollection = new XYSeriesCollection();
    Random ran = new Random();
    for (int series = 0; series<5; series++) {
      List<Z_XYPlotSample_11_Data> list = new ArrayList<Z_XYPlotSample_11_Data>();
      for (int item = 0; item<10; item++) {
        double x = ran.nextDouble()*10;
        double y = x+ran.nextDouble()*5;
        list.add(new Z_XYPlotSample_11_Data(x,y));
      }
      // ListからXYSeriesを生成する、x値,y値を取得するフィールド名を指定する
      XYSeries xySeries = ArcXYSeries.create("S"+series,list,"x","y");
      // XYSeriesCollecitonに追加する
      xySeriesCollection.addSeries(xySeries);
    }
    return xySeriesCollection;
  }
  /** 元データを格納するクラス */
  public static class Z_XYPlotSample_11_Data {
    public Z_XYPlotSample_11_Data(double x,double y) {
      this.x = x;
      this.y = y;
    }
    private double x;
    private double y;
    public double getX() {
      return x;
    }
    public void setX(double x) {
      this.x = x;
    }
    public double getY() {
      return y;
    }
    public void setY(double y) {
      this.y = y;
    }
  }
}


```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278568/757f9872-ecc0-14b5-2c65-5b68a5a62c74.png)