2015年7月13日月曜日

JFreeChartでSVG出力(JFreeSVG利用)

JFreeChartもJFreeSVGもjfree.orgが開発しているんで、
相性はよかろうという安易な考えで書いてみた。

流れとしては、

  1. 適当にJFreeChartのグラフを作る
  2. SVGGraphics2D(キャンバスみたいなもん)を作成
  3. Rectangle2Dを作成
  4. SVGUtilsで出力
というながれ、2,3は出力先のキャンバスとキャンバス上に
どれくらいのサイズで出力するかを設定する感じ。
一先ず動きゃええの精神で作っているので品質は保証しません。


package variouslibraries.javalearning.jfree;

import java.awt.Rectangle;
import java.awt.geom.Rectangle2D;
import java.io.File;
import java.io.IOException;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.graphics2d.svg.SVGGraphics2D;
import org.jfree.graphics2d.svg.SVGUtils;


public class JFreeChartSVGOutput {

 public static void main(String[] args) {
  // (1)データセットの作成
  String series1 = "First";
  String series2 = "Second";
  String series3 = "Third";
  // カテゴリーの設定
  String category1 = "Category 1";
  String category2 = "Category 2";
  String category3 = "Category 3";
  String category4 = "Category 4";
  String category5 = "Category 5";
  String category6 = "Category 6";
  DefaultCategoryDataset dataset = new DefaultCategoryDataset();
  dataset.addValue(3.0, series1, category1);
  dataset.addValue(2.0, series1, category2);
  dataset.addValue(4.0, series1, category3);
  dataset.addValue(4.0, series1, category4);
  dataset.addValue(4.0, series1, category5);
  dataset.addValue(6.0, series1, category6);

  dataset.addValue(5.0, series2, category1);
  dataset.addValue(3.0, series2, category2);
  dataset.addValue(6.0, series2, category3);
  dataset.addValue(5.0, series2, category4);
  dataset.addValue(6.0, series2, category5);
  dataset.addValue(5.0, series2, category6);

  dataset.addValue(6.0, series3, category1);
  dataset.addValue(7.0, series3, category2);
  dataset.addValue(7.0, series3, category3);
  dataset.addValue(6.0, series3, category4);
  dataset.addValue(5.0, series3, category5);
  dataset.addValue(7.0, series3, category6);

  // (2)JFreeChartオブジェクトの生成
  JFreeChart chart = ChartFactory.createLineChart("Sample Line Chart", "Category", "Value", dataset, PlotOrientation.VERTICAL, true, true, false);
  chart.setAntiAlias(true);
  // (3)グラフの出力

  SVGGraphics2D svg = new SVGGraphics2D(640, 480);
  Rectangle2D rectangle = new Rectangle(640, 480);
  chart.draw(svg, rectangle);

  try {
   SVGUtils.writeToSVG(new File("./SampleLineChart.svg"), svg.getSVGElement());
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

}
出力される画像は以下のような感じ。
実際のファイルだと拡大縮小してもスムーズな線のままです。
(したのファイルはpngにしているのでそうもいきません。)

Inkscapeやらで読み込むと一つ一つの線やら背景やらを
編集できるけど、使い道は知らない。

0 件のコメント:

コメントを投稿