天天看点

项目中用jfreechart插件开发统计图表

JFreeChart是一组功能强大、灵活易用的Java绘图API,使用它可以生成多种通用性的报表,包括柱状图、饼图、曲线图、甘特图等。它能够用在Swing和Web等中制作自定义的图表或报表,并且得到广泛的应用。本文将通过引领读者学习在JFreeChart中饼图、柱状图和曲线图的进阶应用,来达到熟练使用JFreeChart的目的。

一.             下载与环境配置

1. 下载JFreeChart

JFreeChart是开放源代码的免费软件,但是它的支持文档需要付费才能得到。其下载地址为:http://sourceforge.net/project/showfiles.php?group_id=15494 ,当前最新版本为1.0.13。笔者下载的是1.0.13最新版。

说明:1)source目录:为jfreechart的源码目录;

        2)lib目录:为包目录,我们需要关注的包为jfreechart-1.0.13.jar和jcommon-1.0.16.jar这两个包;

        3)根目录下的jfreechart-1.0.6-demo.jar是例子程序,大家双击后可看到其中有很多例子的运行结果。

2. 环境配置

       笔者的开发环境如下:

       JDK:1.5

MyEclipse:5.1.1 GA

Tomcat:5.5.28

为了后续的“用JFreeChart创建基于 Web的图表”的一个例子的展示,我们在MyEclipse中创建一个名为jfreechart的Web工程。将下载的JFreeChart1.0.13下 lib目录下的jar包拷贝到WebRoot/WEB-INF/lib目录下。另外还需要在web.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>/DisplayChart</url-pattern>

</servlet-mapping>

在WebRoot目录下建立bar目录,用来存放柱状图的各个例子。首先在该目录下建立一个sample1.jsp文件,让我们来看一个简单的柱状图的例子,修改后的sample1.jsp的内容如下所示:

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>

<%@ page import="com.zwlc.fpoa.util.Pager,java.util.List,com.zwlc.fpoa.forest.forestbureau.statistics.model.AnimalStatistics" %>

<%@ page import="org.jfree.chart.ChartFactory,org.jfree.chart.JFreeChart,org.jfree.chart.plot.PlotOrientation,org.jfree.chart.servlet.ServletUtilities,org.jfree.data.category.CategoryDataset,org.jfree.data.general.DatasetUtilities,org.jfree.chart.plot.*,org.jfree.chart.labels.*,org.jfree.chart.renderer.category.BarRenderer3D,java.awt.*,org.jfree.ui.*,org.jfree.chart.axis.AxisLocation"%>

<%@ include file="/common/include/header.jsp" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd ">

<html>

<head>

 <title><s:text name="动物种类统计" /></title>

 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

</head>

  <%

   String[] rowKeys = {"动物种类数目"};

   Pager pager = (Pager) request.getAttribute("pager");

   List list = pager.getList();

   if(list.size()==0){

           out.println("<script language='javascript'> alert('没有可统计数据!'); window.history.back(-1);</script>");

   }else{

       double[][] data = new double[1][list.size()];

       String[]columnKeys = new String[list.size()];

   String name = null;

   double number;

   AnimalStatistics animalStatistics;

   for(int i=0;i<list.size();i++){

      animalStatistics = (AnimalStatistics)list.get(i);

      name = animalStatistics.getTreeFarm().getName();

      for(int j=0;j<columnKeys.length;j++){

         if(name.equals(columnKeys[j])){

             name = name+"(B)";

         }

      }

      columnKeys[i]=name;

   }

   for(int i=0;i<rowKeys.length;i++){     //外循环是根据rowKeys的大小进行

       for(int j=0;j<columnKeys.length;j++){         //内循环是根据columnKeys的大小来进行

           animalStatistics = (AnimalStatistics)list.get(j);

     number = (double)animalStatistics.getNumber().getNumber();

     data[i][j]=number;

       }

   }

   CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);

   JFreeChart chart = ChartFactory.createBarChart3D("动物种类统计图",

     "指标参数", "数量", dataset, PlotOrientation.VERTICAL, true, true, false);

   Font font = new Font("黑体", Font.TRUETYPE_FONT, 12);

   chart.getTitle().setFont(font);//设置图表标题为中文

   CategoryPlot plot = chart.getCategoryPlot(); //设置网格背景颜色 plot.setBackgroundPaint(Color.white);

   // 设置网格竖线颜色 plot.setDomainGridlinePaint(Color.pink);

   // 设置网格横线颜色 plot.setRangeGridlinePaint(Color.pink);

   // 显示每个柱的数值,并修改该数值的字体属性

   BarRenderer3D renderer = new BarRenderer3D();

   renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());

   renderer.setBaseItemLabelsVisible(true);

   //x轴标题设置

   plot.getDomainAxis().setLabelFont(font);//设置轴标题

   plot.getDomainAxis().setTickLabelFont(font);//设置轴数值

   //y轴标题设置

   plot.getRangeAxis().setLabelFont(font);

   plot.getRangeAxis().setLabelFont(font);

   renderer.setBaseLegendTextFont(font);//设置rooKeys显示中文

   // 默认的数字显示在柱子中,通过如下两句可调整数字的显示

   //注意:此句很关键,若无此句,那数字的显示会被覆盖,给人数字没有显示出来的问题

   renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(

     ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));

   renderer.setItemLabelAnchorOffset(10D);

   //  设置每个地区所包含的平行柱的之间距离 //

   renderer.setItemMargin(0.3);

   plot.setRenderer(renderer);

   //  设置地区、销量的显示位置 //将下方的“肉类”放到上方 plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);

   // 将默认放在左边的“销量”放到右方 plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);

   String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);

   String graphURL = request.getContextPath()+ "/DisplayChart?filename=" + filename;

  %>

<img src="<%=graphURL%>" width=700 height=500 #<%=filename %>">

<% }%>