﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-网摘-文章分类-JFreeChart</title><link>http://www.blogjava.net/jvict/category/33896.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 22 Apr 2010 05:20:58 GMT</lastBuildDate><pubDate>Thu, 22 Apr 2010 05:20:58 GMT</pubDate><ttl>60</ttl><item><title>用JFreeChart增强JSP报表的用户体验</title><link>http://www.blogjava.net/jvict/articles/318222.html</link><dc:creator>Documents</dc:creator><author>Documents</author><pubDate>Wed, 14 Apr 2010 01:15:00 GMT</pubDate><guid>http://www.blogjava.net/jvict/articles/318222.html</guid><wfw:comment>http://www.blogjava.net/jvict/comments/318222.html</wfw:comment><comments>http://www.blogjava.net/jvict/articles/318222.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jvict/comments/commentRss/318222.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jvict/services/trackbacks/318222.html</trackback:ping><description><![CDATA[<p><a href="http://www.sucai.com/Tech/List4/8746.htm">原文：http://www.sucai.com/Tech/List4/8746.htm</a><br />
<br />
JFreeChart是一组功能强大、灵活易用的Java绘图API，使用它可以生成多种通用性的报表，包括柱状图、饼图、曲线图、甘特图等。它能够用在Swing和Web等中制作自定义的图表或报表，并且得到广泛的应用。本文将通过引领读者学习在JFreeChart中饼图、柱状图和曲线图的进阶应用，来达到熟练使用JFreeChart的目的。</p>
<p>一．&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载与环境配置<br />
1. 下载JFreeChart<br />
JFreeChart是开放源代码的免费软件，但是它的支持文档需要付费才能得到。其下载地址为：http://sourceforge.net/project/showfiles.php?group_id=15494，当前最新版本为1.0.6。笔者下载的是1.0.6最新版。<br />
说明：1）source目录：为jfreechart的源码目录；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2）lib目录：为包目录，我们需要关注的包为jfreechart-1.0.6.jar、gnujaxp.jar和jcommon-1.0.10.jar这三个包；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3）根目录下的jfreechart-1.0.6-demo.jar是例子程序，大家双击后可看到其中有很多例子的运行结果。<br />
2. 环境配置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 笔者的开发环境如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JDK：1.5<br />
MyEclipse：5.1.1 GA<br />
Tomcat：5.5.28<br />
为了后续的&#8220;用JFreeChart创建基于Web的图表&#8221;的一个例子的展示，我们在MyEclipse中创建一个名为jfreechart的Web工程。将下载的JFreeChart1.0.6下lib目录下的jar包拷贝到WebRoot/WEB-INF/lib目录下。另外还需要在web.xml文件中增加如下配置：<br />
&lt;servlet&gt;<br />
&lt;servlet-name&gt;DisplayChart&lt;/servlet-name&gt;<br />
&lt;servlet-class&gt;org.jfree.chart.servlet.DisplayChart&lt;/servlet-class&gt;<br />
&lt;/servlet&gt;<br />
&lt;servlet-mapping&gt;<br />
&lt;servlet-name&gt;DisplayChart&lt;/servlet-name&gt;<br />
&lt;url-pattern&gt;/DisplayChart&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;<br />
二．&nbsp;&nbsp; 柱状图</p>
<p>在WebRoot目录下建立bar目录，用来存放柱状图的各个例子。首先在该目录下建立一个sample1.jsp文件，让我们来看一个简单的柱状图的例子，修改后的sample1.jsp的内容如下所示：</p>
<p>&lt;%@ page contentType="text/html;charset=GBK"%&gt; &lt;%@ page import="org.jfree.chart.ChartFactory, org.jfree.chart.JFreeChart, org.jfree.chart.plot.PlotOrientation, org.jfree.chart.servlet.ServletUtilities, org.jfree.data.category.DefaultCategoryDataset"%&gt; &lt;% DefaultCategoryDataset dataset = new DefaultCategoryDataset(); dataset.addValue(610, "广州", "猪肉"); dataset.addValue(220, "广州", "牛肉"); dataset.addValue(530, "广州", "鸡肉"); dataset.addValue(340, "广州", "鱼肉"); JFreeChart chart = ChartFactory.createBarChart3D("肉类销量统计图", "肉类", "销量", dataset, PlotOrientation.VERTICAL, false, false, false); String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session); String graphURL = request.getContextPath() + "/DisplayChart?filename=" + filename; %&gt; &lt;img src="&lt;%= graphURL %&gt;" width=500 height=300 border=0 usemap="#&lt;%= filename %&gt;"&gt; </p>
<p>在浏览器中输入地址：http://localhost:8080/jfreechart/bar/sample1.jsp，可看到如下柱状图：</p>
<div style="text-indent: 21pt"><br />
<br />
<p align="center"><img height="294" alt="用JFreeChart增强JSP报表的用户体验（图一）" src="http://www.sucai.com/tech/newsfile/12000-12999/12619/080410212563410.jpg" width="504" border="0" /></p>
</div>
<div style="text-indent: 21pt"><br />
<br />
&nbsp;</div>
<div style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt">上面的这个柱状图比较简单，稍显单调，在有些情况下，我们需要用不同颜色来表示不同的种类，或者在种类上标上具体数值，亦或需要加上3D水晶效果。下面让我们来做更深一步的探讨。接下来让我们看一个用不同颜色来表示不通种类的例子。在WebRoot的bar目录下新建sample2.jsp页面，将其代码修改如下：<br />
<br />
</div>
<div style="scrollbar-highlight-color: buttonhighlight; overflow: auto; width: 500px">
<pre style="border-right: black 1px solid; padding-right: 4px; border-top: black 1px solid; padding-left: 4px; padding-bottom: 4px; border-left: black 1px solid; padding-top: 4px; border-bottom: black 1px solid; background-color: #ededed">
<div>&lt;%@ page contentType="text/html;charset=GBK"%&gt;
&lt;%@ 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"%&gt;
&lt;%
double[][] data = new double[][] {{1310}, {720}, {1130}, {440}};
String[] rowKeys = {"猪肉", "牛肉","鸡肉", "鱼肉"};
String[] columnKeys = {""};
CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data);
JFreeChart chart = ChartFactory.createBarChart3D("广州肉类销量统计图",
"肉类",
"销量",
dataset,
PlotOrientation.VERTICAL,
true,
false,
false);
String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);
String graphURL = request.getContextPath() + "/DisplayChart?filename=" + filename;
%&gt;
&lt;img src="&lt;%= graphURL %&gt;" width=500 height=300 border=0 usemap="#&lt;%= filename %&gt;"&gt;
</div>
</pre>
</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该页面的运行效果如下图所示：</div>
<div><br />
<br />
<p>&nbsp;</p>
<p align="center"><img height="277" alt="用JFreeChart增强JSP报表的用户体验（图二）" src="http://www.sucai.com/tech/newsfile/12000-12999/12619/080410212563411.jpg" width="464" border="0" /></p>
</div>
<div><br />
<br />
&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp; 对比该例与前例，可看出createBarChart3D的倒数第三个参数修改成了true，该参数可用来显示下方的： 。上两例我们显示的只是一个城市的肉类销量，有时候我们有对比显示多个城市的不同肉类，只要将上例稍作修改即可。例如要在图中表示广州、深圳、东莞、佛山四个城市的四个肉类的销售情况，只需要将如下三句稍做修改：<br />
<br />
</div>
<div>
<div style="scrollbar-highlight-color: buttonhighlight; overflow: auto; width: 500px">
<pre style="border-right: black 1px solid; padding-right: 4px; border-top: black 1px solid; padding-left: 4px; padding-bottom: 4px; border-left: black 1px solid; padding-top: 4px; border-bottom: black 1px solid; background-color: #ededed">
<div>double[][] data = new double[][] {{1310}, {720}, {1130}, {440}};
String[] rowKeys = {"猪肉", "牛肉","鸡肉", "鱼肉"};
String[] columnKeys = {""};
例如修改成：
double[][] data = new double[][] {{1310, 1220, 1110, 1000},
{720, 700, 680, 640},
{1130, 1020, 980, 800},
{440, 400, 360, 300}};
String[] rowKeys = {"猪肉", "牛肉","鸡肉", "鱼肉"};
String[] columnKeys = {"广州", "深圳", "东莞", "佛山"};</div>
</pre>
</div>
</div>
<div style="text-indent: 21pt">在运行该jsp页面，可看到如下界面：</div>
<div style="text-indent: 21pt">&nbsp;</div>
<div><br />
</div>
<p>&nbsp;</p>
<p align="center"><img height="301" alt="用JFreeChart增强JSP报表的用户体验（图三）" src="http://www.sucai.com/tech/newsfile/12000-12999/12619/080410212563412.jpg" width="502" border="0" /></p>
<p align="left">&nbsp;在上述几例中，在某个柱子上都没有显示相应的数值，下面让我们为每个柱子都加上它的数值，我们新建一个sample4.jsp页面，其内容如下：</p>
<p align="left">&lt;%@ page contentType="text/html;charset=GBK"%&gt; &lt;%@ 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"%&gt; &lt;% double[][] data = new double[][] {{1310, 1220, 1110, 1000}, {720, 700, 680, 640}, {1130, 1020, 980, 800}, {440, 400, 360, 300}}; String[] rowKeys = {"猪肉", "牛肉","鸡肉", "鱼肉"}; String[] columnKeys = {"广州", "深圳", "东莞", "佛山"}; CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data); JFreeChart chart = ChartFactory.createBarChart3D("肉类销量统计图", "肉类", "销量", dataset, PlotOrientation.VERTICAL, true, true, false); 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); //默认的数字显示在柱子中，通过如下两句可调整数字的显示 //注意：此句很关键，若无此句，那数字的显示会被覆盖，给人数字没有显示出来的问题 renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT)); renderer.setItemLabelAnchorOffset(10D); //设置每个地区所包含的平行柱的之间距离 //renderer.setItemMargin(0.3); plot.setRenderer(renderer); //设置地区、销量的显示位置 //将下方的&#8220;肉类&#8221;放到上方 plot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT); //将默认放在左边的&#8220;销量&#8221;放到右方 plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT); String filename = ServletUtilities.saveChartAsPNG(chart, 700, 400, null, session); String graphURL = request.getContextPath() + "/DisplayChart?filename=" + filename; %&gt; &lt;img src="&lt;%= graphURL %&gt;" width=700 height=400 border=0 usemap="#&lt;%= filename %&gt;"&gt;</p>
<p align="left">运行效果如下所示：</p>
<p align="left"><img alt="用JFreeChart增强JSP报表的用户体验（图四）" src="http://www.sucai.com/tech/newsfile/12000-12999/12619/080410212563413.jpg" width="590" border="0" /></p>
<p align="left">注意：jfreechart的很多版本不兼容，请大家在运行此例时确认下载了对应的版本。</p>
<p align="left">三．&nbsp; 饼图</p>
<p align="left">在WebRoot目录下建立名为pie的子目录，用来存放本教程中饼图的实例jsp页面。下面让我们来看一个简单的三维饼图。首先在pie目录下建立一个名为sample1.jsp的页面。<br />
在JFreeChart中，与饼图绘制密切相关的类如下：<br />
1）&nbsp; PiePlot<br />
饼图绘制类，可以用来设置饼图的相关属性。例如：<br />
PiePlot pieplot = (PiePlot)jfreechart.getPlot();<br />
pieplot.setLabelFont(new Font("SansSerif", 0, 12));<br />
pieplot.setNoDataMessage("No data available");<br />
pieplot.setCircular(false);<br />
pieplot.setLabelGap(0.02D);<br />
2）&nbsp; DefaultPieDataset<br />
默认的饼图数据集类，用来存储饼图显示的相关数据信息。例如：<br />
DefaultPieDataset dataset = new DefaultPieDataset();<br />
dataset.setValue("品德", new Double(0.2D));<br />
dataset.setValue("体育", new Double(0.2D));<br />
dataset.setValue("音乐", new Double(0.2D));<br />
dataset.setValue("其余成绩", new Double(0.4D));<br />
3）&nbsp; ChartFactory<br />
可利用该制图工厂类createPieChart来创建一个饼图的JFreeChart对象，例如：<br />
JFreeChart jfreechart = ChartFactory.createPieChart("饼图示例", dataset, true, true, false);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面让我们看一个简单的例子，修改sample1.jsp的内容如下：</p>
<p align="left">&lt;%@ page contentType="text/html;charset=GBK"%&gt; &lt;%@ page import="org.jfree.chart.*, org.jfree.chart.plot.PiePlot, org.jfree.data.general.DefaultPieDataset, org.jfree.chart.servlet.ServletUtilities, java.awt.*"%&gt; &lt;% //设置数据集 DefaultPieDataset dataset = new DefaultPieDataset(); dataset.setValue("初中高级程序员", 0.55); dataset.setValue("项目经理", 0.1); dataset.setValue("系统分析师", 0.1); dataset.setValue("软件架构师", 0.1); dataset.setValue("其他", 0.2); //通过工厂类生成JFreeChart对象 JFreeChart chart = ChartFactory.createPieChart3D("IT行业职业分布图", dataset, true, false, false); PiePlot pieplot = (PiePlot) chart.getPlot(); pieplot.setLabelFont(new Font("宋体", 0, 12)); //没有数据的时候显示的内容 pieplot.setNoDataMessage("无数据显示"); pieplot.setCircular(false); pieplot.setLabelGap(0.02D); String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session); String graphURL = request.getContextPath() + "/DisplayChart?filename=" + filename; %&gt; &lt;img src="&lt;%= graphURL %&gt;" width=500 height=300 border=0 usemap="#&lt;%= filename %&gt;"&gt;</p>
<p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以看出，饼图的绘制与柱状图的绘制类似，该例的运行效果如下：</p>
<p align="left"><img height="303" alt="用JFreeChart增强JSP报表的用户体验（图五）" src="http://www.sucai.com/tech/newsfile/12000-12999/12619/080410212563414.jpg" width="496" border="0" /></p>
<p align="left">有时候我们还想知道某块所占的具体分值，或者需要突出显示某一块。这时候需要对上例进行部分修改：dataset.setValue("其他", 0.2);后的那段改成：<br />
//通过工厂类生成JFreeChart对象<br />
JFreeChart chart = ChartFactory.createPieChart3D("IT行业职业分布图", dataset, true, false, false);<br />
PiePlot pieplot = (PiePlot) chart.getPlot();<br />
pieplot.setLabelFont(new Font("宋体", 0, 12));<br />
//没有数据的时候显示的内容<br />
pieplot.setNoDataMessage("无数据显示");<br />
pieplot.setCircular(false);<br />
setExplodePercent方法很重要，它将Label为某名称的某块挖出来突出显示，而后两句实现的效果是在&#8220;初中高级程序员&#8221;等名称后加上百分比，改成&#8220;初中高级程序员=55%&#8221;等。加上如上的代码后，同时还需要将相关的两个java包：org.jfree.chart.labels.StandardPieSectionLabelGenerator和java.text.NumberFormat引入到该jsp页面中。此时的运行结果如下：</p>
<p align="left"><img height="248" alt="用JFreeChart增强JSP报表的用户体验（图六）" src="http://www.sucai.com/tech/newsfile/12000-12999/12619/080410212563415.jpg" width="416" border="0" /></p>
<p align="left">&nbsp;通过JFreeChart还可以提供漂亮的水晶饼图效果，接着让我们新建一个sample3.jsp页面来体验一下超炫美图吧。修改sample3.jsp页面如下：<br />
&lt;%@ page contentType="text/html;charset=GBK"%&gt;<br />
&lt;%@ page import="org.jfree.chart.*,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.jfree.chart.servlet.ServletUtilities,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.jfree.util.Rotation,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.jfree.data.general.DefaultPieDataset,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.jfree.chart.plot.PiePlot3D"%&gt;<br />
&lt;%<br />
//设置数据集<br />
DefaultPieDataset dataset = new DefaultPieDataset();<br />
dataset.setValue("初中高级程序员", 0.55);<br />
dataset.setValue("项目经理", 0.1);<br />
dataset.setValue("系统分析师", 0.1);<br />
dataset.setValue("软件架构师", 0.1);<br />
dataset.setValue("其他", 0.2);<br />
&nbsp;<br />
//通过工厂类生成JFreeChart对象<br />
JFreeChart chart = ChartFactory.createPieChart3D("IT行业职业分布图", dataset, true, true, false);<br />
//获得3D的水晶饼图对象<br />
PiePlot3D pieplot3d = (PiePlot3D) chart.getPlot();<br />
//设置开始角度<br />
pieplot3d.setStartAngle(150D);<br />
//设置方向为&#8221;顺时针方向&#8220;<br />
pieplot3d.setDirection(Rotation.CLOCKWISE);<br />
//设置透明度，0.5F为半透明，1为不透明，0为全透明<br />
pieplot3d.setForegroundAlpha(0.5F);<br />
pieplot3d.setNoDataMessage("无数据显示");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);<br />
String graphURL = request.getContextPath() + "/DisplayChart?filename=" + filename;<br />
%&gt;<br />
&lt;img src="&lt;%= graphURL %&gt;"width=500 height=300 border=0 usemap="#&lt;%= filename %&gt;"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 利用setForegroundAlpha()方法可以设置3D饼图的透明度，利用setStartAngle()可以设置其开始角度，利用setDirection()方法可以设置其方向。该例的运行效果如下图所示：<br />
&nbsp;<img height="302" alt="用JFreeChart增强JSP报表的用户体验（图七）" src="http://www.sucai.com/tech/newsfile/12000-12999/12619/080410212563416.jpg" width="500" border="0" /></p>
 <img src ="http://www.blogjava.net/jvict/aggbug/318222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jvict/" target="_blank">Documents</a> 2010-04-14 09:15 <a href="http://www.blogjava.net/jvict/articles/318222.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】用JFreeChart增强JSP报表的用户体验 </title><link>http://www.blogjava.net/jvict/articles/223183.html</link><dc:creator>Documents</dc:creator><author>Documents</author><pubDate>Wed, 20 Aug 2008 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/jvict/articles/223183.html</guid><wfw:comment>http://www.blogjava.net/jvict/comments/223183.html</wfw:comment><comments>http://www.blogjava.net/jvict/articles/223183.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jvict/comments/commentRss/223183.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jvict/services/trackbacks/223183.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原文出处：http://tech.it168.com/j/2007-09-29/200709291132796.shtml&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本文请勿转载。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFreeChart是一组功能强大、灵活易用的Java绘图API，使用它可以生成多种通用性的报表，包括柱状图、饼图、曲线...&nbsp;&nbsp;<a href='http://www.blogjava.net/jvict/articles/223183.html'>阅读全文</a><img src ="http://www.blogjava.net/jvict/aggbug/223183.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jvict/" target="_blank">Documents</a> 2008-08-20 11:00 <a href="http://www.blogjava.net/jvict/articles/223183.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>