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…… 等,不再詳述。
