Cazperのつれづれ日記: JFreeChartでクリックしたチャート(グラフ)のみハイライトさせる

« Google Chromeを試してみる | メイン | 【J-REIT】やっぱり売主と資産運用会社が同じ場合に利益相反が生じていた »

2008年9月 4日

panda01.gif JFreeChartでクリックしたチャート(グラフ)のみハイライトさせる

●和題:JFreeChartでクリックしたチャート(グラフ)のみハイライトさせる
●英題:How to highlight each clicked piece on an pie chart using JFreeChart

JFreeChartを利用して作成したチャート(グラフ)において、各チャートをクリックしたらその部分のみ色を変更させたりハイライトさせたりする方法を紹介します。

グラフの種類は何でも良かったのですけれども、今回はPieChartを利用します。

マウスイベントを拾うには、ChartPanelオブジェクトに対してChartMouseListenerを設置します。PieChartにおいてどのチャートがクリックされたのかを取得するには、getEntity().toString()を利用するしかなさそうです。これを利用すると、チャートをクリックした際に次のようなメッセージを取得する事が出来ます。

PieSection: 0, 1(Category 2)

赤字で表示された部分が、クリックされたチャートの番号(0から順番)になります。String型で取得されるため、substring(15,16)でチャート番号を抜き出します。


クリックされたチャート部の色を変更する際には、setSectionPaintメソッドを利用します。

setSectionPaint(data.getKey(i), java.awt.Color.ORANGE);

1番目の引数は、データセットのキーになっておりますので、クリック時に取得されたチャート番号(0から順番)を渡します。2番目の引数は色です。


実際のサンプルプログラムを以下に書いておきます。

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

/* 参考サイト: http://www.thinkit.co.jp/cert/tech/4/5/2.htm */
/* : http://www.javaworld.com.tw/jute/post/view?bid=5&id=126553&sty=3 */

package jfreecharttest;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.ChartMouseEvent;
import org.jfree.chart.ChartMouseListener;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PiePlot;
import org.jfree.data.general.DefaultPieDataset;

/**
* 円グラフのサンプル
*/
public class PieChartSample {

DefaultPieDataset data;
PiePlot plot;
boolean[] colorflag = new boolean[3];

public static void main(String[] args) {

//引用:static mainの呪い(http://funini.com/kei/java/static_main.shtml)
PieChartSample mj = new PieChartSample();
mj.main();

}

public void main() {
/* ここに書きたかった内容を書く*/
// (1)データセットの作成
data = new DefaultPieDataset();
data.setValue("Category 1", 50);
data.setValue("Category 2", 20);
data.setValue("Category 3", 30);

// (2)JFreeChartオブジェクトの生成
JFreeChart chart = ChartFactory.createPieChart(
"Simple Pie Chart",
data,
true,
true,
false
);

// (3)描画領域のオブジェクトを確保
plot = (PiePlot)chart.getPlot();

// (4)グラフの出力
ChartFrame frame = new ChartFrame("Simple Pie Chart", chart);
// (4.1) ChartPanelオブジェクトを確保しておく
ChartPanel p = frame.getChartPanel();
// (4.2) MouseListenerを設置(マウスイベントが発生するようにする)
p.addChartMouseListener(new MyMouseListener());

frame.pack();
frame.setVisible(true);
}


//MouseListner(マウスイベントが発生するようにする)
private class MyMouseListener implements ChartMouseListener
{

//描画用の配列を確保
java.awt.Paint tempPaint[]= new java.awt.Paint[3];

public void chartMouseClicked(ChartMouseEvent arg0)
{

int i;

//必要ではないけど、確認のために標準出力を設定
System.out.println(arg0.getEntity().toString());
System.out.println(arg0.getEntity().toString().substring(15,16));

//チャート(グラフ)の何番目がクリックされたかを取得
i=Integer.valueOf(arg0.getEntity().toString().substring(15, 16)); //数字

//1度クリックされたらオレンジへ、もう一度クリックされたら元の色に戻す
if (colorflag[i]==false) {
tempPaint[i]= plot.getSectionPaint(data.getKey(i));
//直接何番目のチャートかを指定して色を変更している。
plot.setSectionPaint(data.getKey(i), java.awt.Color.ORANGE);
colorflag[i]=true;
}else{
plot.setSectionPaint(data.getKey(i),tempPaint[i]);
colorflag[i]=false;
}

}

//マウス移動のイベントを書きたい場合は以下へ(例えばマウスオーバーとか...mouseover)
public void chartMouseMoved(ChartMouseEvent arg0)
{
//System.out.println("Move:"+arg0.getTrigger().getX()+","+arg0.getTrigger().getY());
}
}
}


実際に表示される画面は以下です。
●立ち上がった直後の画面
jfreechartmouse01

●クリック時(2番目のチャートをクリックしております)
jfreechartmouse02
もう一度クリックすると元の色が再表示されます。


P.S.1
棒グラフに関しては、こちらを参照された方が早いかと

P.S.2
プログラム好きじゃないや(笑 ビジョナリー向きだなぁ(笑

投稿者 cazper : 2008年9月 4日 18:16 | b_entry.gif
     

トラックバック

このエントリーのトラックバックURL:
http://www.cazoo.jp/cgi/mt/mt-tb.cgi/2265

コメント