利用JFreeChart生成饼形图
通过JFreeChart插件,即可以生成普通效果的饼形图,也可以生成3D效果的饼形图;如果想生成普通效果的饼形图,需要通过工厂类ChartFactory的createPieChart()方法获得JFreeChart类的实例,如果想生成3D效果的饼形图,需要通过工厂类ChartFactory的createPieChart3D()方法获得JFreeChart类的实例,这两个方法的入口参数是完全相同的,各个入口参数的类型及功能如表14.3所示。
表14.3 绘制饼形图方法的入口参数类型及功能
参 数 序 号 |
入 口 参 数 |
参 数 功 能 |
1 |
String title |
图表标题 |
2 |
PieDataset dataset |
绘图数据集 |
3 |
boolean legend |
用于设定是否显示图例 |
4 |
boolean tooltips |
用于设定是否采用标准生成器 |
5 |
boolean urls |
用于设定是否包生成链接 |
绘制饼形图时,需要通过DefaultPieDataset数据集封装数据,该数据集中的每一个元素是由一组键值对组成的,这与Map集合有些类似,DefaultPieDataset数据集通过setValue()方法添加数据,setValue()方法有两个重载方法,均有两个入口参数,并且每个参数的含义是相同的,第一个入口参数为图例名称,第二个入口参数统计数据,它们的具体定义如下:
public void setValue(Comparable key, Number value) {
this.data.setValue(key, value);
fireDatasetChanged();
}
public void setValue(Comparable key, double value) {
setValue(key, new Double(value));
}
可以通过绘图区对象PiePlot的setForegroundAlpha(float alpha)方法,实现饼图的透明效果,入口参数alpha的取值范围在0.0和1.0之间,当为0.0时,将不显示饼图,当为1.0时,则不存在透明效果,当超出该范围时,将抛出如下异常:
java.lang.IllegalArgumentException: alpha value out of range
示例14-03 编程类图书年销售额百分比饼形图分析
下面来看一个绘制饼形图的例子,该例绘制的饼形图效果如图14.4和图14.5所示。
图14.4 普通效果的饼形图 图14.5 3D效果的饼形图
代码14-03 光盘位置:光盘\mingrisoft\14\sl\03
本示例使用的模拟绘图数据如下:
String[] cutline; // 图例
Double[] data; // 绘图数据
this.cutline = new String[] { "ASP", "JSP", "PHP", "Hibernate", "Spring", "数据库" };
this.data = new Double[cutline.length];
for (int i = 0; i < data.length; i++) {
data[i] = 1 + Math.random() * 100;
}
创建DefaultPieDataset数据集的代码如下:
DefaultPieDataset dataset = new DefaultPieDataset();
for (int i = 0; i < cutline.length; i++) {
dataset.setValue(cutline[i], data[i]);
}
创建绘制3D效果饼形图的JFreeChart实例,代码如下:
JFreeChart chart = ChartFactory.createPieChart3D(chartTitle, // 图表标题
dataset, // 绘图数据集
False, // 设定是否显示图例
False, // 设定是否显示图例名称
False); // 设定是否生成链接
说明:这里绘制的是图14.5所示的3D效果图,如果想绘制图14.4所示的普通效果图,只需将createPieChart3D()方法改为createPieChart()方法。
当需要在图片上显示中文时,建议不要使用反锯齿功能,这样能够保证汉字的清晰度,代码如下:
chart.setAntiAlias(False);
可以自行定义图表标题的字体、样式、大小和颜色等,代码如下:
TextTitle title = chart.getTitle();
title.setFont(new Font("汉真广标", Font.BOLD, 21));
title.setPaint(Color.RED);
下面通过绘图区对象设置饼状图的绘制方向,可以按顺时针方向绘制,也可以按逆时针方向绘制,以及开始绘制第一段圆弧的角度,关键代码如下:
plot.setDirection(Rotation.ANTICLOCKWISE);
plot.setStartAngle(90);
可以设置饼形图的外观效果,例如圆形(True)或椭圆形(False),默认为圆形,建议在绘制3D效果图时将其设为False,