深入JFreeChart应用实例(2)转载 http://www.blogjava.net/JavaExplore/archive/2006/09/12/69261.html 谢谢作者!
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…… 等,不再详述。