1.基本配置
在JFreeChart的官方网站(http://www.jfree.org/jfreechart/index.html)上可以下载到该插件,该插件有两个版本:
l jfreechart-1.0.6.zip,该版本适用于Windows系统。
l jfreechart-1.0.6.tar.gz,该版本适用于UNIX / Linux系统。
本书所有案例的开发环境均为Windows系统,解压缩jfreechart-1.0.6.zip后将得到一个名为jfreechart-1.0.6的文件夹,只需将lib子文件夹内的如下文件拷贝到WEB应用程序的/WEB-INF/lib文件夹内:
l jfreechart-1.0.5.jar
l jcommon-1.0.10.jar
l junit.jar
l gnujaxp.jar
l servlet.jar
并且在/WEB-INF/web.xml文件中添加如下代码,就可以利用JFreeChart插件生成统计图表了。
<servlet>
<servlet-name>DisplayChart</servlet-name>
<servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DisplayChart</servlet-name>
<url-pattern>/servlet/DisplayChart</url-pattern>
</servlet-mapping>
2.开发思路
在利用JFreeChart插件生成统计图表时,大体有两种开发思路,一种是通过工厂类ChartFactory创建JFreeChart实例,另一种是通过JFreeChart类创建JFreeChart实例。
在通过工厂类ChartFactory创建JFreeChart实例时,基本的开发思路如下:
(1)创建相应统计图的数据集实例。
(2)通过工厂类ChartFactory创建JFreeChart实例,ChartFactory类中的所有方法均需要传入一个数据集实例。
(3)订制图片和绘图区的绘制属性,该步可选。
(4)生成指定格式的图片,并返回生成图片的名称。
(5)组织图片浏览路径。
(6)通过HTML中的<img>元素显示图片。
在通过JFreeChart类创建JFreeChart实例时,基本的开发思路如下:
(1)创建相应统计图的绘图区实例;
(2)创建相应统计图的数据集实例,并传入绘图区实例;
(3)订制绘图区的绘制属性,例如绘图区的背景色,柱形图坐标轴的绘制属性,饼形图图例的填充色等,该步可选;
(4)通过JFreeChart类创建JFreeChart实例,JFreeChart类的所有构造方法均需要传入一个绘图区实例;
(5)订制图片的绘制属性,例如图片的标题、背景色等,该步可选;
(6)生成指定格式的图片,并返回生成图片的名称;
(7)组织图片浏览路径;
(8)通过HTML中的<img>元素显示图片。
3.核心API简介
在使用JFreeChart插件之前,先了解一下该插件的核心类及其功能,这对将来能够得心应手的使用该插件是非常重要的,JFreeChart核心类及其功能请参见表5.1。
表5.1 JFreeChart核心类及其功能
类名 | 功能 |
JFreeChart | 图表对象。生成任何类型的图表都要通过该对象,JFreeChart插件提供了一个工厂类ChartFactory,用来创建各种类型的图表对象 |
XXXDataset | 数据集对象。用来保存绘制图表的数据,不同类型的图表对应着不同类型的数据集对象 |
XXXPlot | 绘图区对象。如果需要自行定义绘图区的相关绘制属性,需要通过该对象进行设置 |
XXXAxis | 坐标轴对象。用来定义坐标轴的绘制属性 |
XXXRenderer | 图片渲染对象。用于渲染和显示图表 |
XXXURLGenerator | 链接对象。用于生成Web图表中项目的鼠标单击链接 |
XXXToolTipGenerator | 图表提示对象。用于生成图表提示信息,不同类型的图表对应着不同类型的图表提示对象 |
通过工厂类ChartFactory,可以创建各种类型的图表对象,常用的创建JFreeChart实例的方法及其功能请参见表5.2。
表5.2 ChartFactory类中常用方法及其功能
名称 | 功能 |
createBarChart()和createBarChart3D() | 分别用来创建绘制普通柱形图和3D柱形图的JFreeChart实例,它们基于的是DefaultCategoryDataset类型的数据集 |
createXYBarChart() | 用来创建绘制普通柱形图的JFreeChart实例,它基于的是TimeSeries类型的数据集,TimeSeries数据集主要用来绘制与日期和时间相关的统计图 |
createStackedBarChart()和createStackedBarChart3D() | 它们同createBarChart()和createBarChart3D()的功能相同,只是绘制出的柱形图效果不同,它们可以互换使用 |
createPieChart()和createPieChart3D() | 分别用来创建绘制普通饼形图和3D饼形图的JFreeChart实例,它们基于的是DefaultPieDataset类型的数据集 |
createLineChart()和createLineChart3D() | 分别用来创建绘制普通折线图和3D折线图的JFreeChart实例,它们基于的是DefaultCategoryDataset类型的数据集 |
createXYLineChart() | 用来创建绘制普通折线图的JFreeChart实例,它基于的是TimeSeries类型的数据集,TimeSeries数据集主要用来绘制与日期和时间相关的统计图 |
createAreaChart() | 用来创建绘制普通区域图的JFreeChart实例,它基于的是DefaultCategoryDataset类型的数据集 |
createXYAreaChart() | 用来创建绘制普通区域图的JFreeChart实例,它基于的是TimeSeries类型的数据集,TimeSeries数据集主要用来绘制与日期和时间相关的统计图 |
createTimeSeriesChart() | 用来创建绘制普通时序图的JFreeChart实例,时序图与折线图有些类似,不过时序图提供了绘制移动平均线的功能,通过给定的数据集实例,可以 自动计算任意时间段的移动平均值,它基于的是TimeSeries类型的数据集,TimeSeries数据集主要用来绘制与日期和时间相关的统计图 |
注意:ChartFactory类中的所有方法均需要传入一个数据集实例,并且返回值类型均为JFreeChart!
如果是通过工厂类ChartFactory创建JFreeChart实例,可以通过ChartFactory类提供的方 法获得绘图区实例;如果是通过JFreeChart类创建JFreeChart实例,则需要在创建JFreeChart实例之前订制好绘图区实例,然后在 创建时传入。常用的绘图区类及其功能请参见表5.3。
表5.3 常用的绘图区类及其功能
名称 | 功能 |
CategoryPlot | 在绘制基于DefaultCategoryDataset数据集的柱形图、折线图、区域图时,绘图区为该类型 |
PiePlot | 在绘制普通饼形图时,绘图区为该类型 |
PiePlot3D | 在绘制3D饼形图时,绘图区为该类型 |
XYPlot | 在绘制基于TimeSeries数据集的柱形图、折线图、区域图时,绘图区为该类型 |
表5.3中介绍的几个绘图区类均继承于Plot类,Plot类提供的经常用来订制绘图区绘制属性的方法及其功能请参见表5.4。
表5.4 Plot类提供的常用方法及其功能
名称 | 功能 |
setBackgroundPaint(Paint paint) | 用来设置绘图区的背景色 |
setBackgroundAlpha(float alpha) | 用来设置绘图区背景的透明度,参数在0.0和1.0之间,数值越大透明度越低 |
setForegroundAlpha(float alpha) | 用来设置绘图区前景的透明度,参数在0.0和1.0之间,数值越大透明度越高 |
setNoDataMessage(String message) | 用来设置在没有绘图数据时在绘图区显示的提示信息 |
setNoDataMessageFont(Font font) | 用来设置没有绘图数据时显示的提示信息的字体 |
setNoDataMessagePaint(Paint paint) | 用来设置没有绘图数据时显示的提示信息的颜色 |
CategoryPlot类提供的经常用来订制绘图区绘制属性的方法及其功能请参见表5.5。
表5.5 CategoryPlot类提供的常用方法及其功能
名称 | 功能 |
setDataset(CategoryDataset dataset)和setDataset(int, CategoryDataset) | 均用来设置绘图数据集实例,后者的第一个参数为数据集的唯一标识值,前者是采用默认标识值(0)。如果在一个绘图区中只包含一个分类轴和一个数值轴,建议使用前者;否则,一定要通过后者为每个数据集实例指定一个唯一标识值 |
setDomainAxis(CategoryAxis axis) | 用来设置分类轴实例 |
setDomainAxisLocation(AxisLocation location) | 用来设置分类轴的绘制位置,入口参数常量在org.jfree.chart.axis.AxisLocation类中做了定义 |
setDomainGridlinesVisible(boolean visible) | 用来设置分类轴标记线是否可见,默认为不可见(false) |
setDomainGridlineStroke(Stroke stroke) | 用来设置分类轴标记线的绘制风格 |
setDomainGridlinePaint(Paint paint) | 用来设置分类轴标记线的颜色 |
setRangeAxis(ValueAxis axis) | 用来设置数据轴实例 |
setRangeAxisLocation(AxisLocation location) | 用来设置数据轴的绘制位置,入口参数常量在org.jfree.chart.axis.AxisLocation类中做了定义 |
setRangeGridlinesVisible(boolean visible) | 用来设置数据轴标记线是否可见,默认为可见(true) |
setRangeGridlineStroke(Stroke stroke) | 用来设置数据轴标记线的绘制风格 |
setRangeGridlinePaint(Paint paint) | 用来设置数据轴标记线的颜色 |
mapDatasetToDomainAxis(int, int) | 用来将指定标识值的绘图数据集与分类轴建立关联 |
mapDatasetToRangeAxis(int, int) | 用来将指定标识值的绘图数据集与数据轴建立关联 |
PiePlot类提供的经常用来订制绘图区绘制属性的方法及其功能请参见表5.6。
表5.6 PiePlot类提供的常用方法及其功能
名称 | 功能 |
setCircular(boolean flag) | 用来设置饼图为正圆还是椭圆,默认为正圆(true)。建议在绘制普通饼图时采用正圆,在绘制3D饼图时采用椭圆 |
setStartAngle(double angle) | 用来设置饼图第一段圆弧的起始绘制角度,默认为在饼图的正上方开始绘制。水平方向饼图的最左侧为0度,最右侧为180度;垂直方向饼图的正上方为90度,正下方为270度 |
setDirection(Rotation direction) | 用来设置饼图的绘制方向,默认为按顺时针方向绘制。Rotation.CLOCKWISE代表顺时针,Rotation.ANTICLOCKWISE代表逆时针 |
setLegendLabelGenerator(PieSectionLabelGenerator generator) | 用来设置饼图中图例的输出样式 |
setLabelGenerator(PieSectionLabelGenerator generator) | 用来设置饼图中普通标签的输出样式,当设置为NULL时,则不显示普通标签及连接线 |
setLabelFont(Font font) | 用来设置饼图中普通标签的字体样式 |
setLabelPaint(Paint paint) | 用来设置饼图中普通标签的字体颜色 |
setLabelBackgroundPaint(Paint paint) | 用来设置饼图中普通标签的背景颜色 |
setLabelOutlinePaint(Paint paint) | 用来设置饼图中普通标签的边框颜色 |
setLabelLinkPaint(Paint paint) | 用来设置饼图中普通标签与圆弧之间连接线的颜色 |
setSectionPaint(Comparable, Paint) | 用来设置饼图中代表指定图例的扇形的填充色 |
setToolTipGenerator(PieToolTipGenerator generator) | 用来设置热点饼图中热区标签的输出样式 |
setURLGenerator(PieURLGenerator generator) | 用来设置热点饼图中热区链接的URL |
setIgnoreNullValues(boolean flag) | 用来设置是否显示绘图数据设为NULL的图例,默认为显示(false) |
setIgnoreZeroValues(boolean flag) | 用来设置是否显示绘图数据设为0的图例,默认为显示(false) |
PiePlot3D类仅提供了一个用来设置3D饼图Z轴高度的方法setDepthFactor(double factor)。
XYPlot类提供的经常用来订制绘图区绘制属性的方法及其功能请参见表5.7。
表5.7 XYPlot类提供的常用方法及其功能
名称 | 功能 |
setDataset(CategoryDataset dataset)和setDataset(int, CategoryDataset) | 均用来设置绘图数据集实例,后者的第一个参数为数据集的唯一标识值,前者是采用默认标识值(0)。如果在一个绘图区中只包含一个分类轴和一个数值轴,建议使用前者;否则,一定要通过后者为每个数据集实例指定一个唯一标识值 |
setDomainAxis(CategoryAxis axis) | 用来设置分类轴实例 |
setDomainAxisLocation(AxisLocation location) | 用来设置分类轴的绘制位置,入口参数常量在org.jfree.chart.axis.AxisLocation类中做了定义 |
setDomainGridlinesVisible(boolean visible) | 用来设置分类轴标记线是否可见,默认为不可见(false) |
setDomainGridlineStroke(Stroke stroke) | 用来设置分类轴标记线的绘制风格 |
setDomainGridlinePaint(Paint paint) | 用来设置分类轴标记线的颜色 |
setRangeAxis(ValueAxis axis) | 用来设置数据轴实例 |
setRangeAxisLocation(AxisLocation location) | 用来设置数据轴的绘制位置,入口参数常量在org.jfree.chart.axis.AxisLocation类中做了定义 |
setRangeGridlinesVisible(boolean visible) | 用来设置数据轴标记线是否可见,默认为可见(true) |
setRangeGridlineStroke(Stroke stroke) | 用来设置数据轴标记线的绘制风格 |
setRangeGridlinePaint(Paint paint) | 用来设置数据轴标记线的颜色 |
mapDatasetToDomainAxis(int, int) | 用来将指定标识值的绘图数据集与分类轴建立关联 |
mapDatasetToRangeAxis(int, int) | 用来将指定标识值的绘图数据集与数据轴建立关联 |
可以通过绘图区实例获得坐标轴实例,然后设置坐标轴的绘制属性;也可以将设置好的坐标轴实例传入到绘图区实例中。常用的坐标轴类及其功能请参见表5.8。
表5.8 常用的坐标轴类及其功能
名称 | 功能 |
CategoryAxis | 用来定义分类型坐标轴 |
ValueAxis | 用来定义数值型坐标轴,包括普通的数值型和日期型 |
NumberAxis | 用来定义普通数值型坐标轴 |
DateAxis | 用来定义日期型坐标轴 |
Axis类是表5.8中介绍的几个类的父类,Axis类提供的经常用来订制绘图区绘制属性的方法及其功能请参见表5.9。
表5.9 Axis类提供的常用方法及其功能
名称 | 功能 |
setLabel(String label) | 用来设置坐标轴标题 |
setLabelFont(Font font) | 用来设置坐标轴标题的字体 |
setLabelPaint(Paint paint | 用来设置坐标轴标题的颜色 |
setLabelAngle(double angle) | 用来设置坐标轴标题的旋转角度 |
setTickLabelFont(Font font) | 用来设置坐标轴标尺值的字体 |
setTickLabelPaint(Paint paint) | 用来设置坐标轴标尺值的颜色 |
setTickMarkStroke(Stroke stroke) | 用来设置坐标轴标尺标记的笔触 |
setTickMarkPaint(Paint paint) | 用来设置坐标轴标尺标记的颜色 |
CategoryAxis类提供的经常用来订制绘图区绘制属性的方法及其功能请参见表5.10。
表5.10 CategoryAxis类提供的常用方法及其功能
名称 | 功能 |
setLowerMargin(double margin) | 用来设置分类轴的下边距 |
setUpperMargin(double margin) | 用来设置分类轴的上边距 |
setCategoryMargin(double margin) | 用来设置分类轴之间的间距 |
setMaxCategoryLabelWidthRatio(float ratio) | 用来设置显示分类轴标记内容的最大比例,如果设为1,表示可以显示标记内容的最大长度与绘图所占宽度相同 |
ValueAxis类是NumberAxis类和DateAxis类的父类,ValueAxis类提供的经常用来订制绘图区绘制属性的方法及其功能请参见表5.11。
表5.11 ValueAxis类提供的常用方法及其功能
名称 | 功能 |
setFixedAutoRange(double length) | 用来动态设置数据轴的标尺范围。例如设置入口参数为100,表示数据轴的标尺范围为从(MaxValue-100)到(MaxValue) |
setLowerBound(double min) | 用来设置数据轴标尺值的最小值 |
setUpperBound(double max) | 用来设置数据轴标尺值的最大值 |
setVerticalTickLabels(boolean flag) | 用来设置日期轴标记值是否垂直显示,默认为水平显示(false) |
NumberAxis类提供的经常用来订制绘图区绘制属性的方法及其功能请参见表5.12。
表5.12 NumberAxis类提供的常用方法及其功能
名称 | 功能 |
setNumberFormatOverride(NumberFormat formatter) | 用来简单格式化数据轴标尺值的输出样式 |
setTickUnit(NumberTickUnit unit) | 即可以格式化数据轴标尺值的输出样式,又可以设置标尺值之间的间隔 |
DateAxis类提供的经常用来订制绘图区绘制属性的方法及其功能请参见表5.13。
表5.13 DateAxis类提供的常用方法及其功能
名称 | 功能 |
setDateFormatOverride(DateFormat formatter) | 用来简单格式化日期轴标尺值的输出样式 |
setTickUnit(DateTickUnit unit) | 即可以格式化日期轴标尺值的输出样式,又可以设置标尺值之间的间隔 |
通过上面对JFreeChart常用类及方法的研究,就可以利用JFreeChart插件绘制出漂亮的统计图表了。