- - PR -
JFreeChartで描画したグラフのDomainAxisを変更したい。
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-09-23 11:31
積み上げグラフを描画して、棒の間に各項目を結ぶ線を描きたいと思っています。
方法がわからないので、まず線グラフを描いて、その上に積み上げグラフを重ねることにしました。 そこまではうまくいったのですが、DomainAxisに線グラフで使ったカテゴリが表示されてしまいます。積み上げグラフで使ったカテゴリに変更したいのですが方法がわかりません。 (グラフの縦軸に表示される15-1,15-2,20-1、・・・の代わりに、15歳、20歳、・・・と表示したい) 185行目でプロットに積み上げグラフで使ったデータセットをセットして、 186行目でDomainAxis(このグラフでは縦軸)にそのデータセットをマッピングしているのですが。。。 どなたかどうやったらいいのか教えてください。お願いいたします。 package chart; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import org.jfree.chart.*; import org.jfree.chart.plot.*; import org.jfree.chart.axis.*; import org.jfree.ui.*; import org.jfree.data.*; import java.awt.Color; import javax.servlet.http.HttpServlet; import org.jfree.chart.ChartFactory; import org.jfree.chart.JFreeChart; import org.jfree.chart.LegendItem; import org.jfree.chart.LegendRenderingOrder; //import org.jfree.chart.StandardLegend; import org.jfree.chart.axis.AxisLocation; import org.jfree.chart.axis.CategoryAxis; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.labels.ItemLabelAnchor; import org.jfree.chart.labels.ItemLabelPosition; import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.renderer.category.CategoryItemRenderer; import org.jfree.data.category.CategoryDataset; import org.jfree.data.general.DatasetUtilities; import org.jfree.ui.TextAnchor; import org.jfree.data.category.DefaultCategoryDataset; import org.jfree.chart.renderer.category.LineAndShapeRenderer; import org.jfree.chart.renderer.category.StackedBarRenderer; import org.jfree.chart.labels.StandardCategoryToolTipGenerator; import org.jfree.chart.title.LegendTitle; import org.jfree.chart.block.BlockBorder; import org.jfree.chart.block.BlockContainer; import org.jfree.chart.block.BorderArrangement; import org.jfree.chart.block.EmptyBlock; import org.jfree.chart.title.CompositeTitle; public class ChartServlet6 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int width = 640; int height = 640; // 線グラフのJFreeChartを作成 JFreeChart chart = createChart(); // コンテンツタイプをpngにする. response.setContentType("image/png"); OutputStream outputStream; System.err.println("write png width = " + width + " / height = " + height); try { outputStream = new BufferedOutputStream(response.getOutputStream()); // JFreeChartをPNGとして出力 ChartUtilities.writeChartAsPNG(outputStream, chart, width, height); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } } /** *線グラフのJFreeChartを作成する. */ private JFreeChart createChart () { // データ double[][] dbl=new double[][]{ {1,2,3,4,5,4,3,2,1}, {1,2,3,4,5,4,3,2,1}, {1,2,3,4,5,4,3,2,1}, {1,2,3,4,5,4,3,2,1}, {1,2,3,4,5,4,3,2,1}, {1,2,3,4,5,4,3,2,1}, {1,2,3,4,5,4,3,2,1}, {1,2,3,4,5,4,3,2,1}, {1,2,3,4,5,4,3,2,1}, {1,2,3,4,5,4,3,2,1}, {1,2,3,4,5,4,3,2,1}, {1,2,3,4,5,4,3,2,1}, {1,2,3,4,5,4,3,2,1} }; double[][] dbl2 = new double[13][18]; for(int i = 0; i < 13; i++){ for(int j = 0; j < 9; j++){ dbl2[i][j * 2] = dbl[i][j]; dbl2[i][j * 2 + 1] = dbl[i][j]; } } for(int i = 0; i < 9; i++){ for(int j = 1; j < 13; j++){ dbl2[j][i * 2] += dbl2[j - 1][i * 2]; dbl2[j][i * 2 + 1] += dbl2[j - 1][i * 2 + 1]; } } // 縦軸(DomainAxis) これを表示したい final String[] str_data_x = new String[]{ "15歳" ,"20歳" ,"25歳" ,"30歳" ,"35歳" ,"40歳" ,"45歳" ,"50歳" ,"55歳" }; // 縦軸(DomainAxis) 線グラフ描画用 final String[] str_data_x2 = new String[]{ "15-1" ,"15-2" ,"20-1" ,"20-2" ,"25-1" ,"25-2" ,"30-1" ,"30-2" ,"35-1" ,"35-2" ,"40-1" ,"40-2" ,"45-1" ,"45-2" ,"50-1" ,"50-2" ,"55-1" ,"55-2" }; // 横軸(RangeAxis) final String[] str_data_y = new String[]{ "Q1" ,"Q2" ,"Q3" ,"Q4" ,"Q5" ,"Q6" ,"Q7" ,"Q8" ,"Q9" ,"Q10" ,"Q11" ,"Q12" ,"Q13" }; // JFreeChartへのグラフデータ格納型CategoryDatasetのオブジェクトを作成 // 線グラフ用のデータセットを作成 final CategoryDataset obj_dataset = DatasetUtilities.createCategoryDataset( str_data_y ,str_data_x2 ,dbl2 ); // 線グラフ描画 final JFreeChart chart = ChartFactory.createLineChart( "" ,"" ,"" ,obj_dataset ,PlotOrientation.HORIZONTAL ,false ,false ,false ); // 積み上げグラフ用データセット作成 final CategoryDataset dataset2 = DatasetUtilities.createCategoryDataset( str_data_y, str_data_x, dbl ); // get a reference to the plot for further customisation... CategoryPlot plot = (CategoryPlot) chart.getPlot(); plot.setBackgroundPaint(new Color(0xEE, 0xEE, 0xFF)); plot.setDataset(1, dataset2); //プロットにdataset2をセット plot.mapDatasetToDomainAxis(1, 0); //ドメイン軸(このグラフでは縦軸)にdataset2をマッピング plot.mapDatasetToDomainAxis(1, 1); //ドメイン軸(このグラフでは縦軸)にdataset2をマッピング // 本来なら必要ないはず final CategoryAxis axis3 = new CategoryAxis("Secondary"); plot.setDomainAxis(1, axis3); // 積み上げグラフを描画 CategoryItemRenderer renderer2 = new StackedBarRenderer() ; renderer2.setToolTipGenerator(new StandardCategoryToolTipGenerator()); plot.setRenderer(1, renderer2); plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD); /* LegendTitle legend1 = new LegendTitle(plot.getRenderer(0)); legend1.setMargin(new RectangleInsets(2, 2, 2, 2)); legend1.setBorder(new BlockBorder()); */ LegendTitle legend2 = new LegendTitle(plot.getRenderer(1)); legend2.setMargin(new RectangleInsets(2, 2, 2, 2)); legend2.setBorder(new BlockBorder()); BlockContainer container = new BlockContainer(new BorderArrangement()); // container.add(legend1, RectangleEdge.LEFT); container.add(legend2, RectangleEdge.LEFT); container.add(new EmptyBlock(2000, 0)); CompositeTitle legends = new CompositeTitle(container); legends.setPosition(RectangleEdge.BOTTOM); chart.addSubtitle(legends); return chart; } } |
1