使用 JFreeChart来创建基于web的图表

来源:互联网 发布:软件项目中标通知书 编辑:程序博客网 时间:2024/05/22 15:56

为了创建一个可以在web浏览器上查看到图表一般有两种做法:

第一种就是使用applet利用java本身对图形的支持来显示一个图表;

第二种就是直接在web服务器端生成好图表图片文件后发送给浏览器。

 

第一种方式显然对于客户端要求太高,随着现在主流浏览器放弃对JAVA的支持后,这种方式只适合一些局域网的应用,而对于因特网的环境就显得不太适合。因此我们下面将介绍一个JAVA的图表引擎JFreeChart用来产生基于WEB的图表。

1、              JFreeChart项目简介

JFreeChart是开放源代码站点SourceForge.net上的一个JAVA项目,它主要用来各种各样的图表,这些图表包括:饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。这些不同式样的图表基本上可以满足目前的要求。为了减少篇幅本文主要介绍前面三种类型的图表,读者可以触类旁通去开发其他样式的图表。下面几个是JFreeChart产生的这三种类型图表的结果:

JFreeChart主页:
        http://www.jfree.org/jfreechart/index.html
JFreeChart下载页面:
        http://sourceforge.net/projects/jfreechart/
                                   

下载的时候需要注意的是必须下载两个文件:JFreeChart以及Jcommon

1 柱状图

BarChartDemo源代码:

package lius.chart.demo;

 

import java.io.*;

import org.jfree.data.*;

import org.jfree.data.category.CategoryDataset;

import org.jfree.data.category.DefaultCategoryDataset;

import org.jfree.chart.*;

import org.jfree.chart.plot.*;

    /**

     * 该类用于演示最简单的柱状图生成

     * @author Winter Lau

     */

    public class BarChartDemo {

       public static void main(String[] args) throws IOException{

           CategoryDataset dataset = getDataSet2();

           JFreeChart chart = ChartFactory.createBarChart3D(

                            "水果产量图", // 图表标题

                            "水果", // 目录轴的显示标签

                            "产量", // 数值轴的显示标签

                            dataset, // 数据集

                            PlotOrientation.VERTICAL, // 图表方向:水平、垂直

                            true, // 是否显示图例(对于简单的柱状图必须是false)

                            false, // 是否生成工具

                            false // 是否生成URL链接

                            );

                           

           FileOutputStream fos_jpg = null;

           try {

              fos_jpg = new FileOutputStream("D://fruit.jpg");

              ChartUtilities.writeChartAsJPEG(fos_jpg,1.0f,chart,400,300,null);

           } finally {

              try {

                  fos_jpg.close();

              } catch (Exception e) {}

           }

       }

       /**

        * 获取一个演示用的简单数据集对象

        * @return

        */

       private static CategoryDataset getDataSet() {

           DefaultCategoryDataset dataset = new DefaultCategoryDataset();

           dataset.addValue(100, null, "苹果");

           dataset.addValue(200, null, "梨子");

           dataset.addValue(300, null, "葡萄");

           dataset.addValue(400, null, "香蕉");

           dataset.addValue(500, null, "荔枝");

           return dataset;

       }

       /**

        * 获取一个演示用的组合数据集对象

        * @return

        */

       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;

       }

    }

 

2、  饼状图

PieChartDemo源代码:

import java.io.*;

import java.text.DecimalFormat;

import java.text.NumberFormat;

 

import org.jfree.data.*;

import org.jfree.data.general.DefaultPieDataset;

import org.jfree.chart.*;

import org.jfree.chart.labels.StandardPieSectionLabelGenerator;

import org.jfree.chart.plot.PiePlot3D;

    /**

     * 用于演示饼图的生成

     * @author Winter Lau

     */

    public class PieChartDemo {

       public static void main(String[] args) throws IOException{

           DefaultPieDataset data = getDataSet();

           JFreeChart chart = ChartFactory.createPieChart3D("水果产量图",  // 图表标题

           data,

           true, // 是否显示图例

           false,

           false

           );

          

          

           PiePlot3D plot=(PiePlot3D)chart.getPlot();

           //图片中显示百分比:自定义方式,{0} 表示选项, {1} 表示数值, {2} 表示所占比例 ,小数点后两位

           plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})", NumberFormat.getNumberInstance(), new DecimalFormat("0.00%")));

           // 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例

           plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})"));

          

           //写图表对象到文件

           FileOutputStream fos_jpg = null;

           try {

              fos_jpg = new FileOutputStream("D://fruit.jpg");

              ChartUtilities.writeChartAsJPEG(fos_jpg,chart,400,300,null);

           } 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;

       }

    }

 

 

3、  将生成的图表移到浏览器上(以饼图为例)

Servlet源代码:

 ChartDemoServlet源代码:

import java.io.*;

import java.text.DecimalFormat;

import java.text.NumberFormat;

 

import java.io.IOException;

import javax.servlet.*;

import javax.servlet.http.HttpServlet;

import org.jfree.data.*;

import org.jfree.chart.*;

 

import org.jfree.data.*;

import org.jfree.data.general.DefaultPieDataset;

import org.jfree.chart.*;

import org.jfree.chart.labels.StandardPieSectionLabelGenerator;

import org.jfree.chart.plot.PiePlot3D;

    /**

     * 用于演示饼图的生成

     * @author Winter Lau

     */

    public class ChartDemoServlet extends HttpServlet {

       public void service(ServletRequest req, ServletResponse res)

       throws ServletException, IOException

       {

           res.setContentType("image/jpeg");

 

           DefaultPieDataset data = getDataSet();

           JFreeChart chart = ChartFactory.createPieChart3D("水果产量图",  // 图表标题

           data,

           true, // 是否显示图例

           false,

           false

           );

          

          

           PiePlot3D plot=(PiePlot3D)chart.getPlot();

 

           plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})", NumberFormat.getNumberInstance(), new DecimalFormat("0.00%")));

 

           // 图例显示百分比:自定义方式, {0} 表示选项, {1} 表示数值, {2} 表示所占比例

           plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})"));

          

           //写图表对象输出到浏览器

           ChartUtilities.writeChartAsJPEG(res.getOutputStream(),chart,400,300,null);

       }

       /**

        * 获取一个演示用的简单数据集对象

        * @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;

       }

    }

web.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4"

    xmlns="http://java.sun.com/xml/ns/j2ee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  <servlet>

    <description>This is the description of my J2EE component</description>

    <display-name>This is the display name of my J2EE component</display-name>

    <servlet-name>ChartDemoServlet</servlet-name>

    <servlet-class>ChartDemoServlet</servlet-class>

  </servlet>

 

  <servlet-mapping>

    <servlet-name>ChartDemoServlet</servlet-name>

    <url-pattern>/servlet/ChartDemoServlet</url-pattern>

  </servlet-mapping>

  <welcome-file-list>

    <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>

</web-app>

 

 
原创粉丝点击