您的位置:首页 > 其它

用JFreeChart画统计分析柱状图(成功版)

2008-04-10 16:45 274 查看
用JFreeChart画统计分析柱状图(成功版) 

用JFreeChart画统计分析柱状图(成功版)
[align=right][ 2006-6-19 17:38:00 | By: blueroc ][/align]
 
 JFreeChart API http://www.jfree.org/jfreechart/javadoc/

JFreeChart库包的简介

及 成功运行的例子(直接在jsp中显示chart)

org.jfree.chart
这个包包含JfreeChart类库中主要的类和接口

org.jfree.chart.annotations
这个包提供了一套给Chart增加小文字和图片项的机制,通常是为了润色特定的数据项。

org.jfree.chart.axis
这个包包含所有轴有关的类和接口:
a.CategoryPlot 和 XYPlot 操作两个轴(默认),我们叫他们domain轴和range轴。这些专用名词是建立这些地图可视化地把domain轴的值映射到value轴上的概念之上。
效果上,domain轴作为x轴,range作为y轴,但我们更热衷与专用名词
b.轴类提供的默认设置基本适合大多数程序的需要,但是,有很多通过JFreeChartAPI改变属性来定制轴的特性。一定要通过读API来熟悉可以定制的选项。
c.JFreeChart的一个更强大的功能是同一个Chart可以提供多个domain轴和多个value轴
轴类是可克隆和可串行化的。

org.jfree.chart.entity
这个包包括展现Chart中实体的类

org.jfree.chart.event
这个包包括跟改变Chart属性相关的发送和接收事件有关的类和接口。默认,库中的类自动把他们注册给其他类,所以他们会自动接收事件并相应地起作用。更大程度上,你只需要简单地依赖默认的行为。

org.jfree.chart.imagemap
这个包包括创建HTML图像映射的类和接口,图像能用ChartUtilities创建,典型例子是来自servlet。

org.jfree.chart.labels
这个包包括为个别数据产生标签的类和接口,有两种标签类型:
a.item labels --作为chart一部分的小文字标签
b.tooltips -- 当鼠标滑到数据项时展示的文字

org.jfree.chart.needle
这个包包括在圆形图中画指针的类和接口

org.jfree.chart.plot
这个包包括:
a.Plot基类
b.一系列Plot的子类
c.各种支持的类和接口
这是一个很重要的包,因为Plot类在JFreeChart中控制和展示数据中起着关键作用

org.jfree.chart.renderer
这个包包括用来扩展渲染器的类和接口,渲染器是一个负责在CategoryPlot或XYPlot上画出个性化的数据项。
渲染器或通过修改现有属性或扩充一个新的渲染器来提供一定程度上Chart外表改变。

org.jfree.chart.servlet
这个包包括Servlet的辅助类

org.jfree.chart.title
这个包包括作为Chart标题或子标题的类,JFreeChart操作一个标题和多个子标题,当画chart的时候,标题和子标题会占用一块空间来画他们自己,这样画图空间就少了,所以尽管对子标题的数目没有限制,但你经可能的少用子标题。

org.jfree.chart.ui
这个包包括改变Chart属性的用户界面类,这个包是可选的,他们用在示例程序中,如果你的程序用不到他们,你不需要把他包括进你的应用程序。

org.jfree.chart.urls
这个包支持在HTML图片上添加URL

org.jfree.data
这个包包括为JFreeChart提供数据集的类和接口。在设计JFreeChart的一个原则就是数据和展示完全分开,所以,在数据集的类里面你找不到任何与展示有关的属性和方法。

org.jfree.data.statistics
这个包包括展示数据统计的类和接口

org.jfree.data.time
这个包包括展示基于时间的数据的类和接口。
TimeSeriesCollection应该是最重要的类,他用来存储一个或多个TimeSeries对象,并提过一个对XYDataset接口的扩展,这样他被允许作为XYPlot的一个数据集。
TimePeriodValuesCollection这个类执行相似的功能,但是可以用更通用的时间段。

org.jfree.data.xml
这个包包括支持从XML文件读取数据集的类和接口。

 

 我们介绍使用 JFreeChart 生成柱状图,首先从一个最简单的例子开始。
一 最简单的例子 为了降低门槛,让大家心理有个底,先介绍一个简单的不能再简单的例子,图片中的各类属性都采用默认值。 <%@ page contentType="text/html;charset=GBK"%><BR>
<%@ page import="org.jfree.chart.ChartFactory,<BR>
org.jfree.chart.JFreeChart,<BR>
org.jfree.chart.plot.PlotOrientation,<BR>
org.jfree.chart.servlet.ServletUtilities,<BR>
org.jfree.data.DefaultCategoryDataset"%><BR>
<%
<BR>
DefaultCategoryDataset dataset = new DefaultCategoryDataset();<BR>
dataset.addValue(300, "广州", "苹果");<BR>
dataset.addValue(200, "广州", "梨子");<BR>
dataset.addValue(500, "广州", "葡萄");<BR>
dataset.addValue(340, "广州", "芒果");<BR>
dataset.addValue(280, "广州", "荔枝");<BR>
JFreeChart chart = ChartFactory.createBarChart3D("水果销量统计图",
"水果",
"销量",dataset,
PlotOrientation.VERTICAL,
false,
false,
false);<BR>
String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);<BR>
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;<BR>
%>
<IMG height=300 src="<%= graphURL %>" width=500 useMap="#<%= filename %>" border=0>
这个 JSP 程序运行的结果如下图



图 一

二 柱状图高级特性
        上面的程序简单,但生成的柱状图也很简单。更多的时候,我们可能需要不同的效果。org.jfree.chart.ChartFactory 这个工厂类有createBarChart,createStackedBarChart,createBarChart3D,createStackedBarChart3D这几个工厂方法创建不同类型的柱状图。关于这四个方法的 JFreeChart 的 Java Doc API 文档有详细说明,比较重要的是 PlotOrientation.VERTICAL 让平行柱垂直显示,而 PlotOrientation.HORIZONTAL 则让平行柱水平显示。
几个对柱状图影响较大的几个类,它们分别是:
org.jfree.chart.axis.CategoryAxis
org.jfree.chart.axis.ValueAxis
org.jfree.chart.renderer.BarRenderer
org.jfree.chart.renderer.BarRenderer3D
我们还是以实例来说明这几个类,先来假设一个需要统计的数据表:
根据上表数据,首先构造 CategoryDataset, 这里不再使用上面简单例子里面的 DefaultCategoryDataset 类,而是 DatasetUtilities 更有效的构造 CategoryDataset,如下列代码:

double[][] data = new double[][] {{672, 766, 223, 540, 126}, {325, 521, 210, 340, 106}, {332, 256, 523, 240, 526} };
String[] rowKeys = {"苹果","梨子","葡萄"};
String[] columnKeys = {"北京","上海","广州","成都","深圳"};
CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);

用上面的 dataset 生成的 3D 柱状图



图 二

org.jfree.chart.axis.CategoryAxis
CategoryAxis domainAxis = plot.getDomainAxis();
//设置 columnKey 是否垂直显示
domainAxis.setVerticalCategoryLabels(true);
//设置距离图片左端距离
domainAxis.setLowerMargin(0.1);
//设置距离图片右端距离
domainAxis.setUpperMargin(0.1);
//设置 columnKey 是否间隔显示
domainAxis.setSkipCategoryLabelsToFit(true);
plot.setDomainAxis(domainAxis);
上面代码产生的效果如下图,注意与图二的区别。



图 三

org.jfree.chart.axis.ValueAxis

ValueAxis rangeAxis = plot.getRangeAxis();
//设置最高的一个柱与图片顶端的距离
rangeAxis.setUpperMargin(0.15);
//设置最低的一个柱与图片底端的距离
//rangeAxis.setLowerMargin(0.15);
plot.setRangeAxis(rangeAxis);

上面代码产生的效果如下图,注意与图二的区别。



图 四

org.jfree.chart.renderer.BarRenderer3D

BarRenderer3D renderer = new BarRenderer3D();
renderer.setBaseOutlinePaint(Color.BLACK);
//设置 Wall 的颜色
renderer.setWallPaint(Color.gray);
//设置每种水果代表的柱的颜色
renderer.setSeriesPaint(0, new Color(0, 0, 255));
renderer.setSeriesPaint(1, new Color(0, 100, 255));
renderer.setSeriesPaint(2, Color.GREEN);
//设置每种水果代表的柱的 Outline 颜色
renderer.setSeriesOutlinePaint(0, Color.BLACK);
renderer.setSeriesOutlinePaint(1, Color.BLACK);
renderer.setSeriesOutlinePaint(2, Color.BLACK);
//设置每个地区所包含的平行柱的之间距离
renderer.setItemMargin(0.1);
//显示每个柱的数值,并修改该数值的字体属性
renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setItemLabelFont(new Font("黑体",Font.PLAIN,12));
renderer.setItemLabelsVisible(true);

上面代码产生的效果如下图,注意与图二的区别。



图 五

补充两个有用的方法
补充 org.jfree.chart.plot.CategoryPlot 的两个方法,这两个方法对所有类型的图表都有作用,因为在前面没有介绍,这里补充一下。

//设置地区、销量的显示位置
plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);

上面代码产生的效果如下图,注意与图二的区别。



图 六

三 完整范例
前面都是一些代码片段,现在把这些片段组合成一个完整范例。

<DIV class=code>
<%@ page contentType="image/jpeg;charset=GBK"%>
<%@ page import="java.awt.Font"%>
<%@ page import="java.awt.Color"%>
<%@ page import="org.jfree.chart.ChartFactory"%>
<%@ page import="org.jfree.chart.JFreeChart"%>
<%@ page import="org.jfree.chart.plot.PlotOrientation"%>
<%@ page import="org.jfree.chart.servlet.ServletUtilities"%>
<%@ page import="org.jfree.data.general.DatasetUtilities"%>
<%@ page import="org.jfree.data.DataUtilities"%>
<%@ page import="org.jfree.chart.plot.CategoryPlot"%>
<%@ page import="org.jfree.chart.axis.CategoryAxis"%>
<%@ page import="org.jfree.chart.axis.ValueAxis"%>
<%@ page import="org.jfree.chart.renderer.category.BarRenderer3D"%>
<%@ page import="org.jfree.chart.labels.StandardCategoryItemLabelGenerator"%>
<%@ page import="org.jfree.chart.axis.AxisLocation"%>
<%@ page import="org.jfree.data.category.CategoryDataset"%>
<%
double[][] data = new double[][] {
{672, 766, 223, 540, 126},
{325, 521, 210, 340, 106},
{332, 256, 523, 240, 526}
};
String[] rowKeys = {"苹果","梨子","葡萄"};
String[] columnKeys = {"北京","上海","广州","成都","深圳"};
CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);
JFreeChart chart = ChartFactory.createBarChart3D("水果销量图统计",null,null,dataset,
PlotOrientation.VERTICAL,true,false,false);
chart.setBackgroundPaint(Color.WHITE);
CategoryPlot plot = chart.getCategoryPlot();
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setVisible(true);
plot.setDomainAxis(domainAxis);
ValueAxis rangeAxis = plot.getRangeAxis();
//设置最高的一个 Item 与图片顶端的距离
rangeAxis.setUpperMargin(0.15);
//设置最低的一个 Item 与图片底端的距离
rangeAxis.setLowerMargin(0.15);
plot.setRangeAxis(rangeAxis);
BarRenderer3D renderer = new BarRenderer3D();
renderer.setBaseOutlinePaint(Color.BLACK);
//设置 Wall 的颜色<BR>
renderer.setWallPaint(Color.gray);
//设置每种水果代表的柱的颜色
renderer.setSeriesPaint(0, new Color(0, 0, 255));
renderer.setSeriesPaint(1, new Color(0, 100, 255));
renderer.setSeriesPaint(2, Color.GREEN);
//设置每个地区所包含的平行柱的之间距离
renderer.setItemMargin(0.1);
//显示每个柱的数值,并修改该数值的字体属性<BR>
renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
renderer.setItemLabelsVisible(true);
plot.setRenderer(renderer);
//设置柱的透明度<BR>
plot.setForegroundAlpha(0.6f);
//设置地区、销量的显示位置<BR>
plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);
plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
System.out.println("!!!!!!!!!"+chart);
String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename;
System.out.println("!!!!!!!!!"+graphURL);
%>
<img src="<%= graphURL %>" width=500 height=300 border=0 usemap="#<%= filename %>">;
</DIV>
不能正确运行,要在web.xml中配置:
<!--StartFragment-->
<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>

看看程序运行的结果吧:



图 七

三 总结

我只介绍了少量的方法,更多的请参考 JFreeChart 的 Java Doc API 文档和 Sample Code
在Struts中用JFreeChart生成图表

1。action 处理:

public class GraphAction extends Action {
        public ActionForward execute(ActionMapping mapping, ActionForm form,
                        HttpServletRequest request, HttpServletResponse response)
                        throws Exception {
                drawChartPicture dcp = new drawChartPicture();
                GraphLogic gl = new GraphLogic();        
                 gl.setChartInfo(request,response);
                 String img = dcp.getDrawChartInfo(request,response);
                 String graphURL = request.getContextPath()
                        + "/servlet/DisplayChart?filename=" + img;
                 if(img.length() !=0) {
                         request.setAttribute("graphname", img);
                         request.setAttribute("graphURL",graphURL);
                         return mapping.findForward("success");
                 }else {
                         return mapping.findForward("fail");
                 }
        }

}

2。页面
<html:html>
        <head>
                <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"/>
                <title></title>
        </head>
        <body>
        <logic:iterate id="graphname" indexId="id" name="graphname">
        <bean:define id="filename">
                <bean:write name="graphname" />
                </bean:define>
        </logic:iterate>
                <logic:iterate id="graphURL" indexId="id" name="graphURL">
        <bean:define id="url">
                <bean:write name="graphURL" />
                </bean:define>
        </logic:iterate>
        <html:image src="<%=url %>" width='800' height='600' border=0  usemap="#<%= filename %>"></html:image>

</body>
</html:html>

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息