作为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
>