ラベル JFreeChart の投稿を表示しています。 すべての投稿を表示
ラベル JFreeChart の投稿を表示しています。 すべての投稿を表示

2015年8月31日月曜日

JFreeChartで横軸の値を縦書きにする

JFreeChartでグラフを作るときに悩ましいのが、
横軸のラベル(って言えばいいのでしょうか?)の管理。
横軸ラベルの文字列が長くなると本来の値が
...に置換されてしまい残念な結果になってしまいます。
一応の対応策としては、ラベルを縦書きにすることで
問題を解消できます。
こんな感じで、修正可能です。
JFreeChart chart = ChartFactory.createBarChart("サンプルグラフ", "横軸", "縦軸", dataset);
chart.setAntiAlias(true);
CategoryPlot plot = chart.getCategoryPlot();
CategoryAxis axis = plot.getDomainAxis();
axis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);

JFreeChartから上記処理に基づいて
CategoryAxisを取得しsetCategoryLabelPositionsメソッドで
向きを変更することができます。

2015年7月15日水曜日

pdfファイルにJFreeChartのグラフを出力

JFreeChartで出力したグラフをiTextを使ってpdfファイルに張り込む。

全体的な流れとしては、

  1. JFreeChartでグラフを生成
  2. 1.からBufferedImageを生成
  3. ChatUtilityを使ってPNG形式でエンコードしたものをbyteの配列として取得
  4. iTextのDocumentクラスをインスタンス化
  5. byteの配列からImageクラスを生成
  6. Imageのpdfファイル上の貼り付け場所を決める
  7. PdfWriterを生成する
  8. Documentをオープンする
  9. PdfContentByteを取得してimageを張り付ける
  10. Documentをクローズする
いつも通り品質は保証しません。


package variouslibraries.javalearning.jfree;

import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
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 JFreeChartToPDF {
    public static void main(String[] args) {
        
 //グラフを作る
 String series1 = "Kyoto";
 String series2 = "Hyogo";
 String series3 = "Osaka";
 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(2.0, series1, category1);
 dataset.addValue(3.0, series1, category2);
 dataset.addValue(4.0, series1, category3);
 dataset.addValue(2.0, series1, category4);
 dataset.addValue(1.0, series1, category5);
 dataset.addValue(3.0, series1, category6);

 dataset.addValue(4.0, series2, category1);
 dataset.addValue(1.0, series2, category2);
 dataset.addValue(2.0, series2, category3);
 dataset.addValue(3.0, series2, category4);
 dataset.addValue(1.0, series2, category5);
 dataset.addValue(2.0, series2, category6);

 dataset.addValue(5.0, series3, category1);
 dataset.addValue(3.0, series3, category2);
 dataset.addValue(2.0, series3, category3);
 dataset.addValue(6.0, series3, category4);
 dataset.addValue(5.0, series3, category5);
 dataset.addValue(7.0, series3, category6);
        
      JFreeChart chart = ChartFactory.createLineChart("Sample Line Chart", "Category", "Value", dataset, PlotOrientation.VERTICAL, true, true, false);
 chart.setAntiAlias(true);   
        
        
        
        //byteの配列を変更する。
        float width = PageSize.A4.getWidth();
        float height = PageSize.A4.getHeight();
        BufferedImage bufImage = chart.createBufferedImage((int)width, (int) (height/2.0));
        byte[] byteArray = null;
        try {
            byteArray = ChartUtilities.encodeAsPNG(bufImage);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        
        //pdfファイルを作成する
        Document document = new Document(PageSize.A4);
        try {
            Image image = Image.getInstance(byteArray);
            image.setAbsolutePosition(0, document.getPageSize().getHeight() - bufImage.getHeight());
            PdfWriter instance = PdfWriter.getInstance(document, new FileOutputStream("PdfSample2.pdf"));
            document.open();
            PdfContentByte pdfContentByte = instance.getDirectContent();
            pdfContentByte.addImage(image);
        } catch (BadElementException | IOException ex) {
            ex.printStackTrace();
        } catch (DocumentException ex) {
            ex.printStackTrace();
        }
        document.close();
    }
}


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やらで読み込むと一つ一つの線やら背景やらを
編集できるけど、使い道は知らない。