目次 ⇒ 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.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;
}
}
}