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); } }