jfreechart生成不同统计图

来源:互联网 发布:数据挖掘分析技术 编辑:程序博客网 时间:2024/04/30 06:08

package com.jfc.ww.servlet;

import java.awt.Color;
import java.awt.Font;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.DateTickUnitType;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DatasetGroup;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.time.Day;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.date.SerialDateUtilities;
import org.jfree.ui.TextAnchor;


public class JFreeCharServilet extends HttpServlet {
 

 public void doGet(HttpServletRequest request, HttpServletResponse response){
  response.setContentType("text/html");
  this.doPost(request, response);
 }

 
 public void doPost(HttpServletRequest request, HttpServletResponse response){
  response.setContentType("text/html");
  HttpSession session =request.getSession();
  String fileType=request.getParameter("fileType");
  String fileName=null;
  if(fileType.equals("pie")){
   fileName=this.pieTest(session);
  }else if(fileType.equals("bar")){
   fileName=this.barTest(session);
  }else if(fileType.equals("stackedBar")){
   fileName=this.stackedBarTest(session);
  }else if(fileType.equals("line")){
   fileName=this.lineTest(session);
  }else if(fileType.equals("timeSeries")){
   fileName=this.timeSeriesTest(session);
  }
  request.setAttribute("fileName", fileName);
  try {
   request.getRequestDispatcher("content.jsp").forward(request, response);
  } catch (ServletException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
 
 //饼状图
 public String pieTest(HttpSession session){
  String fileName = null;
  DefaultPieDataset dfd=new DefaultPieDataset();
  dfd.setValue("张三", 10);
  dfd.setValue("李四", 15);
  dfd.setValue("ccc", 30);
  dfd.setValue("ddd", 25);
  dfd.setValue("eee", 5);
  JFreeChart jfc=ChartFactory.createPieChart3D("饼状图统计", dfd, true, true, true);
  jfc.getTitle().setFont(new Font("隶书",Font.BOLD,20));//设置标题字体 防止中文乱码
     PiePlot plot=(PiePlot)jfc.getPlot();//设置饼中字体 防止中文乱麻
     plot.setLabelFont(new Font("宋体",Font.BOLD,20));
     plot.setNoDataMessage("暂无数据");
     plot.setCircular(true);
     plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0} {2}",NumberFormat.getNumberInstance(),new DecimalFormat("0.00%")));
     plot.setForegroundAlpha(0.7f);//透明度
     LegendTitle legendtitle=jfc.getLegend(0); //设置低栏字体 防止中文乱码
     legendtitle.setItemFont(new Font("宋体",Font.ITALIC,20));
        ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
        try {
   fileName=ServletUtilities.saveChartAsPNG(jfc, 800, 500, info, session);
  } catch (IOException e) {
   e.printStackTrace();
  }
  return fileName;
 }
 
 
 //柱状图
 public String barTest(HttpSession session){
  String fileName = null;
  DefaultCategoryDataset dataset=new DefaultCategoryDataset();
  dataset.addValue(300, "广州", "苹果");
  dataset.addValue(200, "广州", "梨子");
  dataset.addValue(500, "广州", "葡萄");
  dataset.addValue(340, "广州", "芒果");
  dataset.addValue(280, "广州", "荔枝");
  JFreeChart jfc=ChartFactory.createBarChart3D("柱状图统计", "水果", "销量", dataset, PlotOrientation.VERTICAL, true, true, true);
  jfc.setTitle(new TextTitle("柱状图统计", new Font("隶书", Font.BOLD+ Font.ITALIC, 20)));
  CategoryPlot plot = (CategoryPlot) jfc.getPlot();
  CategoryAxis domainAxis=plot.getDomainAxis();
  domainAxis.setVisible(true);
  domainAxis.setLowerMargin(0.1);
  domainAxis.setUpperMargin(0.1);
  domainAxis.setLabelFont(new Font("微软雅黑", Font.BOLD, 12));//横轴坐标标题字体
  domainAxis.setTickLabelFont(new Font("微软雅黑", Font.BOLD, 12));//横轴柱体标题字体
  NumberAxis numberAxis = (NumberAxis)plot.getRangeAxis();
  numberAxis.setLabelFont(new Font("微软雅黑", Font.BOLD, 12));//纵轴坐标标题字体
  ValueAxis valueAxis=plot.getRangeAxis();
  valueAxis.setPositiveArrowVisible(true);//是否显示纵轴坐标只想剪头
  BarRenderer renderer = (BarRenderer)plot.getRenderer();  
  //显示每个柱的数值,并修改该数值的字体属性
  renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
  renderer.setItemLabelFont(new Font("黑体",Font.PLAIN,9));
  renderer.setItemLabelsVisible(true);
  plot.setRenderer(renderer);
  plot.setForegroundAlpha(0.8f);//透明度
  LegendTitle legendtitle=jfc.getLegend(0); //设置低栏字体 防止中文乱码
     legendtitle.setItemFont(new Font("宋体",Font.ITALIC,20));
  try {
   fileName=ServletUtilities.saveChartAsPNG(jfc, 800, 500, null, session);
  } catch (IOException e) {
   e.printStackTrace();
  }
  return fileName;
 }
 
 
 //堆柱状图
 public String stackedBarTest(HttpSession session){
  String fileName = null;
  double [][] data=new double[][]{{365,321,257,156,147},{369,214,587,263,666},{236,987,546,258,418},{369,258,147,456,122},{759,153,751,359,951}};
  String [] rowKeys={"苹果","梨子","葡萄","香蕉","橘子"};
  String [] columnKeys={"北京","上海","广州","深圳","大连"};
  CategoryDataset dataset=DatasetUtilities.createCategoryDataset(rowKeys, columnKeys,data);
  JFreeChart jfc=ChartFactory.createStackedBarChart3D("堆柱状图统计", "水果", "销量", dataset, PlotOrientation.VERTICAL, true, true, true);
  jfc.setTitle(new TextTitle("堆柱状图统计", new Font("隶书", Font.ITALIC+ Font.ITALIC, 20)));
  CategoryPlot plot = (CategoryPlot) jfc.getPlot();
  CategoryAxis domainAxis=plot.getDomainAxis();
  domainAxis.setVisible(true);
  domainAxis.setLowerMargin(0.05);
  domainAxis.setUpperMargin(0.05);
  domainAxis.setLabelFont(new Font("微软雅黑", Font.BOLD, 12));//横轴坐标标题字体
  domainAxis.setTickLabelFont(new Font("微软雅黑", Font.BOLD, 12));//横轴柱体标题字体
  NumberAxis numberAxis = (NumberAxis)plot.getRangeAxis();
  numberAxis.setLabelFont(new Font("微软雅黑", Font.BOLD, 12));//纵轴坐标标题字体
  ValueAxis valueAxis=plot.getRangeAxis();
  valueAxis.setPositiveArrowVisible(true);//是否显示纵轴坐标指向剪头
  BarRenderer renderer = new BarRenderer3D();
  renderer.setMaximumBarWidth(0.5);//柱体宽度
        renderer.setItemMargin(0.05);//组内柱子间隔
        //显示每个柱的数值,并修改该数值的字体属性
        renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
        renderer.setItemLabelFont(new Font("黑体",Font.BOLD,8));//6号黑体加粗
        renderer.setItemLabelPaint(Color.black);//字体为黑色
        renderer.setItemLabelsVisible(true);
        //显示每个柱的数值,并修改该数值的字体属性
  renderer.setItemMargin(0.01);
  plot.setRenderer(renderer);
  plot.setForegroundAlpha(0.8f);//透明度
  LegendTitle legendtitle=jfc.getLegend(0); //设置低栏字体 防止中文乱码
     legendtitle.setItemFont(new Font("宋体",Font.ITALIC,20));
  try {
   fileName=ServletUtilities.saveChartAsPNG(jfc, 800, 500, null, session);
  } catch (IOException e) {
   e.printStackTrace();
  }
  return fileName;
 }
 
 //折线图
 public String lineTest(HttpSession session){
  String fileName = null;
  DefaultCategoryDataset linedataset = new DefaultCategoryDataset();
    //各曲线名称
    String series1 = "冰箱";
    String series2 = "彩电";
    String series3 = "洗衣机";

    //横轴名称(列名称)
    String type1 = "1月";
    String type2 = "2月";
    String type3 = "3月";
    String type4 = "4月";
    String type5 = "5月";
    String type6 = "6月";

    linedataset.addValue(0.0, series1, type1);
    linedataset.addValue(4.2, series1, type2);
    linedataset.addValue(3.9, series1, type3);
    linedataset.addValue(3.5, series1, type4);
    linedataset.addValue(5.4, series1, type5);
    linedataset.addValue(8.0, series1, type6);

    linedataset.addValue(1.0, series2, type1);
    linedataset.addValue(5.2, series2, type2);
    linedataset.addValue(7.9, series2, type3);
    linedataset.addValue(2.2, series2, type4);
    linedataset.addValue(9.0, series2, type5);
    linedataset.addValue(3.5, series2, type6);

    linedataset.addValue(2.0, series3, type1);
    linedataset.addValue(9.2, series3, type2);
    linedataset.addValue(8.9, series3, type3);
    linedataset.addValue(5.4, series3, type4);
    linedataset.addValue(4.1, series3, type5);
    linedataset.addValue(2.8, series3, type6);

    JFreeChart jfc = ChartFactory.createLineChart("折线图","时间","销售额(百万)",linedataset,PlotOrientation.VERTICAL,true,true,false);
    jfc.setTitle(new TextTitle("折线图统计", new Font("隶书", Font.BOLD+ Font.ITALIC, 20)));
   CategoryPlot plot = (CategoryPlot) jfc.getPlot();
   CategoryAxis domainAxis=plot.getDomainAxis();
   domainAxis.setVisible(true);
   domainAxis.setLowerMargin(0.05);
   domainAxis.setUpperMargin(0.05);
   domainAxis.setLabelFont(new Font("微软雅黑", Font.BOLD, 12));//横轴坐标标题字体
   domainAxis.setTickLabelFont(new Font("微软雅黑", Font.BOLD, 12));//横轴柱体标题字体
   NumberAxis numberAxis = (NumberAxis)plot.getRangeAxis();
   numberAxis.setLabelFont(new Font("微软雅黑", Font.BOLD, 12));//纵轴坐标标题字体
   numberAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
   numberAxis.setAutoRangeIncludesZero(true);
   numberAxis.setUpperMargin(0.10);
   numberAxis.setLabelAngle(Math.PI / 2.0);
   ValueAxis valueAxis=plot.getRangeAxis();
   valueAxis.setPositiveArrowVisible(true);//是否显示纵轴坐标指向剪头
   LegendTitle legendtitle=jfc.getLegend(0); //设置低栏字体 防止中文乱码
      legendtitle.setItemFont(new Font("宋体",Font.ITALIC,20));
      //设置折点突出显示
      LineAndShapeRenderer renderer=(LineAndShapeRenderer)plot.getRenderer();
      renderer.setShapesVisible(true);
      renderer.setDrawOutlines(true);
      renderer.setUseFillPaint(true);
      renderer.setFillPaint(java.awt.Color.white);
      //显示折点数值
      renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
         renderer.setItemLabelFont(new Font("宋体",Font.BOLD,10));//6号黑体加粗
         renderer.setItemLabelPaint(Color.black);//字体为黑色
         renderer.setItemLabelsVisible(true);
  try {
   fileName=ServletUtilities.saveChartAsPNG(jfc, 800, 500, null, session);
  } catch (IOException e) {
   e.printStackTrace();
  }
  return fileName;
 }
 
 //时序图
 public String timeSeriesTest(HttpSession session){
  String fileName = null;
  XYDataset timeSeriesCollection =null;
  TimeSeries timeseries = new TimeSeries("Data");  
  Day day = new Day(1,1,2010); //实例化Day         
  double d = 3000D;         
  //添加一年365天的数据         
  for (int i=0;i<365;i++){              
   d=d+(Math.random()-0.5)*10; //创建随机数据             
   timeseries.add(day,d); //向数据集合中添加数据             
   day=(Day)day.next();          
  }         
  //创建TimeSeriesCollection集合对象         
  timeSeriesCollection =new TimeSeriesCollection(timeseries); 
  JFreeChart jfc = ChartFactory.createTimeSeriesChart("时序图统计","销售月份","销量(份)",timeSeriesCollection,false,false,false); 
  jfc.setTitle(new TextTitle("时序图统计", new Font("隶书", Font.BOLD+ Font.ITALIC, 20)));
  //设置标题字体         
  jfc.getTitle().setFont(new Font("隶书", Font.BOLD, 26));                   
  //jfc.setBackgroundPaint(new Color(252,175,222));//设置背景色         
  XYPlot plot = jfc.getXYPlot();        //获取图表的绘制属性         
  plot.setDomainGridlinesVisible(true);  //设置网格不显示                   
  DateAxis dateAxis = (DateAxis) plot.getDomainAxis(); //获取时间轴对象        
  dateAxis.setLabelFont(new Font("黑体", Font.ITALIC , 18));   //设置时间轴字体                   
  dateAxis.setTickLabelFont(new Font("宋体",Font.PLAIN,12)); //设置时间轴标尺值字体        
  dateAxis.setLowerMargin(0.0);       //设置时间轴上显示的最小值                   
  ValueAxis valueAxis = plot.getRangeAxis(); //获取数据轴对象        
  valueAxis.setLabelFont(new Font("黑体", Font.ITALIC , 18));  //设置数据字体         
  DateFormat format = new SimpleDateFormat("MM月份");   //创建日期格式对象                  
  DateTickUnit dtu = new DateTickUnit(DateTickUnitType.DAY,29,format);   //创建DateTickUnit对象       
  dateAxis.setTickUnit(dtu);          //设置日期轴的日期标签 
  try {
   fileName=ServletUtilities.saveChartAsPNG(jfc, 800, 500, null, session);
  } catch (IOException e) {
   e.printStackTrace();
  }
  return fileName;
 }
 

 

 

/**
 public static void main(String [] args){
  XYDataset timeSeriesCollection =null;
  TimeSeries timeseries = new TimeSeries("Data");  
  Day day = new Day(1,1,2010); //实例化Day         
  double d = 3000D;         
  //添加一年365天的数据         
  for (int i=0;i<365;i++){              
   d=d+(Math.random()-0.5)*10; //创建随机数据             
   timeseries.add(day,d); //向数据集合中添加数据             
   day=(Day)day.next();          
  }         
  //创建TimeSeriesCollection集合对象         
  timeSeriesCollection =new TimeSeriesCollection(timeseries); 
  JFreeChart jfc = ChartFactory.createTimeSeriesChart("时序图统计","销售月份","销量(份)",timeSeriesCollection,false,false,false); 
  jfc.setTitle(new TextTitle("时序图统计", new Font("隶书", Font.BOLD+ Font.ITALIC, 20)));
  //设置标题字体         
  jfc.getTitle().setFont(new Font("隶书", Font.BOLD, 26));                   
  //jfc.setBackgroundPaint(new Color(252,175,222));//设置背景色         
  XYPlot plot = jfc.getXYPlot();        //获取图表的绘制属性         
  plot.setDomainGridlinesVisible(true);  //设置网格不显示                   
  DateAxis dateAxis = (DateAxis) plot.getDomainAxis(); //获取时间轴对象        
  dateAxis.setLabelFont(new Font("黑体", Font.ITALIC , 18));   //设置时间轴字体                   
  dateAxis.setTickLabelFont(new Font("宋体",Font.PLAIN,12)); //设置时间轴标尺值字体        
  dateAxis.setLowerMargin(0.0);       //设置时间轴上显示的最小值                   
  ValueAxis valueAxis = plot.getRangeAxis(); //获取数据轴对象        
  valueAxis.setLabelFont(new Font("黑体", Font.ITALIC , 18));  //设置数据字体         
  DateFormat format = new SimpleDateFormat("MM月份");   //创建日期格式对象                  
  DateTickUnit dtu = new DateTickUnit(DateTickUnitType.DAY,29,format);   //创建DateTickUnit对象       
  dateAxis.setTickUnit(dtu);          //设置日期轴的日期标签 
  
  
  ChartFrame cf=new ChartFrame("JFreeChar测试",jfc,true);
  cf.pack();
  cf.setVisible(true);
  
  
 }

 
 **/
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

接收页面

</head>
  <%
    String filename=(String)request.getAttribute("fileName");
     String graphurl = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;
    %>
  <body>
    <img   src= "<%=graphurl %>"   width="800"   height="500"   border="0"   usemap="#<%=filename %>" align="middle"/> 
  </body>
</html>

 

 

 

 

 

 

 

 

 

xml文件配置

<servlet>
     <servlet-name>DisplayChart</servlet-name>
     <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>DisplayChart</servlet-name>
      <url-pattern>/servlet/DisplayChart</url-pattern>
  </servlet-mapping>