最近为了画个报表 用上jfeechart,有些心得 记录一下
首先 jfreechart 的应该过程是这样的。 首先构造dataset,然后就是画图了。
下面 贴些代码上来
package com.founder.common;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.io.OutputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.TimeZone;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAnchor;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.PeriodAxis;
import org.jfree.chart.axis.PeriodAxisLabelInfo;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
import org.jfree.chart.labels.StandardXYItemLabelGenerator;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.DatasetRenderingOrder;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.category.GroupedStackedBarRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.renderer.xy.StackedXYBarRenderer;
import org.jfree.chart.renderer.xy.XYStepRenderer;
import org.jfree.data.KeyToGroupMap;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.time.Month;
import org.jfree.data.time.TimeTableXYDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.RectangleInsets;
import org.jfree.ui.TextAnchor;
public class ChartDemo {
public static void main(String[] args) {
ChartDemo chartD = new ChartDemo();
// chartD.createBarDemo("ba111r.jpg", "111", "1112", "113");
// chartD.createPieDemo("pi111e.jpg", "1", "2");
// chartD.createXYBarDemo("xybar.jpg");
}
// 创建柱状图
public void createBarDemo(OutputStream stream, String satisfy, String ordinary,
String notSatisfy) {
CategoryDataset dataset = getBarDataset(satisfy, ordinary, notSatisfy);
JFreeChart chart = ChartFactory.createStackedBarChart("", "", "",
dataset, PlotOrientation.VERTICAL, false, false, false);
// 创建Renderer
GroupedStackedBarRenderer groupedstackedbarrenderer = new GroupedStackedBarRenderer();
// 创建若干组,以便可分柱状,和叠方图
KeyToGroupMap keytogroupmap = new KeyToGroupMap("G1");
// 目标为一组,实际,未完为另一组
keytogroupmap.mapKeyToGroup("计划", "G1");
keytogroupmap.mapKeyToGroup("实际", "G2");
keytogroupmap.mapKeyToGroup("未完", "G3");
// 设置组
groupedstackedbarrenderer.setSeriesToGroupMap(keytogroupmap);
// 显示数值
groupedstackedbarrenderer
.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
// 可见?
groupedstackedbarrenderer.setBaseItemLabelsVisible(true);
// 显示位置
groupedstackedbarrenderer
.setPositiveItemLabelPositionFallback(new ItemLabelPosition(
ItemLabelAnchor.CENTER, TextAnchor.BOTTOM_CENTER));
groupedstackedbarrenderer.setItemMargin(0.05000000000000001D);
// 设置显示颜色
groupedstackedbarrenderer.setSeriesPaint(0, new Color(255, 0, 0)); // 粉红
groupedstackedbarrenderer.setSeriesPaint(1, new Color(0, 0, 255));// BLUE
groupedstackedbarrenderer.setSeriesPaint(2, new Color(0, 255, 0));// 绿色
CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
categoryplot.setDomainGridlinePosition(CategoryAnchor.MIDDLE);
// 横网格线
categoryplot.setRangeGridlinesVisible(true);
// 竖风格线
categoryplot.setDomainGridlinesVisible(false);
// 横轴
CategoryAxis domainAxis = categoryplot.getDomainAxis();
// 间隔
domainAxis.setCategoryMargin(0.2);
// 竖轴
// ValueAxis valueaxis = categoryplot.getRangeAxis();
// 设置数值显示范围
// valueaxis.setRange(0.0D, 30000D);
categoryplot.setRenderer(groupedstackedbarrenderer);
categoryplot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
categoryplot.setDataset(1, dataset);
categoryplot.mapDatasetToRangeAxis(1, 1);
// categoryplot.mapDatasetToRangeAxis(1, 2);
NumberAxis numberaxis = new NumberAxis("");
// numberaxis.setRange(0,90000);
// 设置右边的Y轴
categoryplot.setRangeAxis(1, numberaxis);
// LineAndShapeRenderer lineandshaperenderer = new
// LineAndShapeRenderer();
// lineandshaperenderer
// .setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());
// lineandshaperenderer.setSeriesPaint(0, new Color(255, 137, 255)); //
// 粉红
// lineandshaperenderer.setSeriesPaint(1, new Color(0, 11, 220)); // 蓝色
// categoryplot.setRenderer(1, lineandshaperenderer);
categoryplot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
this.savejpg(chart, stream);
}
// 获取柱状图数据
private CategoryDataset getBarDataset(String satisfy, String ordinary,
String notSatisfy) {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(Double.parseDouble(satisfy.replaceAll("%", "")), "1",
" ");
dataset.addValue(0, "2", " ");
dataset.addValue(Double.parseDouble(ordinary.replaceAll("%", "")), "2",
" ");
dataset.addValue(0, "3", " ");
dataset.addValue(0, "3", " ");
dataset.addValue(Double.parseDouble(notSatisfy.replaceAll("%", "")),
"3", " ");
return dataset;
}
public void createBarDemo(OutputStream stream, String satisfyAndOrdinary,
String notSatisfy) {
CategoryDataset dataset = getBarDataset(satisfyAndOrdinary, notSatisfy);
JFreeChart chart = ChartFactory.createStackedBarChart("", "", "",
dataset, PlotOrientation.VERTICAL, false, false, false);
// 创建Renderer
GroupedStackedBarRenderer groupedstackedbarrenderer = new GroupedStackedBarRenderer();
// 创建若干组,以便可分柱状,和叠方图
KeyToGroupMap keytogroupmap = new KeyToGroupMap("G1");
// 目标为一组,实际,未完为另一组
keytogroupmap.mapKeyToGroup("计划", "G1");
keytogroupmap.mapKeyToGroup("实际", "G2");
keytogroupmap.mapKeyToGroup("未完", "G3");
// 设置组
groupedstackedbarrenderer.setSeriesToGroupMap(keytogroupmap);
// 显示数值
groupedstackedbarrenderer
.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
// 可见?
groupedstackedbarrenderer.setBaseItemLabelsVisible(true);
// 显示位置
groupedstackedbarrenderer
.setPositiveItemLabelPositionFallback(new ItemLabelPosition(
ItemLabelAnchor.CENTER, TextAnchor.BOTTOM_CENTER));
groupedstackedbarrenderer.setItemMargin(0.05000000000000001D);
// 设置显示颜色
groupedstackedbarrenderer.setSeriesPaint(0, new Color(255, 0, 0)); // 粉红
groupedstackedbarrenderer.setSeriesPaint(1, new Color(0, 0, 255));// BLUE
groupedstackedbarrenderer.setSeriesPaint(2, new Color(0, 255, 0));// 绿色
CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
categoryplot.setDomainGridlinePosition(CategoryAnchor.MIDDLE);
// 横网格线
categoryplot.setRangeGridlinesVisible(true);
// 竖风格线
categoryplot.setDomainGridlinesVisible(false);
// 横轴
CategoryAxis domainAxis = categoryplot.getDomainAxis();
// 间隔
domainAxis.setCategoryMargin(0.2);
// 竖轴
// ValueAxis valueaxis = categoryplot.getRangeAxis();
// 设置数值显示范围
// valueaxis.setRange(0.0D, 30000D);
categoryplot.setRenderer(groupedstackedbarrenderer);
categoryplot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
categoryplot.setDataset(1, dataset);
categoryplot.mapDatasetToRangeAxis(1, 1);
// categoryplot.mapDatasetToRangeAxis(1, 2);
NumberAxis numberaxis = new NumberAxis("");
// numberaxis.setRange(0,90000);
// 设置右边的Y轴
categoryplot.setRangeAxis(1, numberaxis);
LineAndShapeRenderer lineandshaperenderer = new LineAndShapeRenderer();
lineandshaperenderer
.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());
lineandshaperenderer.setSeriesPaint(0, new Color(255, 137, 255)); // 粉红
lineandshaperenderer.setSeriesPaint(1, new Color(0, 11, 220)); // 蓝色
categoryplot.setRenderer(1, lineandshaperenderer);
categoryplot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
this.savejpg(chart, stream);
}
// 获取柱状图数据
private CategoryDataset getBarDataset(String satisfyAndOrdinary,
String notSatisfy) {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
dataset.addValue(Double.parseDouble(satisfyAndOrdinary.replaceAll("%",
"")), "1", " ");
dataset.addValue(0, "2", " ");
dataset.addValue(Double.parseDouble(notSatisfy.replaceAll("%", "")),
"2", " ");
return dataset;
}
// 创建饼图
public void createPieDemo(OutputStream stream, String satisfy, String ordinary,
String notSatisfy) {
DefaultPieDataset dataset = getPieDataset(satisfy, ordinary, notSatisfy);
JFreeChart chart = ChartFactory.createPieChart3D("", dataset, false,
true, false);
chart.setBackgroundPaint(Color.white);
this.savejpg(chart, stream);
}
// 获取饼图数据
private DefaultPieDataset getPieDataset(String satisfy, String ordinary,
String notSatisfy) {
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue(satisfy, Double.parseDouble(satisfy
.replaceAll("%", "")));
dataset.setValue(ordinary, Double.parseDouble(ordinary.replaceAll("%",
"")));
dataset.setValue(notSatisfy, Double.parseDouble(notSatisfy.replaceAll(
"%", "")));
return dataset;
}
public void createPieDemo(OutputStream stream, String satisfyAndOrdinary,
String notSatisfy) {
DefaultPieDataset dataset = getPieDataset(satisfyAndOrdinary,
notSatisfy);
JFreeChart chart = ChartFactory.createPieChart3D("", dataset, false,
true, false);
//chart.setBackgroundPaint(Color.white);
this.savejpg(chart, stream);
}
// 获取饼图数据
private DefaultPieDataset getPieDataset(String satisfyAndOrdinary,
String notSatisfy) {
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue(satisfyAndOrdinary, Double
.parseDouble(satisfyAndOrdinary.replaceAll("%", "")));
dataset.setValue(notSatisfy, Double.parseDouble(notSatisfy.replaceAll(
"%", "")));
return dataset;
}
// 保存为本地图片
private void savejpg(JFreeChart chart, OutputStream stream) {
try {
ChartUtilities
.writeChartAsJPEG(stream, 0.5f, chart, 323, 151, null);
} catch (Exception e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} finally {
}
}
// 创建XYBar
public void createXYBarDemo(OutputStream stream) {
TimeTableXYDataset dataset = this.getXYDataset();
// 设置X坐标轴
PeriodAxis periodaxis = new PeriodAxis("时间");
periodaxis.setTimeZone(TimeZone.getTimeZone("Pacific/Auckland"));
periodaxis.setAutoRangeTimePeriodClass(org.jfree.data.time.Month.class);
periodaxis.setMajorTickTimePeriodClass(org.jfree.data.time.Month.class);
PeriodAxisLabelInfo aperiodaxislabelinfo[] = new PeriodAxisLabelInfo[2];
aperiodaxislabelinfo[0] = new PeriodAxisLabelInfo(
org.jfree.data.time.Month.class, new SimpleDateFormat("MMM"),
new RectangleInsets(2D, 2D, 2D, 2D), new Font("SansSerif", 1,
10), Color.BLACK, false, new BasicStroke(0.0F),
Color.lightGray);
aperiodaxislabelinfo[1] = new PeriodAxisLabelInfo(
org.jfree.data.time.Year.class, new SimpleDateFormat("yyyy"));
periodaxis.setLabelInfo(aperiodaxislabelinfo);
periodaxis.setLowerMargin(0.01D);
periodaxis.setUpperMargin(0.01D);
// 设置Y坐标轴
NumberAxis numberaxis = new NumberAxis("登入次数");
numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
numberaxis.setUpperMargin(0.10000000000000001D);
numberaxis.setRange(0, 20000);
// 设置Renderer
StackedXYBarRenderer stackedxybarrenderer = new StackedXYBarRenderer(
0.14999999999999999D);
stackedxybarrenderer.setDrawBarOutline(true);
stackedxybarrenderer.setBaseItemLabelsVisible(false);
stackedxybarrenderer
.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());
stackedxybarrenderer
.setBasePositiveItemLabelPosition(new ItemLabelPosition(
ItemLabelAnchor.OUTSIDE12, TextAnchor.BOTTOM_CENTER));
stackedxybarrenderer
.setBaseToolTipGenerator(new StandardXYToolTipGenerator(
"{0} : {1} = {2}", new SimpleDateFormat("yyyy"),
new DecimalFormat("0")));
stackedxybarrenderer.setMargin(0.2);
stackedxybarrenderer.setSeriesPaint(0, new Color(0, 11, 220));
stackedxybarrenderer.setSeriesPaint(1, new Color(51, 129, 50));
stackedxybarrenderer.setSeriesPaint(2, new Color(255, 0, 0));
XYPlot plot = new XYPlot(dataset, periodaxis, numberaxis,
stackedxybarrenderer);// 数据集,X轴,Y轴,renderer
plot.setRangeGridlinesVisible(true);
plot.setDomainGridlinesVisible(false);
JFreeChart chart = new JFreeChart("工作量统计", plot);
XYPlot xyplot1 = (XYPlot) chart.getPlot();
XYStepRenderer xysteprenderer1 = new XYStepRenderer();
xysteprenderer1.setBaseShapesVisible(true);
xysteprenderer1.setSeriesStroke(0, new BasicStroke(1F));
xysteprenderer1.setSeriesPaint(0, new Color(255, 0, 0));
// xysteprenderer1.setBaseToolTipGenerator(new
// StandardXYToolTipGenerator());
// xysteprenderer1.setDefaultEntityRadius(6);
xyplot1.setDataset(1, getXYDatasetLevel1());
xyplot1.setRenderer(1, xysteprenderer1);
XYStepRenderer xysteprenderer2 = new XYStepRenderer();
xysteprenderer2.setBaseShapesVisible(true);
xysteprenderer2.setSeriesStroke(0, new BasicStroke(2.0F));
xysteprenderer2.setSeriesPaint(0, Color.yellow);
xyplot1.setDataset(2, getXYDatasetLevel2());
xyplot1.setRenderer(2, xysteprenderer2);
this.savejpg(chart, stream);
}
private TimeTableXYDataset getXYDataset() {
TimeTableXYDataset dataset = new TimeTableXYDataset();
dataset.add(new Month(1, 2005), 8000, "已完");
dataset.add(new Month(1, 2005), 2000, "未完");
dataset.add(new Month(2, 2005), 8000, "未完");
return dataset;
}
private XYDataset getXYDatasetLevel1() {
TimeTableXYDataset ttd1 = new TimeTableXYDataset();// 目标
ttd1.add(new Month(1, 2005), 8000, "目标");
ttd1.add(new Month(2, 2005), 9000, "目标");
ttd1.add(new Month(3, 2005), 10000, "目标");
return ttd1;
}
private XYDataset getXYDatasetLevel2() {
TimeTableXYDataset ttd2 = new TimeTableXYDataset();// 分布
ttd2.add(new Month(1, 2005), 2000, "分布");
ttd2.add(new Month(2, 2005), 2000, "分布");
return ttd2;
}
}
最后讲下 页面是如何展现的。
一般页面展现主要有两种:第一 将它存为图片,页面调用图片就ok了。
第二,将直接流直接传到jsp 里 response 出来
<%@ page language="java" import="com.founder.common.*"
contentType="image/jpeg;charset=utf-8"%>
<%
ChartDemo chartD = new ChartDemo();
String notSatisfy = request.getParameter("notSatisfy") == null ? "0%"
: request.getParameter("notSatisfy");
;
String ordinary = request.getParameter("ordinary") == null ? "0%"
: request.getParameter("ordinary");
String satisfy = request.getParameter("satisfy") == null ? "0%"
: request.getParameter("satisfy");
chartD.createBarDemo(response.getOutputStream(),satisfy,ordinary,notSatisfy);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'satisfyOrdinaryBar.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
</body>
</html>
response.getOutputStream(), 这个方法 就将流数据 打到页面中 还要注意的是contentType="image/jpeg
在其他页面 用ifame 把这个页面嵌入 就ok了
<td align="center" bgcolor="#FFFFFF"><IFRAME style="background-color=transparent" ID=IFrame1 FRAMEBORDER=0 SCROLLING=NO width="283" height="201" SRC="<%=path %>/statisticsManage/satisfyStatisticsPie.jsp?satisfy=<%=stasticsBean.getSatisfy()%>&ordinary=<%=stasticsBean.getOrdinary()%>¬Satisfy=<%=stasticsBean.getNotSatisfy()%>"></IFRAME>
这是我的项目实践 你根据自己的实际情况 也可以灵活应用