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的实现,可以是图片、文本、图例等的形式。
(数据源以及常用图形的处理以及进一步的讨论在后续文章中介绍)
3
数据源处理
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
的实例化对象,初始化
JFreeChart
对象的时候通过指定不同的
Plot
实现类就可以显示出不同的图形。不同的
Plot
实现类具有不同的
Renderer
对象、
Axis
对象、
Dataset
对象。
JFreeChart
提供工厂类
ChartFactory
方便使用者生成各种不同的图形。
ChartFactory
类的各个工厂方法中实现对具体
Plot
的指定以及对类
JFreeChart
构造函数的调用。
下面以常用图形说一下常用的使用流程(大部分的操作讲的并不全面,比如
JFreeChart
可能提供了很多增加、修改数据的方式,下文中可能只列举一种)。
1
柱状图
(
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
对象。
具体使用以及操作与平面柱状图雷同,不在详述。
2
饼状图
(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类型
,不再详述。
3
多重饼状图
(
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
饼状图对象。
4
线图
(
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
柱状图相同。
5
时序图
生成时序图:
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);
类
RegularTimePeriod
是
JFreeChart
提供的时间模板类,它有很多具体的时间类,比如:
Minute
、
Second
、
Hour
、
Day……
等,不再详述。