注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

北漂的小羊

Java编程,开发者,程序员,软件开发,编程,代码。新浪微博号:IT国子监

 
 
 

日志

 
 
关于我

在这里是面向程序员的高品质IT技术学习社区,是程序员学习成长的地方。让我们更好地用技术改变世界。请关注新浪微博号: IT国子监(http://weibo.com/itguozijian)

网易考拉推荐

JFreeChart详细说明及相关实例API  

2012-12-14 12:42:37|  分类: JFreeChart |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


JFreeChart,开放源码的Java图表生成组件(基于LGPL Licence),可以创建饼图、曲线图、柱状图、甘特图,生成PNG,JPG等图片格式文件。当前最新版本为0.9.11,下面就是一张 JFreeChart生成的统计图。本文讲解如何在Web利用JFreeChart生成饼状统计图。 

一、安装配置
JFreeChart开发包是一个开源的Java图形开发包,它从柱形图,饼形图,到雷达图,蜡烛图等等无所不包,可以在c/s,b/s,甚至是实时环境都能一显身手。 
当前的JFreeChart的最新版本为jfreechart-1.0.0-rc1.zip。

下载jfreechart-0 .9.11.zip

下载jfreechar t-0.9.11.tar.gz

解压缩文件,jfreechart-0.9.11目录下的jfreechart-0.9.11.jar和 lib/jcommon-0.8.6.jar,lib/gnujaxp.jar都是开发运行需要的文件,把这三个文件放置到应用的lib目录下。

然后在web.xml文件中增加以下内容:

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



安装配置完成,现在可以写程序生成我们需要的统计图了。

二、开始,在JSP中生成饼型统计图

<%@ page contentType=
"text/html;charset=GBK"%>
<%@ page import=
"org.jfree.data.DefaultPieDataset"%>
<%@ page import=
"org.jfree.chart.JFreeChart"%>
<%@ page import=
"org.jfree.chart.plot.PiePlot"%>
<%@ page import=
"org.jfree.chart.
ChartRenderingInfo"%>
<%@ page import=
"org.jfree.chart.servlet.
ServletUtilities"%>
<%@ page import=
"org.jfree.chart.urls.
StandardPieURLGenerator"%>
<%@ page import=
"org.jfree.chart.entity.
StandardEntityCollection"%>
<%

DefaultPieDataset data
= new DefaultPieDataset();
data.setValue("六月",500);
data.setValue("七月",580);
data.setValue("八月",828);

PiePlot plot = new PiePlot(data);

JFreeChart chart = new JFreeChart
("",JFreeChart.DEFAULT_TITLE_FONT,
plot, true);
chart.setBackgroundPaint
(java.awt.Color.white);
//可选,设置图片背景色
chart.setTitle
("www.SenTom.net 网站访问统计表");
//可选,设置图片标题
ChartRenderingInfo info
= new ChartRenderingInfo
(new StandardEntityCollection());
//500是图片长度,300是图片高度
String filename =
ServletUtilities.saveChartAsPNG
(chart, 500, 300, info, session);
String graphURL =
request.getContextPath() +
"/servlet/DisplayChart?filename="
+ filename;
%>
<HTML>
<HEAD>
<TITLE>www.sentom.net</TITLE>
</HEAD>
<BODY>
<P ALIGN="CENTER">
<ccid_file values="<%=" graphURL % />"
width=500 height=300 border=0
usemap="#<%= filename
%>">
</P>
</BODY>
</HTML>



就这么简单


JFreeChart详细说明及相关实例API - 天涯草 - 天涯草
 

三、JSP+JAVABEAN生成饼状统计图

WebChart.java 

/*
* Created on 2003-9-9
* http://www.sentom.net
* To change the template
for this generated file go to
* Window>Preferences>Java>Code
Generation>Code and Comments
*/
package net.sentom.chart;

import java.awt.Insets;
import java.awt.Font;
import java.io.PrintWriter;
import javax.servlet.http.HttpSession;
import org.jfree.data.*;
import org.jfree.chart.*;
import org.jfree.chart.plot.*;
import org.jfree.chart.entity.*;
import org.jfree.chart.urls.*;
import org.jfree.chart.servlet.*;
import org.jfree.chart.labels.
StandardPieToolTipGenerator;

/**
* @author sentom
*
* To change the template for
this generated type comment go to
* Window>Preferences>Java>Code
Generation>Code and Comments
*/
public class WebChart
{
private DefaultPieDataset data =
new DefaultPieDataset();

public void setValue
(String key,double value)
{
data.setValue(key,value);
}

public String generatePieChart
(String title, HttpSession session,
PrintWriter pw)
{
String filename = null;
try
{
//创建chart对象
PiePlot plot =
new PiePlot(data);
plot.setInsets
(new Insets(0, 5, 5, 5));
//在统计图片上建连结
plot.setURLGenerator
(new StandardPieURLGenerator
("link.jsp","section"));
plot.setToolTipGenerator
(new StandardPieToolTipGenerator());
JFreeChart chart = new JFreeChart
("", JFreeChart.DEFAULT_TITLE_FONT,
plot, true);
chart.setBackgroundPaint
(java.awt.Color.white);
//设置图片的背景色
Font font = new Font
("黑体",Font.CENTER_BASELINE,20);
//设置图片标题的字体和大小
TextTitle _title =
new TextTitle(title);
_title.setFont(font);
chart.setTitle(_title);
//把生成的图片放到临时目录
ChartRenderingInfo info =
new ChartRenderingInfo(new
StandardEntityCollection());
//500是图片长度,
300是图片高度
filename = ServletUtilities.
saveChartAsPNG
(chart, 500, 300, info,
session);
ChartUtilities.writeImageMap
(pw, filename, info);
pw.flush();
} catch (Exception e)
{
System.out.println
("Exception - " + e.toString());
e.printStackTrace
(System.out);
filename =
"public_error_500x300.png";
}
return filename;
}
}



JSP文件

<%@ page contentType=
"text/html;charset=GBK"%>
<%@ page import =
"java.io.PrintWriter" %>
<%@ page import=
"net.sentom.chart.WebChart"%>
<%

WebChart chart = new WebChart();
chart.setValue("六月",500);
chart.setValue("七月",580);
chart.setValue("八月",828);

String filename =
chart.generatePieChart
("www.SenTom.net 网站访问统计表",
session, new

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

%>
<HTML>
<HEAD>
<TITLE>www.sentom.net</TITLE>
</HEAD>
<BODY>
<P ALIGN="CENTER">
<ccid_file values="<%=" graphURL % />
" width=500 height=300
border=0 usemap="#<%=

filename %>">
</P>
</BODY>
</HTML>




四 参考资源 

http://sourceforge.net/projects/jfreechart 

http://www.jfree.org/jfreechart/index.html 

http://www.jfree.org/phpBB2/viewforum.php?f=3



以下是网上很详细的注释说明实例,大家可以看一下:

1.柱状图

1/

**

2     * 生成图像文件

3     * 

4     * @param session

5     *            httpsession

6     * @param w

7     *            生成的图的宽度

8     * @param h

9     *            生成的图的高度

10     * @return 

11     *              生成的图像文件的路径

12     */

13    public String createBarChart(HttpSession session, 

14                                 String title, // 图片标题

15                                 int w, // 图片宽度

16                                 int h, // 图片高度

17                                 CategoryDataset dataset //用于出图的数据集

18                                 ) {

19        

20        //通过ChartFactory的静态方法获取JFreeChart对象

21        JFreeChart chart = ChartFactory.createBarChart(title,      //图片标题

22                                                         null,     //横坐标标题

23                                                         null,     //纵坐标标题

24                                                         dataset,  //用于出图的数据集

25                                                         PlotOrientation.VERTICAL,  //柱子方向

26                                                         true,     //是否包含Legend

27                                                         false,    //是否包含tooltips

28                                                         false);   //是否包含urls

29        chart.setBackgroundPaint(Color.WHITE);

30

31        // 设置标题字体

32        chart.getTitle().setFont(new Font("宋体", Font.CENTER_BASELINE, 12));

33

34        CategoryPlot plot = chart.getCategoryPlot();

35

36        /*//没有数据时显示的消息

37        plot.setNoDataMessage("数据还未录入!");

38        plot.setNoDataMessageFont(new Font("宋体", Font.CENTER_BASELINE, 15));*/

39        

40        //横坐标设置

41        CategoryAxis domainAxis = plot.getDomainAxis();

42        //设置横坐标上显示各个业务子项的字体 

43        domainAxis.setTickLabelFont(new Font("宋体", Font.PLAIN, 9));

44        plot.setDomainAxis(domainAxis);

45

46        //纵坐标设置

47        ValueAxis rangeAxis = (ValueAxis)plot.getRangeAxis();

48        // 设置最高的一个 Item 与图片顶端的距离

49        rangeAxis.setUpperMargin(0.15);

50        // 设置最低的一个 Item 与图片底端的距离

51        rangeAxis.setLowerMargin(0.15);

52        plot.setRangeAxis(rangeAxis);

53

54        BarRenderer renderer = new BarRenderer();

55        renderer.setBaseOutlinePaint(Color.BLACK);

56        /*// 设置图上的文字

57        renderer.setSeriesItemLabelFont(0, font);

58        renderer.setSeriesItemLabelFont(1, font);*/

59        // 设置legend的字体

60        renderer.setBaseLegendTextFont(new Font("宋体", Font.LAYOUT_RIGHT_TO_LEFT, 10));

61        // 设置 Wall 的颜色

62        //renderer.setWallPaint(Color.gray);

63        // 设置每种柱的颜色

64        renderer.setSeriesPaint(0, new Color(133,210,38));

65        renderer.setSeriesPaint(1, new Color(0,131,249));

66        //设置柱的 Outline 颜色

67        renderer.setSeriesOutlinePaint(0, Color.BLACK);

68        renderer.setSeriesOutlinePaint(1, Color.BLACK);

69        // 设置每个平行柱的之间距离

70        renderer.setItemMargin(0.03);

71        

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

73        renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());

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

75        renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition( 

76        ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_CENTER)); 

77        // 设置柱形图上的文字偏离值 

78        renderer.setItemLabelAnchorOffset(10D);

79        renderer.setBaseItemLabelsVisible(true);

80        renderer.setBaseItemLabelFont(new Font("Times New Roman", Font.PLAIN, 9));

81        

82        plot.setRenderer(renderer);

83

84        // 设置柱的透明度

85        plot.setForegroundAlpha(0.6f);

86        // 设置横坐标和纵坐标的显示位置

87        plot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_LEFT);

88        plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT);

89

90        // 获取图片路径

91        // 图片存于临时文件夹下

92        String filename = null;

93        try {

94            filename = ServletUtilities.saveChartAsPNG(chart, w, h, null,

95                    session);

96        } catch (IOException e) {

97            System.out.println("Exception - " + e.toString());

98            e.printStackTrace(System.out);

99            filename = "public_error_500x300.png";

100        }

101        return filename;

102    }



2.曲线图
 1    /**
 2     * 生成图像文件
 3     * 
 4     * @param session
 5     *            httpsession
 6     * @param data1
 7     *            IntervalXYDataset
 8     * @param w
 9     *            生成的图的宽度
10     * @param h
11     *            生成的图的高度
12     * @return
13     *                  生成的图像文件的路径
14     */

15    public String createStepLineChart(
16            HttpSession session,
17            String title, // 图片标题
18            IntervalXYDataset data1,//数据集
19            int w, // 图片宽度
20            int h // 图片高度
21            ) {
22
23        /*
24         * 任何类型的图表的最终表现形式都是在JFreeChart对象进行一些属性的定制。
25         * JFreeChart引擎本身提供了一个工厂类用于创建不同类型的图表对象
26         */

27        JFreeChart chart = ChartFactory.createXYStepChart(title, // chart title
28                                                          null
29                                                          null
30                                                          data1, // data
31                                                          PlotOrientation.VERTICAL, 
32                                                          true// include legend
33                                                          false
34                                                          false);
35
36        // 设置背景颜色为白色
37        chart.setBackgroundPaint(Color.white);
38
39        // 设置标题字体
40        chart.getTitle().setFont(new Font("宋体", Font.CENTER_BASELINE, 12));
41        XYPlot plot = chart.getXYPlot();
42        
43        plot.setBackgroundPaint(Color.lightGray);
44        plot.setDomainGridlinePaint(Color.white);
45        plot.setRangeGridlinePaint(Color.white);
46
47        DateAxis domainAxis = new DateAxis();
48        domainAxis.setDateFormatOverride(new SimpleDateFormat("MM-dd"));
49        domainAxis.setTickMarkPosition(DateTickMarkPosition.START);
50        domainAxis.setLowerMargin(0);
51        domainAxis.setUpperMargin(0);
52        plot.setDomainAxis(domainAxis);
53
54        NumberAxis rangeAxis = (NumberAxis)plot.getRangeAxis();
55        // 设置最高的一个 Item 与图片顶端的距离
56        rangeAxis.setUpperMargin(0.15);
57        // 设置最低的一个 Item 与图片底端的距离
58        rangeAxis.setLowerMargin(0.15);
59        plot.setRangeAxis(rangeAxis);
60
61        /*
62         * XXXRender:负责如何显示一个图表对象
63         */

64        XYStepRenderer renderer = (XYStepRenderer)plot.getRenderer();
65        /*
66         * 设置线条的颜色
67         */

68        renderer.setSeriesPaint(0new Color(0,150,240));
69        renderer.setSeriesPaint(1new Color(244,109,19));
70
71        // 设置图上的文字字体
72        Font font = new Font("宋体", Font.LAYOUT_RIGHT_TO_LEFT, 10);
73        renderer.setSeriesItemLabelFont(0, font);
74        renderer.setSeriesItemLabelFont(1, font);
75        // 设置legend的字体
76        renderer.setBaseLegendTextFont(font);
77        renderer.setBaseItemLabelFont(font);
78
79        plot.setRenderer(renderer);
80
81        String filename = null;
82        try {
83            filename = ServletUtilities.saveChartAsPNG(chart, w, h, null,
84                    session);
85        }
 catch (Exception e) {
86            System.out.println("Exception - " + e.toString());
87            e.printStackTrace(System.out);
88            filename = "public_error_500x300.png";
89        }

90        return filename;
91    }


另外,因为JFreeChart将生成的图片置于临时文件夹下,为防垃圾文件泛滥,可以写一个监听类,当session失效时删除临时图片文件
 1public class DelTempListener implements HttpSessionListener {
 2
 3    public void sessionCreated(HttpSessionEvent se) {
 4        System.out.println("srart____________");
 5        delete(se);
 6        System.out.println("srart___over");
 7    }

 8
 9    public void sessionDestroyed(HttpSessionEvent se) {
10        System.out.println("Destroyed____________");
11        delete(se);
12        System.out.println("Destroyed__over");
13    }

14    private void delete(HttpSessionEvent se){
15        ChartDeleter deleter = (ChartDeleter)se.getSession().getAttribute("JFreeChart_Deleter");
16        se.getSession().removeAttribute("JFreeChart_Deleter");
17        se.getSession().setAttribute("JFreeChart_Deleter", deleter);
18    }

19}



  评论这张
 
阅读(787)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016