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