jfreeChart实践

最近为了画个报表 用上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()%>&notSatisfy=<%=stasticsBean.getNotSatisfy()%>"></IFRAME>
         

 

 

这是我的项目实践  你根据自己的实际情况 也可以灵活应用

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值