深入探究JFreeChart及實(shí)例解讀
一、簡(jiǎn) 介
JFreeChart 是 SourceForge.net 上的一個(gè)開(kāi)源項(xiàng)目,它的源碼和 API 都可以免費(fèi)獲得。 JFreeChart 的功能非常強(qiáng)大,可以實(shí)現(xiàn)餅圖 ( 二維和三維 ) , 柱狀圖 ( 水平 , 垂直 ), 線圖 , 點(diǎn)圖 , 時(shí)序圖 , 甘特圖 , 股票行情圖 , 混和圖 , 溫度計(jì)圖 , 刻度圖等常用商用圖表, 圖形可以導(dǎo)出成 PNG 和 JPEG 格式,同時(shí)還可以與 PDF 和 EXCEL 關(guān)聯(lián),支持對(duì)圖形的放大、縮小,支持常見(jiàn)圖形的 3D 顯示。
二、圖形對(duì)象的處理
1、 JFreeChart對(duì)象
JFreeChart 可以生成很多圖形對(duì)象,它的工廠類提供了 33 個(gè)工廠方法用于生成不同的圖形對(duì)象(具體的工廠方法可以參見(jiàn) JFreeChart 的 API 手冊(cè)或者源碼中的 ChartFactory 類 )。 JFreechart 對(duì)圖形對(duì)象的抽象具體化。圖形對(duì)象( JFreeChart ),由 Title( 主標(biāo)題 ) , SubTitle (子標(biāo)題 ) , Plot (圖形的繪制結(jié)構(gòu))等幾個(gè)主要對(duì)象組成。各個(gè)組成部分如下圖所示:
這是一個(gè) JFreeChart 對(duì)象,上面的“ chart 標(biāo)題”是 Title 對(duì)象,中間區(qū)域是 Plot 對(duì)象(包括繪圖區(qū)域和坐標(biāo)軸區(qū)域),下面的區(qū)域是 LegendTitle 對(duì)象,是一種 SubTitle 對(duì)象。
每個(gè) JFreeChart 對(duì)象只能有 1 個(gè) Title 對(duì)象, 1 個(gè) Plot 對(duì)象,可以有多個(gè) SubTitle 對(duì)象。 JFreeChart 對(duì)象可以進(jìn)行的操作有:背景的設(shè)置(背景顏色、背景圖片、透明度等)、邊框的設(shè)置(是否可見(jiàn)、筆畫、 Paint 等)、渲染方式的設(shè)置、標(biāo)題對(duì)象的設(shè)置、子標(biāo)題對(duì)象的增刪查操作。(本文中的所有操作都不提供代碼級(jí)的介紹,可參見(jiàn) API 手冊(cè)或者源碼)
2、 主標(biāo)題對(duì)象
主標(biāo)題對(duì)象是 TextTitle 類型,可以進(jìn)行的操作有:背景設(shè)置、字體設(shè)置(字體類型、顏色、內(nèi)容、對(duì)齊方式等操作)、 tooltip 設(shè)置、 URL 設(shè)置。
3、 Plot 對(duì)象
Plot 對(duì)象是圖形的繪制結(jié)構(gòu)對(duì)象。 JFreeChart 中含有很多不同的 Plot 對(duì)象,每一種圖形對(duì)象中的 Plot 對(duì)象都在實(shí)例化的時(shí)候創(chuàng)建。所有的 Plot 共有的操作有:背景設(shè)置(背景顏色、背景圖片、透明度等)、前景透明度設(shè)置、無(wú)數(shù)據(jù)存在情況的設(shè)置(顯示的字符內(nèi)容、顯示的字體、顯示的 Paint )、放大縮小比例的設(shè)置,大部分 Plot 對(duì)象還有設(shè)置 Datset 、設(shè)置 Renderer 對(duì)象操作。
JFreeChart 中有 18 種 Plot 抽象類的具體實(shí)現(xiàn)類。 Plot 的具體實(shí)現(xiàn)類主要由以下重要對(duì)象組成: Renderer 對(duì)象(圖形的繪制單元——繪圖域) Datset (圖形的數(shù)據(jù)源), DomainAxis (區(qū)域軸,相當(dāng)于 x 軸), RangeAxis (范圍軸,相當(dāng)于 y 軸)。不同的 Plot 對(duì)象組成方式不盡相同,有的不含有 Renderer 對(duì)象,比如 CompassPlot 、 ContourPlot 、 MultiplePiePlot 、 PiePlot 等,有的不含有 DomainAxis 、 RangeAxis 對(duì)象,另外除了 FastScatterPlot 類都含有 Datset 對(duì)象, FastScatterPlot 使用 float 的二維數(shù)組充當(dāng)數(shù)據(jù)源。尤其說(shuō)明一點(diǎn),餅狀圖相關(guān)的 Plot 對(duì)象( MultiplePiePlot 、 PiePlot 、 PiePlot3D 、 RingPlot )中都不含有 Renderer 對(duì)象、 DomainAxis 對(duì)象、 RangeAxis 對(duì)象。
一般來(lái)說(shuō), Datset 對(duì)象存儲(chǔ)數(shù)據(jù)模型, Renderer 對(duì)象存儲(chǔ)顯示模型, Plot 對(duì)象根據(jù) Datset 對(duì)象、 Renderer 對(duì)象完成畫圖操作。
仍以上面的圖形講解 Plot 對(duì)象的組成。
上圖的中間區(qū)域是是一個(gè) XYPlot 對(duì)象。其中的折線部分即是圖形的繪制單元 Renderer 對(duì)象。 X 軸是 DomainAxis , y 軸是 RangeAxis ,其中 Datset 對(duì)象屬于數(shù)據(jù)模型范疇,是 UI 不可見(jiàn)對(duì)象。該圖中的 plot 背景色、網(wǎng)格線的各種設(shè)置可以通過(guò) XYPlot 對(duì)象本身完成。
下面講解 Renderer 對(duì)象、 Axis 對(duì)象( X 軸、 y 軸都屬于 Axis 對(duì)象), Datset 對(duì)象在后續(xù)章節(jié)中專門講解。
1) Renderer對(duì)象
Renderer 對(duì)象是圖形的繪制單元。 JFreeChart 提供了兩個(gè)接口 CategoryItemRenderer 和 XYItemRenderer 、 1 個(gè)抽象類 AbstractRenderer 供具體的 Renderer 類實(shí)現(xiàn),給出了將近 50 種具體實(shí)現(xiàn)類。
一般來(lái)說(shuō) Renderer 對(duì)象可進(jìn)行的操作有:對(duì) item label (下圖中的柱狀圖上的紅色數(shù)字即為 item label 的示例)的默認(rèn)設(shè)置( item label 的產(chǎn)生方式、是否可見(jiàn)、字體、 Paint 、正反向 item label 的位置設(shè)置等)、繪制圖形的邊框默認(rèn)設(shè)置( Paint 、筆畫、是否可見(jiàn)等)、繪制圖形的默認(rèn)設(shè)置(形狀、筆畫、是否可見(jiàn)、對(duì)應(yīng)的圖例中是否可見(jiàn)等,折線圖還有線條是否可見(jiàn)、折點(diǎn)圖形是否可見(jiàn)、折點(diǎn)圖形是否填充、折點(diǎn)圖形的形狀、對(duì)應(yīng)的圖例中線條是否可見(jiàn)、圖形是否可見(jiàn)、整體是否可見(jiàn)等)、以及對(duì)指定 item label 的設(shè)置、指定繪制圖形的設(shè)置。可以說(shuō)和具體繪制的圖形相關(guān)的屬性都可以通過(guò) Renderer 對(duì)象設(shè)置。
不同的 Renderer 的實(shí)現(xiàn)類實(shí)現(xiàn)了不同的顯示方式,在含有 Renderer 對(duì)象的 JFreeChart 對(duì)象中, R enderer 對(duì)象決定了JFreeChart對(duì)象的顯示方式。例如:柱狀圖的Plot對(duì)象中默認(rèn)的Renderer對(duì)象是 CategoryItemRenderer 對(duì)象,通過(guò)設(shè)置 Plot 對(duì)象的Renderer對(duì)象 為 LineAndShapeRenderer ,則柱狀圖變?yōu)榫€圖。使用中一般不需要顯式的實(shí)例化一個(gè) R enderer 對(duì)象,一般通過(guò) JFreeChart 對(duì)象的 Plot 對(duì)象調(diào)用現(xiàn)有的 R enderer 對(duì)象進(jìn)行重新設(shè)置等操作。
2) Axis對(duì)象
JFreeChart 提供了兩種類型的坐標(biāo)軸: CategoryAxis (等級(jí)軸)和 ValueAxis (值軸), ValueAxis 又有 3 個(gè)子類: DateAxis (時(shí)間軸)、 NumberAxis (數(shù)字軸)、 PeriodAxis (時(shí)期軸)。這些坐標(biāo)軸還有更詳細(xì)的子類,不再一一列舉。
Axis 對(duì)象可進(jìn)行的操作有:標(biāo)題的設(shè)置(內(nèi)容、字體、Paint、顯示角度等)、坐標(biāo)線的設(shè)置(筆畫、Paint、是否可見(jiàn)等)、刻度線的設(shè)置(是否可見(jiàn)、筆畫、Paint、位于繪圖區(qū)域的長(zhǎng)度、位于繪圖區(qū)域外的長(zhǎng)度等)、刻度標(biāo)示的設(shè)置(筆畫、Paint、字體、與軸的距離等)、坐標(biāo)軸范圍設(shè)置等。
CategoryAxis 對(duì)象還可以進(jìn)行的操作有: 刻度標(biāo)示間距 設(shè)置( 最小間距、最大間距、指定間距)等。
ValueAxis 對(duì)象可進(jìn)行的操作有:軸端設(shè)置(顯示的圖形形狀)、范圍設(shè)置(是否自動(dòng)產(chǎn)生范圍、自動(dòng)產(chǎn)生的最小范圍、最大范圍、指定確定范圍、指定范圍大小等)、間隔設(shè)置(是否自動(dòng)產(chǎn)生間隔、指定間隔)等。
DateAxis 對(duì)象還有對(duì)時(shí)間刻度顯示格式的設(shè)置操作。
4、 子標(biāo)題對(duì)象
子標(biāo)題對(duì)象是 Title 類型的對(duì)象,一個(gè)JFreeChart可以有多個(gè)子標(biāo)題對(duì)象。JFreeChart提供了5種Title的實(shí)現(xiàn),可以是圖片、文本、圖例等的形式。
三、數(shù)據(jù)源處理
JFreeChart 中的數(shù)據(jù)源是DataSet接口類型。該接口有三個(gè)主要的子類接口:CategoryDataset、PieDataset、SeriesDataset
CategoryDataset 接口的實(shí)現(xiàn)類基本上都維護(hù)了一個(gè)三元組<value,row,col>的列表結(jié)構(gòu)。不同的實(shí)現(xiàn)類中value 的類型不相同。<row,col>唯一確定一個(gè)三元組。
CategoryDataset的實(shí)現(xiàn)類提供對(duì)這個(gè)三元組的增刪改查操作。
PieDataset 接口有兩個(gè)主要的實(shí)現(xiàn)類:CategoryToPieDataset 、DefaultPieDataset。PieDataset接口的實(shí)現(xiàn)類基本上都維護(hù)了一個(gè)二元組<key,value>的列表結(jié)構(gòu)。
Key唯一確定一個(gè)二元組。CategoryDataset的實(shí)現(xiàn)類提供對(duì)這個(gè)二元組的增刪改查操作。CategoryToPieDataset中的二元結(jié)構(gòu)列表通過(guò)對(duì)CategoryDataset類型的對(duì)象指定行或者列轉(zhuǎn)化過(guò)來(lái)。DefaultPieDataset直接維護(hù)一個(gè)二元結(jié)構(gòu)列表。
SeriesDataset 接口的實(shí)現(xiàn)類基本上都維護(hù)了一種特定數(shù)據(jù)結(jié)構(gòu)的列表。以TimeSeriesCollection為例。它維護(hù)一個(gè)TimeSeries對(duì)象列表,提供對(duì)該列表的增刪查操作。每個(gè)TimeSeries對(duì)象維護(hù)一個(gè)<time,value>列表,提供對(duì)該列表的增刪改查操作。
四、JFreeChart 中對(duì)常見(jiàn)圖形的處理
JFreeChart 并不存在多個(gè)不同的類來(lái)生成不同的圖形。所有的圖形都是具體類 JFreeChart 的實(shí)例化對(duì)象,初始化 JFreeChart 對(duì)象的時(shí)候通過(guò)指定不同的 Plot 實(shí)現(xiàn)類就可以顯示出不同的圖形。不同的 Plot 實(shí)現(xiàn)類具有不同的 Renderer 對(duì)象、 Axis 對(duì)象、 Dataset 對(duì)象。
JFreeChart 提供工廠類 ChartFactory 方便使用者生成各種不同的圖形。 ChartFactory 類的各個(gè)工廠方法中實(shí)現(xiàn)對(duì)具體 Plot 的指定以及對(duì)類 JFreeChart 構(gòu)造函數(shù)的調(diào)用。
下面以常用圖形說(shuō)一下常用的使用流程(大部分的操作講的并不全面,比如 JFreeChart 可能提供了很多增加、修改數(shù)據(jù)的方式,下文中可能只列舉一種)。
1、柱狀圖
1)平面柱狀圖
生成柱狀圖操作:
- JFreeChart chart = ChartFactory.createBarChart(
- String title, // 圖標(biāo)題
- String categoryAxisLabel, //x 軸標(biāo)題
- String valueAxisLabel, //y 軸標(biāo)題
- CategoryDataset dataset, // 數(shù)據(jù)源
- PlotOrientation orientation, // 顯示方向
- boolean legend, // 是否顯示圖例
- boolean tooltips, // 是否顯示 tooltip
- boolean urls) ; // 是否指定 url
平面柱狀圖的 Plot 對(duì)象是 CategoryPlot 類型。 CategoryPlot 對(duì)象的 x 軸是 CategoryAxis 對(duì)象, y 軸是 NumberAxis 對(duì)象,繪制單元是 BarRenderer 對(duì)象,數(shù)據(jù)源是 CategoryDataset 對(duì)象。
獲取 CategoryPlot 對(duì)象操作為:
- 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();
獲取數(shù)據(jù)源:
- CategoryDataset dataset=plot.getDataset();
柱狀圖可以接受一切 CategoryDataset 類型的數(shù)據(jù)源,下面講解一下常用的 CategoryDataset 類型 DefaultCategoryDataset 的使用方式
實(shí)例化:
- DefaultCategoryDataset dataset = new DefaultCategoryDataset();
增加數(shù)據(jù):
- dataset .addValue(double value, Comparable rowKey, Comparable columnKey) ;
刪除數(shù)據(jù):
- dataset .removeValue(Comparable rowKey, Comparable columnKey);
或者
- dataset. removeColumn(int columnIndex);
或者
- dataset. removeColumn(Comparable columnKey);
對(duì)行同樣有上述兩種刪除方式,不在列舉。
修改數(shù)據(jù):
- dataset. setValue(double value, Comparable rowKey, Comparable columnKey);
查詢數(shù)據(jù):
對(duì) plot 對(duì)象、繪制單元、 x 軸、 y 軸的顯示特性修改不再一一介紹。
#p#
2)3D 柱狀圖
對(duì)應(yīng)的工廠方法為 createBarChart3D ,該方法的參數(shù)與平面柱狀圖相同。 3D 柱狀圖的 Plot 對(duì)象是 CategoryPlot 類型。 CategoryPlot 對(duì)象的 x 軸是CategoryAxis3D 對(duì)象, y 軸是 NumberAxis3D 對(duì)象,繪制單元是 BarRenderer3D 對(duì)象,數(shù)據(jù)源是 CategoryDataset 對(duì)象。
具體使用以及操作與平面柱狀圖雷同,不在詳述。
2、餅狀圖
(1) 平面餅狀圖
生成平面餅狀圖:
- JFreeChart chart = ChartFactory. createPieChart(String title, // 圖標(biāo)題
- PieDataset dataset, // 數(shù)據(jù)源
- boolean legend, // 是否顯示圖例
- boolean tooltips, // 是否顯示tooltip
- boolean urls) ; // 是否指定url
平面餅狀圖的Plot對(duì)象是PiePlot類型。PiePlot對(duì)象沒(méi)有x軸對(duì)象、y軸對(duì)象、繪制單元對(duì)象,數(shù)據(jù)源是PieDataset對(duì)象。
獲取PiePlot對(duì)象操作為:
- PiePlot plot = (PiePlot) chart.getPlot();
獲取數(shù)據(jù)源:
- PieDataset dataset= plot .getDataset();
餅狀圖可以接受一切 PieDataset 類型的數(shù)據(jù)源,下面講解一下常用的 PieDataset 類型 DefaultPieDataset 的使用方式
實(shí)例化:
- DefaultPieDataset dataset = new DefaultPieDataset();
增加修改操作:
- dataset. setValue(Comparable key, double value);
刪除操作:
- dataset. remove(Comparable key);
查詢操作:
- dataset. getKey(int item);
或者
- dataset. getValue(int item);
1)3D 餅狀圖
對(duì)應(yīng)的工廠方法為 createPieChart3D ,參數(shù)與平面餅狀圖相同。與平面餅狀圖的差別在于 Plot 對(duì)象是PiePlot3D類型 ,不再詳述。
3、多重餅狀圖
1)多重平面餅狀圖
生成多重平面餅狀圖:
- JFreeChart chart = ChartFactory. createMultiplePieChart
- (String title, // 圖標(biāo)題
- CategoryDataset dataset, // 數(shù)據(jù)源
- TableOrder order, // 指定提取數(shù)據(jù)的方式(按行或者按列)
- boolean legend, // 是否顯示圖例
- boolean tooltips, // 是否顯示 tooltip
- boolean urls) ; // 是否指定 url
多重平面餅狀圖的 Plot 對(duì)象是 MultiplePiePlot 類型。 MultiplePiePlot 對(duì)象沒(méi)有 x 軸對(duì)象、 y 軸對(duì)象、繪制單元對(duì)象,數(shù)據(jù)源是 CategoryDataset 對(duì)象。
MultiplePiePlot 對(duì)象中可以含有多個(gè)子 JFreeChart 對(duì)象,子 JFreeChart 對(duì)象是上面講過(guò)的餅狀圖對(duì)象。
獲取 MultiplePiePlot 對(duì)象操作為:
- MultiplePiePlot plotMain = (MultiplePiePlot) chart.getPlot();
獲取子 JFreeChart 的操作為:
- JFreeChart childChart=plotMain.getPieChart();
獲取數(shù)據(jù)源:
- CategoryDataset dataset= plotMain .getDataset();
2)多重 3D 餅狀圖
對(duì)應(yīng)的工廠方法為 createMultiplePieChart3D ,該方法的參數(shù)與 多重平面餅狀圖 相同。 多重 3D 餅狀圖的 Plot 對(duì)象是 MultiplePiePlot 類型。 MultiplePiePlot 對(duì)象中可以含有多個(gè)子 JFreeChart 對(duì)象,子 JFreeChart 對(duì)象是上面講過(guò)的 3D 餅狀圖對(duì)象。
4、線圖
1)平面線圖
生成平面線圖:
- JFreeChart chart = ChartFactory. createLineChart(String title, // 圖標(biāo)題
- String categoryAxisLabel, //x 軸標(biāo)題
- String valueAxisLabel, //y 軸標(biāo)題
- CategoryDataset dataset, // 數(shù)據(jù)源
- PlotOrientation orientation, // 顯示方向
- boolean legend, // 是否顯示圖例
- boolean tooltips, // 是否顯示
- tooltip boolean urls); // 是否指定 url
平面線圖除了的 Plot 對(duì)象中繪制單元對(duì)象是 LineAndShapeRenderer 對(duì)象,其他一切組成對(duì)象與平面柱狀圖相同。
獲取 Renderer 操作:
- LineAndShapeRenderer renderer=(LineAndShapeRenderer) plot.getRenderer();
其他參考平面柱狀圖。
2)3D 線圖
對(duì)應(yīng)工廠方法為 createLineChart3D ,參數(shù)與 createLineChart 相同。 3D 線圖的組成對(duì)象除了繪制單元對(duì)象是 LineAndShapeRenderer3D 對(duì)象,其他一切組成象與 3D 柱狀圖相同。
5、時(shí)序圖
生成時(shí)序圖:
- JFreeChart chart = ChartFactory.createTimeSeriesChart( String title, // 圖標(biāo)題
- String timeAxisLabel, //x 軸標(biāo)題
- String valueAxisLabel, //y 軸標(biāo)題
- XYDataset dataset, // 數(shù)據(jù)源
- boolean legend, // 是否顯示圖例
- boolean tooltips, // 是否顯示
- tooltip boolean urls); // 是否指定 url
時(shí)序圖的 Plot 對(duì)象是 XYPlot 類型。 XYPlot 對(duì)象的 x 軸是 DateAxis 對(duì)象, y 軸是 NumberAxis 對(duì)象,繪制單元是 XYLineAndShapeRenderer 對(duì)象,數(shù)據(jù)源是 XYDataset 對(duì)象。
Plot 對(duì)象的獲取操作:
- XYPlot plot = (XYPlot) chart.getPlot();
X 軸對(duì)象的獲取操作:
- DateAxis xAxis = (DateAxis) plot.getDomainAxis();
Y 軸對(duì)象的獲取操作:
- NumberAxis yAxis =(NumberAxis) plot.getRangeAxis();
Renderer 對(duì)象的獲取操作:
- XYItemRenderer renderer= plot.getRenderer();
時(shí)序圖可以接受一切 XYDataset 類型的數(shù)據(jù)源,下面講解一下常用的 XYDataset 類型 TimeSeriesCollection 的使用方式。
實(shí)例化:
- TimeSeriesCollection dataset=new TimeSeriesCollection();
添加數(shù)據(jù)操作:
- dataset. addSeries(TimeSeries); // 后面講解 TimeSeries 對(duì)象
刪除數(shù)據(jù)操作:
- dataset. removeSeries(int index);
查詢數(shù)據(jù)操作:
- dataset. getSeries(int series);
TimeSeries 對(duì)象操作
實(shí)例化:
- TimeSeries ts=TimeSeries(String name, Class timePeriodClass);
增加數(shù)據(jù)操作:
- ts. add(RegularTimePeriod period, double value);
刪除數(shù)據(jù)操作:
- ts. delete(RegularTimePeriod period);
修改數(shù)據(jù)操作:
- ts. update(RegularTimePeriod period, Number value);
查詢數(shù)據(jù)操作:
- ts. getValue(RegularTimePeriod period);
類 RegularTimePeriod 是 JFreeChart 提供的時(shí)間模板類,它有很多具體的時(shí)間類,比如: Minute 、 Second 、 Hour 、 Day…… 等,不再詳述。
原文鏈接:http://www.blogjava.net/JavaExplore/archive/2006/09/01/67217.html
【編輯推薦】
- JFreeChart簡(jiǎn)單介紹及入門實(shí)例
- JFreeChart API中文文檔
- JFreeChart中文亂碼解決方案
- Java最佳圖形解決方案 JFreeChart學(xué)習(xí)總結(jié)
- 詳細(xì)解析Java中抽象類和接口的區(qū)別