作为java web报表开发中的一把利器,如今网上jfreechart的文章有很多,但是没有介绍如何生成Multiple Pie Chart这种类型的饼图。我来填补这个空白把 ^ ^

源程序是基于Servlet / JSP的,jfreechart的版本是0.9.21。下面是需要说明的几点:
1、工厂类的createMultiplePieChart方法中的第二个参数类型为CategoryDataset。 由于这是个接口,我们在构建数据集时用实现此接口的DefaultCategoryDataset就可以了。注意不要用PieDataset来创建数据 集。
2、createMultiplePieChart方法中的第三个参数类型为org.jfree.util.TableOrder,取值TableOrder.BY_ROW和TableOrder.BY_COLUMN。具体作用大家试一下就明白了。
3、 如果要自定义饼图中的各个属性,在获取plot对象时要注意类型为MultiplePiePlot。先用getPieChart获取一个 JFreeChart对象,之后就可以用getPlot方法获取PiePlot类型。之后就可以用各种setter方法自定义设置了,由于数据集是 category,所以setter方法的范围是all or none。
4、最新版本中(1.0.3)设置标签格式的setLabelGenerator方法的参数由StandardPieItemLabelGenerator变为PieSectionLabelGenerator。只是名字变了。

<%@ page language="java" contentType="image/png;charset=GB2312"
import="java.text.*"
import="org.jfree.chart.*"
import="org.jfree.chart.servlet.*"
import="org.jfree.chart.plot.*"
import="org.jfree.chart.labels.StandardPieItemLabelGenerator"
import="org.jfree.chart.entity.*"
import="org.jfree.data.category.*"
import="org.jfree.util.*"
%>
<%

String bookType[] = ...{"社科类", "文学类", "体育类", "少儿类"};

String week[] = ...{"第1周", "第2周", "第3周", "第4周"};
String chartTitle = "各周图书销量";
// 创建数据集
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
// 构建数据
int bookSales;

for (int i = 0; i < bookType.length; i++) ...{

for (int j =0 ; j < week.length; j++) ...{
bookSales = 1 + (int)(Math.random() * 1000);
dataset.addValue(bookSales, bookType[i], week[j]);
}
}
// 获取JFreeChart对象
JFreeChart chart = ChartFactory.createMultiplePieChart (
chartTitle, // 图表标题
dataset, // 数据集
TableOrder.BY_COLUMN, // 指定被提取数据的顺序
false, // 是否包含图例
true, // 是否包含提示工具
false // 是否包含url
);


// 创建图像
int width = 800, height = 600;
// 获取PiePlot对象
MultiplePiePlot multiPlot = (MultiplePiePlot) chart.getPlot();
JFreeChart obj = multiPlot.getPieChart();
PiePlot plot = (PiePlot) obj.getPlot();
// 设置标签格式
plot.setLabelGenerator(new StandardPieItemLabelGenerator("{0} = {1} ({2})", NumberFormat.getNumberInstance(),
new DecimalFormat("0.00%")));
// 分离圆弧
for (int i = 0; i < week.length; i++)

...{
plot.setExplodePercent(i, 0.05);
}
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());

// 设置图片生成格式
String fileName = ServletUtilities.saveChartAsPNG(chart, width, height, info, session);
// 设置图片生成路径
String graphURL = request.getContextPath() + "/servlet/org.jfree.chart.servlet.DisplayChart?filename=" + fileName;
%>
<html>
<head>
<title><%= chartTitle %></title>
</head>
<body>
<p align="center">
<img src="<%= graphURL %>" border="1" />
</p>
</body>
</html>