07
6月
2007

チャートのSVG出力(JFreechart 1.0.0-pre2)

JFreeChartはGraphics2Dに対して描画できる.そしてApacheプロジェクトのbaticはGraphics2DのサブクラスであるSVGGraphics2Dを入力としてSVGを出力できる.両者のI/Fがつながるので,両者を単純に使用するだけでチャートをSVGで出力することができる.
SVG
サンプル
SVG出力

SVG

SVGはSimple Vector Graphicsは,XMLで記述されるベクトル方式の画像フォーマットである. ビューアにはAdobeのビューアや,ApacheプロジェクトのBatikなどがある. BatikはさらにSVGを生成するモジュールもあり,今回はそれを使用してJFreeChartの出力をSVGとしてみる.

サンプル

以前作成したPieChartをBatikを使用してSVG出力するサンプルを作成してみた. サンプルの実行方法を以下に示す.
$ tar zxvf SVGMaker-0_01.tar.gz
$ ant preparelib
$ java -jar jfreechartsample.jar
antタスクpreparelibでは,サンプルが依存するJFreeChart,Log4J,BatikをHTTPにてダウンロードするが,HTTPプロキシには対応していない. そのような環境の場合は,別途依存jarファイルを入手されたい. 実行すると,カレントディレクトリにchart.svgが出力される.

SVG出力

JFreeChartオブジェクトの作成についてはこれまで記述してきた内容を参照されたい. サンプルSVGMakerを以下に示す.

package org.fireproject.jfreechartsample;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.geom.Rectangle2D;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import org.apache.batik.dom.GenericDOMImplementation;
import org.apache.batik.svggen.SVGGraphics2D;
import org.apache.batik.svggen.SVGGraphics2DIOException;
import org.jfree.chart.Legend;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PiePlot;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.data.general.PieDataset;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;

import org.apache.log4j.Logger;

public class SVGMaker {
    /** ログ出力用. */
    private static Logger logger = Logger.getRootLogger();

    /**
     * JFreeChartオブジェクトの作成と操作
     */
    public static JFreeChart getPieChart() {
	// 円グラフのデータ
        double[][] data = new double[][]
	    {{1.0, 2.0, 3.0, 4.0},
	     {5.0, 6.0, 7.0, 8.0}};
        // CategoryDatasetオブジェクトの作成
	CategoryDataset cData = DatasetUtilities.createCategoryDataset("RowKey ", "ColKey ", data);
        // CategoryDatasetオブジェクトを円グラフ向けのPieDatasetオブジェクトに変換
 	PieDataset pieData = DatasetUtilities.createPieDatasetForRow(cData, 0);
	// PieDatasetをデータにしてJFreeChartを作成
	JFreeChart pieChart = ChartFactory.createPieChart ("SVGMaker",
							   pieData, true,
							   true, true);

	// PiePlotオブジェクトを取り出して描画データを操作する
	PiePlot piePlot = (PiePlot)pieChart.getPlot();
	// 楕円を許可する
	piePlot.setCircular(false);
	// 円グラフから強調する部分を指定する
	piePlot.setExplodePercent(1, 0.5);
	return pieChart;
    }

    public static void main (String args[]) {
	// DOMImplementationの取得
        DOMImplementation domImpl =
            GenericDOMImplementation.getDOMImplementation();

        // XMLドキュメントの作成
        Document document = domImpl.createDocument(null, "svg", null);

        // SVGジェネレータの作成
        SVGGraphics2D svg2d = new SVGGraphics2D(document);

	// Chartの作成
	JFreeChart chart = getPieChart();
	Rectangle2D r2d = new Rectangle(800, 500);
	// Chartの描画
	chart.draw(svg2d, r2d);

	// CSSを使用する
        boolean useCSS = true;
	try {
	    OutputStream os = new FileOutputStream("./chart.svg");
	    BufferedOutputStream bos = new BufferedOutputStream(os);
	    // 文字コードの指定
	    Writer out = new OutputStreamWriter(bos, "UTF-8");
	    // 出力
	    svg2d.stream(out, useCSS);
	} catch (UnsupportedEncodingException ue) {
	    logger.info(ue);
	} catch (SVGGraphics2DIOException se) {
	    logger.info(se);
	} catch (IOException ioe) {
	    logger.info(ioe);
	}
    }
}

ポイントを以下に示す.
SVGジェネレータの作成
SVGGraphics2DオブジェクトがSVGジェネレータである.
Chartの作成
出力したいChartを作成する.
Chartの描画
JFreeChartはjava.awt.Graphics2Dに対して描画する
void draw(java.awt.Graphics2D g2, java.awt.geom.Rectangle2D area)
というメソッドを持つ. 先述のSVGジェネレータであるSVGGraphics2Dはjava.awt.Graphics2Dのサブクラスであるので,これに出力する.
SVGジェネレータを使用してSVG出力する
SVGGraphics2Dのstreamというメソッド(いくつかオーバーロードがある)を使用して上で描画したChartをSVG出力する.
以上,JFreeChartはGraphics2Dに出力でき,SVGジェネレータはGraphics2Dのサブクラスであることから,両者は容易に連係でき,実際ChartをSVG出力できることが確認でき

You may also like...