2011年6月25日土曜日

JFreeChartによるグラフ描画

JFreeChartを使うと、javaで割と簡単にグラフを作成することができる。
グラフの種類も様々で、円グラフや棒グラフ、折れ線グラフなど基本どころはもちろん、3DグラフなどExcelでできることはだいたいできそう(たぶん)。
例えば、DBと接続してればそのデータをすぐに可視化できたりする。

まずは、ここからダウンロードしてjarファイルを読み込みます。
ちなみにJFreeChartのwebページはこちら。このページにもサンプルがあるのでおしゃれです。


今回はサンプルということで書いてみました(なので、DBは使わず)。

まずはデータ準備。本の売り上げを表すグラフをつくろうかなということで、Bookクラスと売り上げを管理するクラスをつくります。


public class Book {
 
 /** 本のタイトル */
 private String title;
 /** 本の売れた総数 */
 private int amount;
 /** 月*/
 private int month;
 
 public Book(String t,int a, int m){
  this.title=t;
  this.amount=a;
  this.month=m;
 }
 
 public String getTitle() {
  return title;
 }
 public void setTitle(String title) {
  this.title = title;
 }
 public int getAmount() {
  return amount;
 }
 public void setAmount(int amount) {
  this.amount = amount;
 }
 public int getMonth() {
  return month;
 }
 public void setMonth(int month) {
  this.month = month;
 }

}

import java.util.ArrayList;
import java.util.List;

public class AmountManager {
 private List list;

 /**
  * 売り上げ情報(1月から4月までとする)をリストにいれる。
  */
 public AmountManager() {
  List books = new ArrayList();
  Book b1 = new Book("もしド○", 30, 1);
  Book b2 = new Book("もしド○", 10, 2);
  Book b3 = new Book("もしド○", 40, 3);
  Book b4 = new Book("もしド○", 100, 4);
  Book b5 = new Book("△△コナン", 60, 1);
  Book b6 = new Book("△△コナン", 90, 2);
  Book b7 = new Book("△△コナン", 10, 3);
  Book b8 = new Book("△△コナン", 40, 4);
  books.add(b1);
  books.add(b2);
  books.add(b3);
  books.add(b4);
  books.add(b5);
  books.add(b6);
  books.add(b7);
  books.add(b8);
  this.list = books;
 } 
 
 /**
  * リストを返す
  */
 public List showAll(){
  return this.list;
 }
}

以下はグラフを書くためのクラスです。ウェブで使えるようにしたのでサーブレットになっています。

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;


public class ChartSample extends HttpServlet{
 @Override
 protected void doGet
  (HttpServletRequest req, HttpServletResponse resp)
     throws ServletException, IOException {

  // グラフ生成用の元データを用意
 //(データベースとかでひろってきた場合もリストでもってくれば良いかと)
  AmountManager amountManager = new AmountManager();
  List list=amountManager.showAll();

     // グラフの基となるデータセットを用意
  DefaultCategoryDataset data=new DefaultCategoryDataset();

     // データセットに項目名と値のを順にセット
  for (Book book : list) {
   //addValueの引き数は「縦軸の値, 項目, 横軸の値」の順番
   //ただし、第2引数と第3引数は文字列なので変換が必要
   String xValue=Integer.toString(book.getMonth());
   data.addValue(book.getAmount(), book.getTitle(), xValue);
  }
  
     //グラフを生成
     //第1引数:グラフのタイトル
     //第2引数:横軸ラベル
     //第3引数:縦軸ラベル
     //第4引数:dataset()でつくったオブジェクト
     //第5引数:値の向き
     //第6引数:凡例を表示かどうか
     //第7引数:オンマウスにした際に情報を表示を作成するか
     //第8引数:URLを作成するかどうか
     JFreeChart objCht=ChartFactory.createLineChart
    ("カテゴリーA内商品別 月次売上","月","万円",
    data, PlotOrientation.VERTICAL,
                true,false,false);

      //バイナリ出力ストリームにJPEG形式で画像を出力600×400ピクセル)
     resp.setContentType("image/jpeg"); 
     ServletOutputStream objSos=resp.getOutputStream();
     ChartUtilities.writeChartAsJPEG(objSos,objCht,600,400);      
 }
}



#なんかソースのところに</book>みたいなのが表示されるの何でしょう。。。そんなの書いてないのに、、、(java書くときは抜いてください)



このサーブレットを実行すると、結果が出ます。




割と簡単だし、サンプルみるといろんなグラフが書けそうです。



0 件のコメント:

コメントを投稿