1 简介
JFreeChart 是 SourceForge.net 上的一个开源项目,它的源码和 API 都可以免费获得。 JFreeChart 的功能非常强大,可以实现饼图 ( 二维和三维 ) , 柱状图 ( 水平 , 垂直 ), 线图 , 点图 , 时序图 , 甘特图 , 股票行情图 , 混和图 , 温度计图 , 刻度图等常用商用图表, 图形可以导出成 PNG 和 JPEG 格式,同时还可以与 PDF 和 EXCEL 关联,支持对图形的放大、缩小,支持常见图形的 3D 显示。
2 图形 对象的处理
2 .1 JFreeChart 对象
JFreeChart
可以生成很多图形对象,它的工厂类提供了
33
个工厂方法用于生成不同的图形对象(具体的工厂方法可以参见
JFreeChart
的
API
手册或者源码中的
ChartFactory
类
)。
JFreechart
对图形对象的抽象具体化。图形对象(
JFreeChart
),由
Title(
主标题
)
,
SubTitle
(子标题
)
,
Plot
(图形的绘制结构)等几个主要对象组成。各个组成部分如下图所示:
这是一个 JFreeChart 对象,上面的“ chart 标题”是 Title 对象,中间区域是 Plot 对象(包括绘图区域和坐标轴区域),下面的区域是 LegendTitle 对象,是一种 SubTitle 对象。
每个 JFreeChart 对象只能有 1 个 Title 对象, 1 个 Plot 对象,可以有多个 SubTitle 对象。 JFreeChart 对象可以进行的操作有:背景的设置(背景颜色、背景图片、透明度等)、边框的设置(是否可见、笔画、 Paint 等)、渲染方式的设置、标题对象的设置、子标题对象的增删查操作。(本文中的所有操作都不提供代码级的介绍,可参见 API 手册或者源码)
2 .2 主标题对象
主标题对象是 TextTitle 类型,可以进行的操作有:背景设置、字体设置(字体类型、颜色、内容、对齐方式等操作)、 tooltip 设置、 URL 设置。
2 .3 Plot 对象
Plot 对象是图形的绘制结构对象。 JFreeChart 中含有很多不同的 Plot 对象,每一种图形对象中的 Plot 对象都在实例化的时候创建。所有的 Plot 共有的操作有:背景设置(背景颜色、背景图片、透明度等)、前景透明度设置、无数据存在情况的设置(显示的字符内容、显示的字体、显示的 Paint )、放大缩小比例的设置,大部分 Plot 对象还有设置 Datset 、设置 Renderer 对象操作。
JFreeChart 中有 18 种 Plot 抽象类的具体实现类。 Plot 的具体实现类主要由以下重要对象组成: Renderer 对象(图形的绘制单元——绘图域) Datset (图形的数据源), DomainAxis (区域轴,相当于 x 轴), RangeAxis (范围轴,相当于 y 轴)。不同的 Plot 对象组成方式不尽相同,有的不含有 Renderer 对象,比如 CompassPlot 、 ContourPlot 、 MultiplePiePlot 、 PiePlot 等,有的不含有 DomainAxis 、 RangeAxis 对象,另外除了 FastScatterPlot 类都含有 Datset 对象, FastScatterPlot 使用 float 的二维数组充当数据源。尤其说明一点,饼状图相关的 Plot 对象( MultiplePiePlot 、 PiePlot 、 PiePlot3D 、 RingPlot )中都不含有 Renderer 对象、 DomainAxis 对象、 RangeAxis 对象。
一般来说, Datset 对象存储数据模型, Renderer 对象存储显示模型, Plot 对象根据 Datset 对象、 Renderer 对象完成画图操作。
仍以上面的图形讲解
Plot
对象的组成。
上图的中间区域是是一个 XYPlot 对象。其中的折线部分即是图形的绘制单元 Renderer 对象。 X 轴是 DomainAxis , y 轴是 RangeAxis ,其中 Datset 对象属于数据模型范畴,是 UI 不可见对象。该图中的 plot 背景色、网格线的各种设置可以通过 XYPlot 对象本身完成。
下面讲解 Renderer 对象、 Axis 对象( X 轴、 y 轴都属于 Axis 对象), Datset 对象在后续章节中专门讲解。
2 .3 .1 Renderer 对象
Renderer 对象是图形的绘制单元。 JFreeChart 提供了两个接口 CategoryItemRenderer 和 XYItemRenderer 、 1 个抽象类 AbstractRenderer 供具体的 Renderer 类实现,给出了将近 50 种具体实现类。
一般来说
Renderer
对象可进行的操作有:对
item label
(下图中的柱状图上的红色数字即为
item label
的示例)的默认设置(
item label
的产生方式、是否可见、字体、
Paint
、正反向
item label
的位置设置等)、绘制图形的边框默认设置(
Paint
、笔画、是否可见等)、绘制图形的默认设置(形状、笔画、是否可见、对应的图例中是否可见等,折线图还有线条是否可见、折点图形是否可见、折点图形是否填充、折点图形的形状、对应的图例中线条是否可见、图形是否可见、整体是否可见等)、以及对指定
item label
的设置、指定绘制图形的设置。可以说和具体绘制的图形相关的属性都可以通过
Renderer
对象设置。
不同的 Renderer 的实现类实现了不同的显示方式,在含有 Renderer 对象的 JFreeChart 对象中, R enderer 对象决定了JFreeChart 对象的显示方式。例如:柱状图的Plot 对象中默认的Renderer 对象是 CategoryItemRenderer 对象,通过设置 Plot 对象的Renderer 对象 为 LineAndShapeRenderer ,则柱状图变为线图。使用中一般不需要显式的实例化一个 R enderer 对象,一般通过 JFreeChart 对象的 Plot 对象调用现有的 R enderer 对象进行重新设置等操作。
2 .3 .2 Axis 对象
JFreeChart 提供了两种类型的坐标轴: CategoryAxis (等级轴)和 ValueAxis (值轴), ValueAxis 又有 3 个子类: DateAxis (时间轴)、 NumberAxis (数字轴)、 PeriodAxis (时期轴)。这些坐标轴还有更详细的子类,不再一一列举
Axis 对象可进行的操作有:标题的设置(内容、字体、Paint 、显示角度等)、坐标线的设置(笔画、Paint 、是否可见等)、刻度线的设置(是否可见、笔画、Paint 、位于绘图区域的长度、位于绘图区域外的长度等)、刻度标示的设置(笔画、Paint 、字体、与轴的距离等)、坐标轴范围设置等。
CategoryAxis 对象还可以进行的操作有: 刻度标示间距 设置( 最小间距、最大间距、指定间距)等。
ValueAxis 对象可进行的操作有:轴端设置(显示的图形形状)、范围设置(是否自动产生范围、自动产生的最小范围、最大范围、指定确定范围、指定范围大小等)、间隔设置(是否自动产生间隔、指定间隔)等。
DateAxis 对象还有对时间刻度显示格式的设置操作。
2 . 4 子标题对象
子标题对象是 Title 类型的对象,一个JFreeChart 可以有多个子标题对象。JFreeChart 提供了5 种Title 的实现,可以是图片、文本、图例等的形式。
(数据源以及常用图形的处理以及进一步的讨论在后续文章中介绍)
JFreeChart
中的数据源是DataSet
接口类型。该接口有三个主要的子类接口:CategoryDataset
、PieDataset
、SeriesDataset
CategoryDataset
接口的实现类基本上都维护了一个三元组<value,row,col>
的列表结构。不同的实现类中value
的类型不相同。<row,col>
唯一确定一个三元组。CategoryDataset
的实现类提供对这个三元组的增删改查操作。
PieDataset
接口有两个主要的实现类:CategoryToPieDataset
、DefaultPieDataset
。PieDataset
接口的实现类基本上都维护了一个二元组<key,value>
的列表结构。Key
唯一确定一个二元组。CategoryDataset
的实现类提供对这个二元组的增删改查操作。CategoryToPieDataset
中的二元结构列表通过对CategoryDataset
类型的对象指定行或者列转化过来。DefaultPieDataset
直接维护一个二元结构列表。
SeriesDataset
接口的实现类基本上都维护了一种特定数据结构的列表。以TimeSeriesCollection
为例。它维护一个TimeSeries
对象列表,提供对该列表的增删查操作。每个TimeSeries
对象维护一个<time,value>
列表,提供对该列表的增删改查操作。
JFreeChart
并不存在多个不同的类来生成不同的图形。所有的图形都是具体类
JFreeChart
的实例化对象,初始化
JFreeChart
对象的时候通过指定不同的
Plot
实现类就可以显示出不同的图形。不同的
Plot
实现类具有不同的
Renderer
对象、
Axis
对象、
Dataset
对象。
JFreeChart
提供工厂类
ChartFactory
方便使用者生成各种不同的图形。
ChartFactory
类的各个工厂方法中实现对具体
Plot
的指定以及对类
JFreeChart
构造函数的调用。
下面以常用图形说一下常用的使用流程(大部分的操作讲的并不全面,比如
JFreeChart
可能提供了很多增加、修改数据的方式,下文中可能只列举一种)。
(
1
)平面柱状图
生成柱状图操作:
JFreeChart chart = ChartFactory.createBarChart(
String title,
//
图标题
String categoryAxisLabel,
//x
轴标题
String valueAxisLabel,
//y
轴标题
CategoryDataset dataset,
//
数据源
PlotOrientation orientation,
//
显示方向
boolean legend,
//
是否显示图例
boolean tooltips,
//
是否显示
tooltip
boolean urls)
;
//
是否指定
url
平面柱状图的
Plot
对象是
CategoryPlot
类型。
CategoryPlot
对象的
x
轴是
CategoryAxis
对象,
y
轴是
NumberAxis
对象,绘制单元是
BarRenderer
对象,数据源是
CategoryDataset
对象。
获取
CategoryPlot
对象操作为:
CategoryPlot
plot = (
CategoryPlot
) chart.getPlot();
或者
CategoryPlot plot = chart.getCategoryPlot();
获取绘制单元操作:
BarRenderer renderer = (BarRenderer) plot.getRenderer();
获取
x
轴的操作:
CategoryAxis
xAxis = (
CategoryAxis
) plot.getDomainAxis();
获取
y
轴操作:
NumberAxis yAxis = (NumberAxis) plot.getRangeAxis();
获取数据源:
CategoryDataset dataset=plot.getDataset();
柱状图可以接受一切
CategoryDataset
类型的数据源,下面讲解一下常用的
CategoryDataset
类型
DefaultCategoryDataset
的使用方式
实例化:
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
增加数据
dataset .addValue(double value, Comparable rowKey, Comparable columnKey) ;
删除数据:
dataset .removeValue(Comparable rowKey, Comparable columnKey);
或者
dataset.
removeColumn(int columnIndex);
或者
dataset.
removeColumn(Comparable columnKey);
对行同样有上述两种删除方式,不在列举。
修改数据:
dataset.
setValue(double value, Comparable rowKey, Comparable columnKey);
查询数据
:
对
plot
对象、绘制单元、
x
轴、
y
轴的显示特性修改不再一一介绍。
(
2
)
3D
柱状图
对应的工厂方法为
createBarChart3D
,该方法的参数与平面柱状图相同。
3D
柱状图的
Plot
对象是
CategoryPlot
类型。
CategoryPlot
对象的
x
轴是
CategoryAxis3D
对象,
y
轴是
NumberAxis3D
对象,绘制单元是
BarRenderer3D
对象,数据源是
CategoryDataset
对象。
具体使用以及操作与平面柱状图雷同,不在详述。
(1)
平面饼状图
生成平面饼状图:
JFreeChart chart = ChartFactory. createPieChart(String title,
//
图标题
PieDataset dataset,
//
数据源
boolean legend,
//
是否显示图例
boolean tooltips,
//
是否显示tooltip
boolean urls)
;
//
是否指定url
平面饼状图的Plot
对象是PiePlot
类型。PiePlot
对象没有x
轴对象、y
轴对象、绘制单元对象,数据源是PieDataset
对象。
获取PiePlot
对象操作为:
PiePlot plot = (PiePlot) chart.getPlot();
获取数据源:
PieDataset dataset=
plot
.getDataset();
饼状图可以接受一切
PieDataset
类型的数据源,下面讲解一下常用的
PieDataset
类型
DefaultPieDataset
的使用方式
实例化:
DefaultPieDataset dataset = new DefaultPieDataset();
增加修改操作:
dataset. setValue(Comparable key, double value);
删除操作:
dataset. remove(Comparable key);
查询操作:
dataset.
getKey(int item);
或者
dataset.
getValue(int item);
(1)3D
饼状图
对应的工厂方法为
createPieChart3D
,参数与平面饼状图相同。与平面饼状图的差别在于
Plot
对象是PiePlot3D
类型
,不再详述。
(
1
)多重平面饼状图
生成多重平面饼状图:
JFreeChart chart = ChartFactory. createMultiplePieChart
(String title,
//
图标题
CategoryDataset dataset,
//
数据源
TableOrder order,
//
指定提取数据的方式(按行或者按列)
boolean legend,
//
是否显示图例
boolean tooltips,
//
是否显示
tooltip
boolean urls)
;
//
是否指定
url
多重平面饼状图的
Plot
对象是
MultiplePiePlot
类型。
MultiplePiePlot
对象没有
x
轴对象、
y
轴对象、绘制单元对象,数据源是
CategoryDataset
对象。
MultiplePiePlot
对象中可以含有多个子
JFreeChart
对象,子
JFreeChart
对象是上面讲过的饼状图对象。
获取
MultiplePiePlot
对象操作为:
MultiplePiePlot plotMain = (MultiplePiePlot) chart.getPlot();
获取子
JFreeChart
的操作为:
JFreeChart childChart=plotMain.getPieChart();
获取数据源:
CategoryDataset dataset=
plotMain
.getDataset();
(
2
)多重
3D
饼状图
对应的工厂方法为
createMultiplePieChart3D
,该方法的参数与
多重平面饼状图
相同。
多重
3D
饼状图的
Plot
对象是
MultiplePiePlot
类型。
MultiplePiePlot
对象中可以含有多个子
JFreeChart
对象,子
JFreeChart
对象是上面讲过的
3D
饼状图对象。
(
1
)平面线图
生成平面线图:
JFreeChart chart = ChartFactory. createLineChart(String title,
//
图标题
String categoryAxisLabel,
//x
轴标题
String valueAxisLabel,
//y
轴标题
CategoryDataset dataset,
//
数据源
PlotOrientation orientation,
//
显示方向
boolean legend,
//
是否显示图例
boolean tooltips,
//
是否显示
tooltip
boolean urls);
//
是否指定
url
平面线图除了的
Plot
对象中绘制单元对象是
LineAndShapeRenderer
对象,其他一切组成对象与平面柱状图相同。
获取
Renderer
操作:
LineAndShapeRenderer renderer=(LineAndShapeRenderer) plot.getRenderer();
其他参考平面柱状图。
(
2
)
3D
线图
对应工厂方法为
createLineChart3D
,参数与
createLineChart
相同。
3D
线图的组成对象除了绘制单元对象是
LineAndShapeRenderer3D
对象,其他一切组成对象与
3D
柱状图相同。
生成时序图:
JFreeChart chart = ChartFactory.createTimeSeriesChart(
String title,
//
图标题
String timeAxisLabel,
//x
轴标题
String valueAxisLabel,
//y
轴标题
XYDataset dataset,
//
数据源
boolean legend,
//
是否显示图例
boolean tooltips,
//
是否显示
tooltip
boolean urls);
//
是否指定
url
时序图的
Plot
对象是
XYPlot
类型。
XYPlot
对象的
x
轴是
DateAxis
对象,
y
轴是
NumberAxis
对象,绘制单元是
XYLineAndShapeRenderer
对象,数据源是
XYDataset
对象。
Plot
对象的获取操作:
XYPlot plot = (XYPlot) chart.getPlot();
X
轴对象的获取操作:
DateAxis xAxis = (DateAxis) plot.getDomainAxis();
Y
轴对象的获取操作:
NumberAxis yAxis =(NumberAxis) plot.getRangeAxis();
Renderer
对象的获取操作:
XYItemRenderer renderer= plot.getRenderer();
时序图可以接受一切
XYDataset
类型的数据源,下面讲解一下常用的
XYDataset
类型
TimeSeriesCollection
的使用方式。
实例化:
TimeSeriesCollection dataset=new TimeSeriesCollection();
添加数据操作:
dataset.
addSeries(TimeSeries); //
后面讲解
TimeSeries
对象
删除数据操作:
dataset.
removeSeries(int index);
查询数据操作
:
dataset.
getSeries(int series);
TimeSeries
对象操作
实例化:
TimeSeries ts=TimeSeries(String name, Class timePeriodClass);
增加数据操作:
ts.
add(RegularTimePeriod period, double value);
删除数据操作:
ts.
delete(RegularTimePeriod period);
修改数据操作:
ts.
update(RegularTimePeriod period, Number value);
查询数据操作:
ts.
getValue(RegularTimePeriod period);
3
数据源处理
三
JFreeChart
中对常见图形的处理
1
柱状图
2
饼状图
3
多重饼状图
4
线图
5
时序图
类 RegularTimePeriod 是 JFreeChart 提供的时间模板类,它有很多具体的时间类,比如: Minute 、 Second 、 Hour 、 Day…… 等,不再详述。
转自:http://www.blogjava.net/JavaExplore/archive/2006/09/01/67217.html