JFreeChartをさわる

別件でWEBアプリケーションでグラフを出力する要件があり、JFreeChartをさわりました。
数は少ないですが、いくつかの日本語サイトで説明があり、思った以上に簡単にグラフ作成ができました。
3D表示も可能で、見た目にもきれいなグラフが出力できます。
1つもうちょっとと思った点は、折れ線グラフで2本以上のグラフを作成する際に1本の時に比べてかなり手間がかかることです。
折れ線グラフで2本以上の線があるグラフなど当たり前だと思うので、そこに溝があるのは残念ですね。
まぁ、表示できないことはないのでよいですが、、
もうちょっと調べるかも知れません。



ちなみに現時点で、折れ線グラフを3本表示することを試した時のソースです。

package jfreechartsample.servlet;

import java.io.IOException;
import java.math.BigDecimal;

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

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.DatasetRenderingOrder;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.data.DefaultKeyedValues;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.DatasetUtilities;

public class LineChartServlet extends HttpServlet {

	  public void doGet(HttpServletRequest request, HttpServletResponse response)
	    throws ServletException, IOException {
		  
		  
		  // 売上データ
	        DefaultKeyedValues valuesOfA = new DefaultKeyedValues();
	        valuesOfA.addValue(new String("2005/01"), new BigDecimal(20));
	        valuesOfA.addValue(new String("2005/02"), new BigDecimal(30));
	        valuesOfA.addValue(new String("2005/03"), new BigDecimal(100));
	        valuesOfA.addValue(new String("2005/04"), new BigDecimal(40));
	        valuesOfA.addValue(new String("2005/05"), new BigDecimal(20));
	        valuesOfA.addValue(new String("2005/06"), new BigDecimal(10));
	        valuesOfA.addValue(new String("2005/07"), new BigDecimal(60));
	        valuesOfA.addValue(new String("2005/08"), new BigDecimal(80));
	        valuesOfA.addValue(new String("2005/09"), new BigDecimal(70));
	        valuesOfA.addValue(new String("2005/10"), new BigDecimal(50));
	        valuesOfA.addValue(new String("2005/11"), new BigDecimal(80));
	        valuesOfA.addValue(new String("2005/12"), new BigDecimal(20));
	        
			  // 予算データ
	        DefaultKeyedValues valuesOfB = new DefaultKeyedValues();
	        valuesOfB.addValue(new String("2005/01"), new BigDecimal(10));
	        valuesOfB.addValue(new String("2005/02"), new BigDecimal(40));
	        valuesOfB.addValue(new String("2005/03"), new BigDecimal(10));
	        valuesOfB.addValue(new String("2005/04"), new BigDecimal(80));
	        valuesOfB.addValue(new String("2005/05"), new BigDecimal(10));
	        valuesOfB.addValue(new String("2005/06"), new BigDecimal(20));
	        valuesOfB.addValue(new String("2005/07"), new BigDecimal(80));
	        valuesOfB.addValue(new String("2005/08"), new BigDecimal(60));
	        valuesOfB.addValue(new String("2005/09"), new BigDecimal(50));
	        valuesOfB.addValue(new String("2005/10"), new BigDecimal(40));
	        valuesOfB.addValue(new String("2005/11"), new BigDecimal(60));
	        valuesOfB.addValue(new String("2005/12"), new BigDecimal(50));

			  // 利益データ
	        DefaultKeyedValues valuesOfC = new DefaultKeyedValues();
	        valuesOfC.addValue(new String("2005/01"), new BigDecimal(60));
	        valuesOfC.addValue(new String("2005/02"), new BigDecimal(20));
	        valuesOfC.addValue(new String("2005/03"), new BigDecimal(60));
	        valuesOfC.addValue(new String("2005/04"), new BigDecimal(40));
	        valuesOfC.addValue(new String("2005/05"), new BigDecimal(80));
	        valuesOfC.addValue(new String("2005/06"), new BigDecimal(100));
	        valuesOfC.addValue(new String("2005/07"), new BigDecimal(10));
	        valuesOfC.addValue(new String("2005/08"), new BigDecimal(20));
	        valuesOfC.addValue(new String("2005/09"), new BigDecimal(60));
	        valuesOfC.addValue(new String("2005/10"), new BigDecimal(70));
	        valuesOfC.addValue(new String("2005/11"), new BigDecimal(40));
	        valuesOfC.addValue(new String("2005/12"), new BigDecimal(90));

	   
	        
	        CategoryDataset categoryDataA = DatasetUtilities.createCategoryDataset("売上", valuesOfA);
	        CategoryDataset categoryDataB = DatasetUtilities.createCategoryDataset("予算", valuesOfB);
	        CategoryDataset categoryDataC = DatasetUtilities.createCategoryDataset("利益", valuesOfC);

	        JFreeChart jFreeChart = ChartFactory.createLineChart(
	                "タイトル",
	                "横軸",
	                "縦軸",
	                categoryDataA,
	                PlotOrientation.VERTICAL,
	                true,
	                false,
	                false);

	        CategoryPlot plotByB = jFreeChart.getCategoryPlot();
	        CategoryPlot plotByC = jFreeChart.getCategoryPlot();
	        
	        plotByB.setDataset(1,categoryDataB);
	        plotByC.setDataset(2,categoryDataC);
	        
	        CategoryItemRenderer rendererByB = new LineAndShapeRenderer();
	        CategoryItemRenderer rendererByC = new LineAndShapeRenderer();

	        plotByB.setRenderer(1,rendererByB);
	        plotByC.setRenderer(2,rendererByC);
	        
	        plotByB.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
	        plotByC.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
	        
		    response.setContentType("image/jpeg"); 
		    ServletOutputStream objSos=response.getOutputStream();
		    ChartUtilities.writeChartAsJPEG(objSos,jFreeChart,600,400); 
	  
	  }

}