- PR -

JFreeChartでグラフを重ねる

1
投稿者投稿内容
タマ
ベテラン
会議室デビュー日: 2004/08/08
投稿数: 56
投稿日時: 2004-08-20 21:37
JFreechartを使用して積み上げグラフと同時に線グラフを出したいと思っております。

積み上げグラフのみは出せたのですが、その上に線グラフを出すことができず
困っております。

線グラフのデータはコメントアウトAの部分です。

教えていただけないでしょうか。





============================================================================

package common;

import java.io.*;
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.Legend;
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.StandardCategoryLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.CategoryItemRenderer;
import org.jfree.data.CategoryDataset;
import org.jfree.data.DatasetUtilities;
import org.jfree.ui.TextAnchor;

public class test4 extends HttpServlet {

protected void doGet(HttpServletRequest req, HttpServletResponse res) {
int width = 640;
int height = 640;

try {
// 縦横サイズの指定
width = Integer.parseInt(req.getParameterValues ("width")[0]);
height = Integer.parseInt(req.getParameterValues ("height")[0]);
} catch (Exception e) {
e.printStackTrace();
}

// 棒グラフのJFreeChartを作成
JFreeChart chart = createChart();
// コンテンツタイプをpngにする.
res.setContentType("image/png");
OutputStream outputStream;
System.err.println("write png width = " + width + " / height = " + height);
try {
outputStream = new BufferedOutputStream(res.getOutputStream());
// JFreeChartをPNGとして出力
ChartUtilities.writeChartAsPNG(outputStream, chart, width, height);
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 棒グラフのJFreeChartを作成する.
*/
private JFreeChart createChart () {
// データ
final double[][] dbl_data = new double[][]{
{1.0, 4.0, 3.0, 5.0, 0}
,{5.0, 7.0, 6.0, 8.0, 0}
,{4.0, 3.0, 2.0, 3.0, 0}
,{0.0, 7.0, 6.0, 8.0, 0}
,{1.0, 4.0, 3.0, 5.0, 0}
,{5.0, 7.0, 6.0, 8.0, 0}
,{4.0, 3.0, 2.0, 3.0, 0}
,{5.0, 7.0, 6.0, 10.0, 0}

};

// 横軸
final String[] str_data_x = new String[]{
"10/11"
,"10/12"
,"10/13"
,"10/14"
,""
};

// 縦軸
final String[] str_data_y = new String[]{
"aaa"
,"bbb"
,"故障A"
,"故障B"
,"故障C"
,"故障D"
,"故障E"
,"故障F"
};

// JFreeChartへのグラフデータ格納型CategoryDatasetのオブジェクトを作成
final CategoryDataset obj_dataset = DatasetUtilities.createCategoryDataset(
str_data_y
,str_data_x
,dbl_data
);


final JFreeChart obj_chart = ChartFactory.createStackedBarChart3D(
""
,""
,"%"
,obj_dataset
,PlotOrientation.VERTICAL
,true
,true
,true
);

// ------------------------------
// コメントアウトA
// このようなグラフを追加したい
//DefaultCategoryDataset dataset1 = new DefaultCategoryDataset();
//dataset1.addValue(1.0, "S1", "10/11");
//dataset1.addValue(4.0, "S1", "10/12");
//dataset1.addValue(3.0, "S1", "10/13");
//dataset1.addValue(5.0, "S1", "10/15");
//dataset1.addValue(5.0, "S1", "");
// -----------------------------


// 背景色の設定(GREEN)
// chart.setBackgroundPaint(new Color(0xCC, 0xFF, 0xCC));
// 背景色の設定(BLUE)
//obj_chart.setBackgroundPaint(new Color(222, 222, 255));
obj_chart.setBackgroundPaint(new Color(255, 255, 255));

final StandardLegend legend = (StandardLegend) obj_chart.getLegend();
legend.setRenderingOrder(LegendRenderingOrder.REVERSE);
final CategoryPlot plot = (CategoryPlot) obj_chart.getPlot();
final CategoryItemRenderer renderer = plot.getRenderer();

CategoryAxis domainAxis = plot.getDomainAxis();
plot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
domainAxis.setCategoryMargin(0.;

// 積み上げグラフの説明文の位置設定
obj_chart.getLegend().setAnchor(Legend.EAST);
// グリッド線の色を設定
plot.setDomainGridlinePaint(Color.black);
plot.setRangeGridlinePaint(Color.black);

// グラフバー内に数字を出力する方法
renderer.setLabelGenerator(new StandardCategoryLabelGenerator());
renderer.setItemLabelsVisible(true);
renderer.setPositiveItemLabelPosition(
new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER)
);
renderer.setNegativeItemLabelPosition(
new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER)
);


final ValueAxis obj_rangeAxis = plot.getRangeAxis();

// trueにするとsetRangeの値を自動で設定する。
obj_rangeAxis.setAutoRange(false);
obj_rangeAxis.setRange(0.0, 100.0);

return obj_chart;

}

}

============================================================================



[ メッセージ編集済み 編集者: 未記入 編集日時 2004-08-21 01:38 ]
itoh
会議室デビュー日: 2003/08/18
投稿数: 2
投稿日時: 2004-08-23 11:39
JFreeChart 学習中の身です。

とりあえず線は出るようになりました。
import の必要なクラスがありますので、
適宜追加修正して下さい。

============================================================================

// trueにするとsetRangeの値を自動で設定する。
obj_rangeAxis.setAutoRange(false) ;
obj_rangeAxis.setRange(0.0, 100.0) ;

// 以下4行追加
CategoryItemRenderer renderer1 = new LineAndShapeRenderer() ;
plot.setDataset(1, dataset1) ;
plot.setRenderer(1, renderer1) ;
plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD) ;

return obj_chart ;
}
}

============================================================================

追加する位置が上記で良いのかどうか等、
何が正解かまでは私も理解出来ていませんので、
御参考程度にでもなりましたら…。
タマ
ベテラン
会議室デビュー日: 2004/08/08
投稿数: 56
投稿日時: 2004-08-23 21:16
ありがとうございました。
本当に助かりました!HPでも調べるものがなさ過ぎるんで、、、

お聞きしたいのですが、この方法だと、棒線グラフの色が積み上げグラフの後に
設定されるため固定色になりません。

先に棒グラフを書く方法を試してみましたが、うまい具合に積み上げグラフがでませんでした。

ご存知でしたら教えていただけないでしょうか?
itoh
会議室デビュー日: 2003/08/18
投稿数: 2
投稿日時: 2004-08-24 00:13
お役に立てたようで良かったです。
ホントに情報が少ないですよね…。
英語のドキュメントとサンプルコードでチマチマやってますが、
時間が幾らあっても足りないと言うか…。

さて、線の色を変更されたい、ということですよね?
勉強不足なもので、今回は良い答えを持ち合わせておりません。
私も今、JFreeChart に取り組んでいる最中ですので、
何か分かったらお知らせしたいと思います。

いずれにしても、色々と試してみるしかなさそうですね。
yuu
大ベテラン
会議室デビュー日: 2002/06/12
投稿数: 152
お住まい・勤務地: 美味しいケーキ店のそば
投稿日時: 2004-08-24 11:55
未記入さん、はじめまして

昨年、JFreeChart でアプリを作ったのですが、もう詳しいところは忘れてしまいました

線に色やスタイルを設定するには以下のようにしています。
java.awt.XXX をimport する必要があります。

コード:
		// Char を作成
		JFreeChart chart = ChartFactory.createTimeSeriesChart(
		"履歴", "時間", "価格",
							dataset, true, true, false);
		chart.setBackgroundPaint(Color.white);
		// グラフの数				
		int nLines = dataset.getSeriesCount();
                                                              
		StandardLegend sl = (StandardLegend) chart.getLegend();
		sl.setDisplaySeriesShapes(true);
                                                              
		XYPlot plot = chart.getXYPlot();
		XYItemRenderer r = plot.getRenderer();
		StandardXYItemRenderer renderer = (StandardXYItemRenderer) r;
		renderer.setPlotShapes(true);
		renderer.setDefaultShapesFilled(new Boolean(true));
		//	線の色、線種の設定
		for (int i = 0; i < nLines; i++) {
			if (dataset.getSeriesName(i).equals("")) {
				// 名前の無いデータはダミーなので別の設定
				renderer.setSeriesPaint(i, Color.gray);
				renderer.setSeriesShape(i, nullShape);
				continue;
			}
			int colorIx = i % colorPattern.length;
			int shapeIx = (i / colorPattern.length) % shapePattern.length;
			renderer.setSeriesPaint(i, colorPattern[colorIx]);
			renderer.setSeriesShape(i, shapePattern[shapeIx]);
		}		

1

スキルアップ/キャリアアップ(JOB@IT)