jfreechart 图表生成实例

package jfree.test;
 
import java.awt.BasicStroke;
import java.awt.Color;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
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.chart.*;
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.ValueAxis;
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.LineAndShapeRenderer;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.chart.title.TextTitle;
import com.lowagie.text.Font;
//import demo.BarChart3DDemo1;
/**
 * Servlet implementation class ChartDemoServlet
 */
public class ChartDemoServlet extends HttpServlet {
 private static final long serialVersionUID = 1L;
        public ChartDemoServlet() {
            super();
            // TODO Auto-generated constructor stub
        }
    
         
        public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException{
          
         response.setContentType("image/jpeg");
         DefaultPieDataset data = getDataSet();
         CategoryDataset dataset = getDataSet2();
         DefaultCategoryDataset linedataset = createDataset();
          
      //JFreeChart chart = ChartFactory.createPieChart3D("水果产量图", data, true, false, false);
       
         /**
      JFreeChart chart = ChartFactory.createBarChart3D(
                    "水果产量图", // 图表标题
                    "水果", // 目录轴的显示标签
                    "产量", // 数值轴的显示标签
                    dataset, // 数据集
        PlotOrientation.VERTICAL, // 图表方向:水平、垂直
        true,  // 是否显示图例(对于简单的柱状图必须是 false)
        false, // 是否生成工具
        false  // 是否生成 URL 链接
        );
      **/
          
      JFreeChart chart = ChartFactory.createLineChart(
           "折线图", // 图表标题
           "时间", // 横轴显示标签
           "销售额(百万)", // 纵轴显示标签
           linedataset, // 数据集
           PlotOrientation.VERTICAL, // 图表方向:水平、垂直
           true, // 是否显示图例标识(对于简单的柱状图必须是 false)
           true, // 是否生成工具
           false // 是否生成 URL 链接
           );
       
         /*
      JFreeChart chart=ChartFactory.createTimeSeriesChart(
        "编程词典全国销量统计"
        , "销售月份"
        , "销量(份)"
        , createtimedata()
        , false
        , false
        , false
        );
      */
      /*
       * jfreechart1.0.13生成的图片中,中文都以方框形式显示,中文乱码解决如下(包括:饼图、柱状图、时序图、折线图)。
       */
      /***设置饼图相关属性***/
      /*
      PiePlot pieplot = (PiePlot) chart.getPlot();//获取饼图区域对象。
      pieplot.setLabelFont(new java.awt.Font("宋体",0,12));
      pieplot.setNoDataMessage("无数据显示"); //没有数据的时候显示的内容
      pieplot.setCircular(false);
      pieplot.setLabelGap(0.02D);
      TextTitle txtTitle = null;
      txtTitle = chart.getTitle();
      java.awt.Font font = new java.awt.Font("宋体", Font.BOLD, 16);
      txtTitle.setFont(font);//解决标题中文乱码
      chart.getLegend().setItemFont(font);
      chart.setBackgroundPaint(new Color(232,232,232));//设定背景
      pieplot.setBackgroundPaint(Color.white); //设定图表数据显示部分背景色
      */
       
      /***设置柱状图、折线图相关属性***/
       
      CategoryPlot catplot=chart.getCategoryPlot();  //获取柱状图、折线图区域对象。
      CategoryAxis domainAxis=catplot.getDomainAxis();
      catplot.setNoDataMessage("无数据显示");//没有数据的时候显示的内容
      //列表标题
      TextTitle txtTitle = null;
      txtTitle = chart.getTitle();
      txtTitle.setFont(new java.awt.Font("黑体",Font.BOLD,14));
      //水平底部列表
         domainAxis.setLabelFont(new java.awt.Font("黑体",Font.BOLD,14));
         //水平底部标题
         domainAxis.setTickLabelFont(new java.awt.Font("宋体",Font.BOLD,12));
         //垂直标题
         ValueAxis rangeAxis=catplot.getRangeAxis();//获取柱状
         rangeAxis.setLabelFont(new java.awt.Font("黑体",Font.BOLD,15));
         chart.getLegend().setItemFont(new java.awt.Font("黑体", Font.BOLD, 15));
         //获得renderer
         LineAndShapeRenderer lineAndShapeRenderer =(LineAndShapeRenderer)catplot.getRenderer();
         lineAndShapeRenderer.setShapesVisible(true); //series 点(即数据点)可见
         /*
         lineAndShapeRenderer.setSeriesStroke(0, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] {
           10F, 6F
           }, 0.0F)); //这里是虚线,默认是直线
         */
    
          
       
      /***设置时序图相关属性***/
      /**
         XYPlot xyplot = (XYPlot) chart.getPlot();//获取时序图区域对象。
         //列表标题
      TextTitle txtTitle = null;
      txtTitle = chart.getTitle();
      txtTitle.setFont(new java.awt.Font("黑体",Font.BOLD,15));
         //纵轴字体
         xyplot.getRangeAxis().setLabelFont(new java.awt.Font("宋体", Font.BOLD, 12));
         //横轴框里的标题字体:显示图例
         //chart.getLegend().setItemFont(new java.awt.Font("宋体", Font.ITALIC, 12));
         //横轴列表字体
         xyplot.getDomainAxis().setTickLabelFont(new java.awt.Font("新宋体", 1, 12));
         //横轴小标题字体
         xyplot.getDomainAxis().setLabelFont(new java.awt.Font("新宋体", 1, 12));
         chart.setBackgroundPaint(new Color(252,175,134)); //设置背景色
         xyplot.setDomainGridlinesVisible(false);  //设置网格不显示
          
         //获取时间轴对象
         DateAxis dateAxis = (DateAxis) xyplot.getDomainAxis();
         //dateAxis.setLabelFont(new java.awt.Font("黑体", Font.ITALIC , 18));   //设置时间轴字体
         dateAxis.setLowerMargin(0.0);//设置时间轴上显示的最小值
         DateFormat format = new SimpleDateFormat("MM月份");   //创建日期格式对象
     //创建DateTickUnit对象
         DateTickUnit dtu = new DateTickUnit(DateTickUnitType.DAY,29,format);
         dateAxis.setTickUnit(dtu);//设置日期轴的日期标签
         **/
          
         //chart.getTitle().setFont(new java.awt.Font("宋体", Font.BOLD, 15));
         //chart.getLegend().setItemFont(new java.awt.Font("黑体", Font.BOLD, 15));
         //CategoryAxis domainAxis = plot.getDomainAxis();  
         /*------设置X轴坐标上的文字-----------*/
         //domainAxis.setTickLabelFont(new java.awt.Font("黑体", Font.PLAIN, 11));  
         /*------设置X轴的标题文字------------*/
         //domainAxis.setLabelFont(new java.awt.Font("宋体", Font.PLAIN, 12));  
         //NumberAxis numberaxis = (NumberAxis) plot.getRangeAxis();  
         /*------设置Y轴坐标上的文字-----------*/
         //numberaxis.setTickLabelFont(new java.awt.Font("黑体", Font.PLAIN, 12));  
         /*------设置Y轴的标题文字------------*/
         //numberaxis.setLabelFont(new java.awt.Font("黑体", Font.PLAIN, 12));
       
          
      FileOutputStream fos_jpg=null;
      try{
       fos_jpg=new FileOutputStream("D:\\ok.jpg");
       /*
        * 第二个参数如果为100,会报异常:
        * java.lang.IllegalArgumentException: The 'quality' must be in the range 0.0f to 1.0f
        * 限制quality必须小于等于1,把100改成 0.1f。
        */
       ChartUtilities.writeChartAsJPEG(fos_jpg, 0.99f, chart, 600, 300, null);
        
        
      }catch(Exception e){
       System.out.println("[e]"+e);
      }finally{
       try{
        fos_jpg.close();
       }catch(Exception e){
         
       }
      }
          
        }
      
     /**
      * 获取一个演示用的简单数据集对象
      * @return
      */
        //生成饼图数据
     private static DefaultPieDataset getDataSet() {
      DefaultPieDataset dataset = new DefaultPieDataset();
      dataset.setValue("苹果",100);
      dataset.setValue("梨子",200);
      dataset.setValue("葡萄",300);
      dataset.setValue("香蕉",400);
      dataset.setValue("荔枝",500);
      return dataset;
     }
     //生成柱状图数据
     private static CategoryDataset getDataSet2() {
      DefaultCategoryDataset dataset = new DefaultCategoryDataset();
            dataset.addValue(100, "北京", "苹果");
            dataset.addValue(100, "上海", "苹果");
            dataset.addValue(100, "广州", "苹果");
            dataset.addValue(200, "北京", "梨子");
            dataset.addValue(200, "上海", "梨子");
            dataset.addValue(200, "广州", "梨子");
            dataset.addValue(300, "北京", "葡萄");
            dataset.addValue(300, "上海", "葡萄");
            dataset.addValue(300, "广州", "葡萄");
            dataset.addValue(400, "北京", "香蕉");
            dataset.addValue(400, "上海", "香蕉");
            dataset.addValue(400, "广州", "香蕉");
            dataset.addValue(500, "北京", "荔枝");
            dataset.addValue(500, "上海", "荔枝");
            dataset.addValue(500, "广州", "荔枝");
            return dataset;
     }
      
     //生成折线图数据
      public static DefaultCategoryDataset createDataset() {
       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月";
    
       linedataset.addValue(0.0, series1, type1);
       linedataset.addValue(4.2, series1, type2);
       linedataset.addValue(3.9, series1, type3);
       linedataset.addValue(3.2, series1, type4);
       linedataset.addValue(3.0, series1, type5);
    
       linedataset.addValue(1.0, series2, type1);
       linedataset.addValue(5.2, series2, type2);
       linedataset.addValue(7.9, series2, type3);
       linedataset.addValue(8.9, series2, type4);
       linedataset.addValue(9.2, series2, type5);
    
       linedataset.addValue(2.0, series3, type1);
       linedataset.addValue(9.2, series3, type2);
       linedataset.addValue(8.9, series3, type3);
       linedataset.addValue(9.9, series3, type4);
       linedataset.addValue(10.9, series3, type5);
    
       return linedataset;
      }
       
     //生成时序图数据
      public static XYDataset createtimedata() {
      //实例化TimeSeries对象
       TimeSeries timeseries = new TimeSeries("Data");
       Day day = new Day(1, 1, 2008);  //实例化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 timeSeriesCollection =new TimeSeriesCollection(timeseries);
       //返回数据集合对象
       return timeSeriesCollection;
      }
       
    }


几个效果图:








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值