目录
JfreeChart 的核心对象
制图对象
JFreeChart类是一个制图对象,它代表着一种制图类型。如:创建一个柱形图,首先需要创建一个柱形图的制图对象JFreeChart;创建一个饼形图,需要创建个饼形图的制图对象JFreeChart,在制图过程中,只有在创建制图对象JFreeChart后,才可以生成实际的图片。
在JFreeChart类中,可以设置所生成图片的边界、字体、背景、透明度等属性,其常用方法及说明如表1所示。
方法 | 说明 |
---|---|
public void setAntiAlias(boolean flag) | 设置字体模糊边界 |
public void setBackgroudImage(Image image) | 设置背景图片 |
public void setBackgroundImageAlignment(int alignment) | 设置背景图片对齐方式,其参数常量定义在org.jfree.ui.Align类中 |
public void setBackgroundImageAlpha(float alpha) | 设置背景图片透明度 |
public void setBackgroundPaint(Paint paint) | 设置背景颜色 |
public void setBorderPaint(Paint paint) | 设置边界线条颜色 |
public void setBorderVisible(boolean visible) | 设置边界线条是否可见 |
制图工厂对象
在生成图形报表时,制图对象JFreeChart是必不可少的对象,它可以直接通过new关键字进行实例化,也可以通过制图工厂ChartFacroty类进行实例化。当使用new关键字进行实例化时,需要设置大量的属性信息,因为JFreeChart组件提供图表的种类很多,对于每一种图表都进行特殊的设置,非常繁琐。所以在使用过程中,一般都使用制图工厂ChartFacroty类进行创建。
制图工厂ChartFacroty是一个抽象类,它不能被实例化,但此类之中提供创建各种制图对象的方法,如创建柱形图对象、区域图对象、饼形图对象、折线图对象等方法,这些方法都是静态的方法,可直接创建JFreeChart对象,并且是属于某一种具体的图表类型的JFreeChart对象,其使用非常方便,它的常用方法及说明如表1所示。
表1 ChartFactory 类常用方法及其说明
图表类型 | 方法 | 说明 |
---|---|---|
柱形图 | public static JFreeChart createBarChart() | 创建一个常规的柱形图对象 |
public static JFreeChart createBarChart3D() | 创建一个3D效果的柱形图对象 | |
饼形图 | public static JFreeChart createPieChart() | 创建一个常规的饼形图对象 |
public static JFreeChart createPieChart3D() | 创建一个3D 效果的饼形图对象 | |
区域图 | public static JFreeChart createAreaChart() | 创建一个常规的区域图对象 |
折线图 | public static JFreeChart createLineChart() | 创建一个常规的折线图对象 |
public static JFreeChart createLineChart3D() | 创建一个3D 效果的折线图对象 | |
时序图 | public static JFeeChart createTimeSeriesChart() | 创建一个常规的时序图对象 |
除表1中所列的方法外,ChartFacroty类还有很多创建各种类型制图对象的方法,在此不一一进行罗列。在ChartFacroty类中,对于同种类型的制图对象提供一个或多个方法,如表20.1中的所示的常规制图对象与3D效果的制图对象的方法。可见,制图工厂ChartFacroty类为创建制图对象提供了多个灵活的方法。
ChartFacroty类可以理解为是一个生产制图对象JFreeChart的工厂,当需要用到某一种类型的制图对象时,通过此工厂进行获取。
例如:
JFreeChart chart=ChartFactory.createPieChart3D(
"饼形图", //图表的标题
initPieData() , //饼形图的数据集对象
true , //是否显示图列
true , //是否显示提示文
false); //是否生成超链接
上述代码通过ChartFactory类的createPieChart3D()方法,创建了一个3D效果的饼形图JFreeChart对象。
数据集合对象
在JFreeChart组件的图形报表技术应用中,绘制一个图表需要一定的数据,JFreeChart组件通过提供的数据进行计算并绘制出图表信息。由于在数据的分析计算中并不是单一的数值,所以绘制图表要为JFreeChart组件提供数据集合。
数据集合对象是用于装载绘制图表所需要的数据集。在JFreeChart组件中,针对不同图表类型提供了不同的数据集合对象,它们所具有的作用也是不同的。本节内容将以常用的数据集合对象为例,来讲解JFreeChart中的数据集合对象,在学习JFreeChart数据集合对象前,先来了解一下常用数据集合对象之间的关系,其类图如图1所示。
Dataset接口是数据集合的核心对象,从图1可以看出,所有数据集合对象都直接或间接的实现了此接口。图中类名以Abstract开头的类均为抽象,它们并不能实例化,但为其子类提供公共属性与方法,其中DefaultCategoryDataset类、DefaultPieDataset类、XYSeriesCollection类与TimeSeriesCollection类为经常用到的数据集合对象,其说明如表1所示。
表1 常用数据集合对象 及说明
数据集合对象 | 说明 |
---|---|
DefaultCategoryDataset类 | 默认的类别数据集合对象,可用于创建柱形图、区域图数据集合等 |
DefaultPieDataset类 | 默认的饼形图数据集合对象,可用于创建饼形图数据集合 |
XYSeriesCollection类 | 描述坐标轴序列类型的数据集合,可用于创建折线图等数据集合 |
TimeSeriesCollection类 | 描述时间序列的数据集合,可用于创建时序图等数据集合 |
数据集合是数据集的封装对象,在JFreeChart组件的使用中,绘制每一种图形都需要用到数据集合对象。图1中只介绍了常用的数据集合关系,除了这些数据集合外,JFreeChart还针对不同图表各类提供了同的数据集合,由于篇幅原因,并进行一一介绍,其使用方法请参阅JFreeChart组件的API文档。
例如:
DefaultCategoryDataset dataset=new DefaultCategoryDataset(); //创建数据集合dataSet.addValue(100,"长春","土豆"); //向数据集合中添加数据
上述代码创建一个DefaultCategoryDataset类型的数据集合,并调用addValue()方法向数据集合中添加一个数据。
绘图区对象
通过数据集合所生成数据图表,可以通过绘图区对象进行属性设置,例如背景色、透明度等样式。绘图区对象是JFreeChart组件中的一个重要对象,它由Plot类定义,使用过程中可以通过此类进行设置绘图区属性及样式,其常用方法及说明如表1所示。
表1 Plot 类常用方法及说明
方法 | 说明 |
---|---|
public void setBackgroundImage(Image image) | 设置数据区的背景图片 |
public void setBackgroundImageAlignment(int alignment) | 设置数据区的背景图片对齐方式(参数常量在org.jfree.ui.Align类中定义) |
public void setBackgroundAlpha(float alpha) | 设置数据区的背景透明度,范围在0.0~1.0间 |
public void setForegroundAlpha(float alpha) | 设置数据区的前景透明度,范围在0.0~1.0间 |
public void setDataAreaRatio(double ratio) | 设置数据区占整个图表区的百分比 |
public void setOutLinePaint(Paint paint) | 设置数据区的边界线条颜色 |
public void setNoDataMessage(String message) | 设置没有数据时显示的消息 |
JFreeChart所能生成的图形报表是多种多样的,仅仅一个Plot类并不能满足绘图区样式的设置,在对不同类型图形的设置中,可以通过Plot的子类进行实现,其常用子类的类图如图1所示。
PiePlot 类
PiePlot类是Plot类的子类,主要用于描述PieDataset数据集合类型的图表,通常使用此类来绘制一个饼形图,其常用方法及说明如表2所示。
表2 PiePlot 类常用方法及说明
方法 | 说明 |
---|---|
public void setDataset(PieDataset dataset) | 设置绘制图表所需要的数据集合 |
public void setDataset(PieDataset dataset) | 设置绘制图表所需要的数据集合 |
public void setCircular(boolean flag) | 设置饼形图是否一定是正圆 |
public void setStartAngle(double angle) | 设置饼形图的初始角度 |
public void setDirection(Rotation direction) | 设置饼形图的旋转方向 |
public void setExplodePercent(int section,double percent) | 设置抽取图表的部分及距离 |
public void setLabelFont(Font font) | 设置分类标签字体(3D效果下无效) |
public void setLabelPaint(Paint paint) | 设置分类标签字体颜色(3D效果下无效) |
CategoryPlot 类
CategoryPlot类主要用于描述CategoryDataset数据集合类型的图表,是Plot类的子类,它支持折线图、区域图等,其常用方法及说明如表3所示。
表3 CategoryPlot 类常用方法及说明
方法 | 说明 |
---|---|
public void setDataset(PieDataset dataset) | 设置绘制图表所需要的数据集合 |
public void setColumnRenderingOrder(SortOrder order) | 设置数据分类的排序方式 |
public void setAxisOffset(Spacer offset) | 设置坐标轴到数据区的间距 |
public void setOrientation(PlotOrientation orientation) | 设置数据区的方向(横向或纵向) |
public void setDomainAxis(CategoryAxis axis) | 设置数据区的分类轴 |
public void setRangeAxis(ValueAxis axis) | 设置数据区的数据轴 |
public void addAnnotation(CategoryAnnotation annotation) | 设置数据区的注释 |
XYPlot 类
XYPlot类是Plot类的子类,主要用于描述XYDataset数据集合类型的图表,此类可以具有0或多个数据集合,并且每一个数据集合可以也一个渲染对象相关联,其常用方法及说明如表4所示。
表4 XYPlot 类常用方法及说明
方法 | 说明 |
---|---|
public ValueAxis getDomainAxis | 返回X轴 |
public ValueAxis getRangeAxis() | 返回Y轴 |
public void setDomainAxis(ValueAxis axis) | 设置X轴 |
public void setRangeAxis(ValueAxis axis) | 设置Y轴 |
坐标轴对象
在JFreeChart组件中,涉及到坐标轴类型的图表,其样式与属性由坐标轴对象Axis类进行控制,此类是坐标轴对象的父类,其常用方法及说明如表1所示。
表1 Axis 类常用方法及说明
方法 | 说明 |
---|---|
public void setVisible(boolean flag) | 设置坐标轴是否可见 |
public void setAxisLinePaint(Paint paint) | 设置坐标轴线条颜色,此设置在3D效果下无效 |
public void setAxisLineVisible(boolean visible) | 设置坐标轴线条是否可见 |
public void setLabel(String label) | 设置坐标轴标题 |
public void setLabelFont(Font font) | 设置坐标轴标题字体 |
public void setLabelPaint(Paint paint) | 设置坐标轴标题颜色 |
public void setLabelAngle(double angle) | 设置坐标轴标题旋转角度 |
JFreeChart组件针对不同类型的图表对象,提供了不同类型的坐标轴对象,由Axis类的子类进行扩展,其常用子类的类图如图1所示。
CategoryAxis 类
CategoryAxis类是Axis类的子类,主要用于对分类轴的相关属性进行设置,其常用方法及说明如表2所示。
表2 CategoryAxis类常用方法及说明
方法 | 说明 |
---|---|
public void setCategoryMargin(double margin) | 设置分类轴边距 |
public void setLowerMargin(double margin) | 设置分类轴下边距或左边距 |
public void setUpperMargin(double margin) | 设置分类轴上边距或右边距 |
public void setVerticalCategoryLabels(boolean flag) | 设置分类轴标题是否旋转到垂直 |
public void setMaxCategoryLabelWidthRatio(float ratio) | 设置分类轴分类标签的最大宽度 |
ValueAxis 类
ValueAxis类是Axis类的子类,主要用于对数据轴的相关属性进行设置,它还是NumberAxis类与DateAxis类的父类,其常用方法及说明如表3所示。
表3 ValueAxis 类常用方法及说明
方法 | 说明 |
---|---|
public void setAutoRange(boolean auto) | 设置数据轴数据范围是否为自动 |
public void setFixedAutoRange(double length) | 设置数据轴固定数据范围 |
public void setInverted(boolean flag) | 设置数据轴是否反向 |
public void setLowerMargin(double margin) | 设置分类轴下边距或左边距 |
public void setUpperMargin(double margin) | 设置分类轴上边距或右边距 |
public void setLowerBound(double min) | 设置数据轴上的显示最小值 |
public void setUpperBound(double max) | 设置数据轴上的显示最大值 |
NumberAxis 类
NumberAxis类主要用于对数值类型数据轴的相关属性进行设置,是ValueAxis类的子类,其常用方法及说明如表4所示。
表4 CategoryPlot 类常用方法及说明
方法 | 说明 |
---|---|
public void setAutoRangeIncludesZero(boolean flag) | 设置是否强制在自动选择的数据范围中包含0 |
public void setAutoRangeStickyZero(boolean flag) | 设置是否强制在整个数据轴中包含0,即使0不在数据范围中 |
public void setNumberFormatOverride(NumberFormat formatter) | 设置数据轴数据标签的显示格式 |
DateAxis 类
DateAxis类主要用于对日期轴的相关属性进行设置,是ValueAxis类的子类,其常用方法及说明如表5所示。
表5 CategoryPlot 类常用方法及说明
方法 | 说明 |
---|---|
public void setMaximumDate(Date maximumDate) | 设置日期轴上的最小日期 |
Public void setMinimumDate(Date minimumDate) | 设置日期轴上的最大日期 |
public void setDateFormatOverride(DateFormat formatter) | 设置日期轴日期标签的显示格式 |
public void setTickUnit(DateTickUnit unit) | 设置日期轴的日期标签 |
图片渲染对象
图片渲染对象用于渲染和显示图表,它在图表的显示效果方面起着很大的作用。在JFreeChart组件中,渲染对象定义为AbstractRenderer类,此类是所有渲染对象的父类,但它是一个抽象类,其常用方法及说明如表1所示。
在图片渲染对象中,JFreeChart组件同样对AbstractRenderer类进行了扩展,在使用过程中可根据实际需要,选择合适的AbstractRenderer类的子类对象。
JFreeChart 的应用
如何获取图片
JFreeChart组件能够生成.jpeg、.png格式的图片,其输出方式可以直接存储在硬盘之中,也可以交给JFreeChart组件进行管理。在Web项目的应用中,所生成的图形报表一般均为动态图表,如果对每次生成的图表都进行直接存储,将会产生大量的垃圾文件,时间长久将要做一定清理工作。因此,由JFreeChart组件管理所生成的图片是一个不错的选择,它不仅可以提供图片的路径,而且在查看图片后,JFreeChart组件自动做出清理工作。
JFreeChart组件提供了一个Servlet文件用于获取生成的图片,此Servlet文件存在于JFreeChart组件包中,所以在使用过程中,需要将其配置到Web.xml文件中,其配置方法如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>DisplayChart</servlet-name>
<servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
<servlet-mapping>
<servlet-name>DisplayChart</servlet-name>
<url-pattern>/servlet/DisplayChart</url-pattern>
</servlet-mapping>
</web-app>
ServletUtilities类的saveChartAsJPEG()方法进行生成,它返回一个.jpeg格式的图片名称。
public static String saveChartAsJPEG(JFreeChart chart ,int width,int height ,HttpSession session )throws IOException
参数的说明:
chart :制图对象JFreeChartford
width:所生成图片的宽度
height:所生成图片的高度
session”HttpSession对象
通过此方法生成图片后,调用已注册的JFreeChart提供的Servlet类DisplayChart,即可获取到图片的相对路径。
例如:在Jsp页面中获取图片。
<%
String fileName = ServletUtilities.saveChartAsJPEG(ChartUtil.createChart(), 450, 300, session);
String graphURL = request.getContextPath() + "/DisplayChart?filename=" + fileName;
%>
上述代码生成了一个宽为450、高为300的图片,其文件名fileName,它的路径为graphURL,通过此路径即可对所生成的图片进行访问。
创建数据集合与JFreeChart 实例
通过DefaultCategoryDataset数据集合对象创建柱形图制图对象,其关键代码如下:
import java.awt.Font;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
public class CharUtil {
//创建数据集合
public static CategoryDataset createDataSet(){
DefaultCategoryDataset dataSet=new DefaultCategoryDataset(); //实例化DefaultCategoryDataset对象
dataSet.addValue(500, "JAVA图书", "J2SE类"); //向数据集合中添加数据
dataSet.addValue(100, "JAVA图书", "JAVAME类");
dataSet.addValue(900, "JAVA图书", "J2EE类");
return dataSet;
}
//创建JFreeChart 对象
public static JFreeChart createChart (){
StandardChartTheme standardChartTheme=new StandardChartTheme("CN"); //创建主题样式
standardChartTheme.setExtraLargeFont(new Font("隶书",Font.BOLD,20)); //设置标题字体
standardChartTheme.setRegularFont(new Font("宋体",Font.PLAIN,15)); //设置图例的字体
standardChartTheme.setLargeFont(new Font("宋体", Font.PLAIN, 15)); //设置轴向的字体
ChartFactory.setChartTheme(standardChartTheme); //设置主题样式
//通过ChartFactory 创建JFreeChart
JFreeChart chart = ChartFactory.createBarChart3D(
"JAVA图书销量统计", //图表标题
"JAVA图书", //横轴标题
"销量(本)", //纵轴标题
createDataSet(), //数据集合
PlotOrientation.VERTICAL, //图表方向
false, //是否显示图例标识
false, //是否显示tooltips
false); //是否支持超链接
return chart;
}
}
ChartUtil类是一个自定义的制图工具类,其中createDataSet()方法用于创建柱形图所需要的数据集合,它返回CategoryDataset对象。CreateChart()用于创建制图对象JFreeChart,在此方法中通过ChartFactory对象的createBarChart3D()方法创建一个3D效果的柱形图对象,并将其返回。
DisplayChart进行获取图片,实例中在index.jsp页面中输出图片,其关键代码如下:
<%@ page language="java" contentType="text/html" pageEncoding="GBK"%>
<%@ page import="org.jfree.chart.servlet.ServletUtilities,com.lyq.util.ChartUtil"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Java图书销量统计</title>
</head>
<body>
<%
String fileName = ServletUtilities.saveChartAsJPEG(ChartUtil.createChart(),450,300,session);
String graphURL = request.getContextPath() + "/DisplayChart?filename=" + fileName;
%>
<img src="<%=graphURL%>" border="1">
</body>
</html>
ServletUtilities类的saveChartAsJPEG()方法进行生成,它返回一个.jpeg格式的图片名称。
在输出图片之前,首先要生成JFreeChart组件所绘制的图片,此操作通过调用ServletUtilities类的saveChartAsJPEG()方法进行生成,它返回一个.jpeg格式的图片名称。
在获取此图片名称后,通过代码“request.getContextPath() + “/DisplayChart?filename=” + fileName”即可获取到图片的路径.
图表相关属性的设置
通常情况下,为了使所生成图片美观、大方,需要对所生成的图片进行一定的设置,如制图对象设置、绘图区设置、坐标轴设置及图片渲染等。
import java.awt.Font;
import java.awt.Image;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer3D;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.VerticalAlignment;
/**
* 自定义绘图工具类
* @author Li Yong Qiang
*/
public class ChartUtil {
/*实例中首先创建数据集合对象DefaultCategoryDataset,并添加四个季度的销量数据,其关键代码如下:*/
/**
* 创建数据集合
* @return CategoryDataset对象
*/
public static CategoryDataset createDataSet() {
//实例化DefaultCategoryDataset对象
DefaultCategoryDataset dataSet = new DefaultCategoryDataset();
//添加第一季度数据
dataSet.addValue(6000, "第一季度", "J2SE类");
dataSet.addValue(3000, "第一季度", "J2ME类");
dataSet.addValue(12000, "第一季度", "J2EE类");
//添加第二季度数据
dataSet.addValue(8000, "第二季度", "J2SE类");
dataSet.addValue(4000, "第二季度", "J2ME类");
dataSet.addValue(6000, "第二季度", "J2EE类");
//添加第三季度数据
dataSet.addValue(5000, "第三季度", "J2SE类");
dataSet.addValue(4000, "第三季度", "J2ME类");
dataSet.addValue(8000, "第三季度", "J2EE类");
//添加第四季度数据
dataSet.addValue(8000, "第四季度", "J2SE类");
dataSet.addValue(2000, "第四季度", "J2ME类");
dataSet.addValue(9000, "第四季度", "J2EE类");
return dataSet;
}
/* createDataSet()方法定义在ChartUtil类中,它是一个自定义的制图工具类。在此类中,还包含创建制图对象的方法createChart(),用于柱形图对象,其关键代码如下: */
/**
* 创建JFreeChart对象
* @return JFreeChart对象
*/
public static JFreeChart createChart() {
//通过ChartFactory创建JFreeChart
JFreeChart chart = ChartFactory.createBarChart3D(
"JAVA图书销量统计", //图表标题
"JAVA图书", //横轴标题
"销量(本)", //纵轴标题
createDataSet(), //数据集合
PlotOrientation.VERTICAL, //图表方向
true, //是否显示图例标识
false, //是否显示tooltips
false); //是否支持超链接
//背景图片
Image image = null;
try {
//创建背景图片
image = ImageIO.read(ChartUtil.class.getResource("test.JPG"));
} catch (IOException e) {
e.printStackTrace();
}
//设置标题字体
chart.getTitle().setFont(new Font("隶书",Font.BOLD,25));
//设置图例类别字体
chart.getLegend().setItemFont(new Font("宋体",Font.PLAIN,12));
chart.setBorderVisible(true); //设置显示边框
//实例化TextTitle对象
TextTitle subTitle = new TextTitle("2009年Java类图书全国销量统计(J2SE、J2ME、J2EE)");
//设置居中显示
subTitle.setVerticalAlignment(VerticalAlignment.BOTTOM);
chart.addSubtitle(subTitle); //添加子标题
//获取绘图区对象
CategoryPlot plot = chart.getCategoryPlot();
plot.setForegroundAlpha(0.8F); //设置绘图区前