JFreeChart基本知識

文章目錄

 

1 定製圖表(Customising Charts)

1.1 簡介

JFreeChart的設計的定製功能是非常靈活的。我們可以使用非常多的屬性來設置我們圖表的外觀。主要包括以下幾個方面

1)pie charts (2D and 3D):餅圖(平面和立體)

 

2)bar charts (regular and stacked, with an optional 3D effect):柱狀圖

 

 

 

3)line and area charts:曲線圖

 

 

 

 

 

 

 

4)scatter plots and bubble charts

 

5)time series, high/low/open/close charts and candle stick charts:時序圖

 

 

6)combination charts:複合圖

 

 

7)Pareto charts Pareto圖

 

8)Gantt charts:甘特圖

 

9)wind plots, meter charts 

 

 

1.2 圖表相關包介紹:

通過ChartFactory的工廠方法可以得到對應圖表形式

核心類主要有:

org.jfree.chart.JFreeChart:圖表對象,任何類型的圖表的最終表現形式都是在該對象進行一些屬性的定製。JFreeChart引擎本身提供了一個工廠類用於創建不同類型的圖表對象

org.jfree.data.category.XXXDataSet:數據集對象,用於提供顯示圖表所用的數據。根據不同類型的圖表對應着很多類型的數據集對象類

org.jfree.chart.plot.XXXPlot:圖表區域對象,基本上這個對象決定着什麼樣式的圖表,創建該對象的時候需要Axis、Renderer以及數據集對象的支持

Org.jfree.chart.axis.*:用於處理圖表的兩個軸:縱軸和橫軸

Org.jfree.chart.render.*:負責如何顯示一個圖表對象

Org.jfree.chart.urls.*:用於生成Web圖表中每個項目的鼠標點擊鏈接

XXXXXToolTipGenerator:用於生成圖象的幫助提示,不同類型圖表對應不同類型的工具提示類

 

1.3 圖表屬性

1.3.1 概述

我們可以使用JFreeChart類方法從更高的層次來定製我們圖表的外觀。可控制的屬性有:

l 圖表的邊框樣式及大小、位置

l 圖表的標題和副標題

l 圖表的背景顏色和圖片

l 使用繪製建議(Rendering Hints)畫圖表,該屬性有是否反鋸齒功能。

l 添加圖表圖例

l 添加監聽事件

在下面的章節中將詳細描述這些內容。

1.3.2 圖表邊框

JFreeChart可以在圖表的外圍畫出一個邊框。默認狀態下,JFreeChart是不畫出邊框的,但我們可以使用方法setBorderVisible()來設置。邊框的顏色和線條風格可使用方法setBorderPaint()和setBorderStroke()來控制。

注意:如果我們在一個ChartPanel裏面顯示我們的圖表,那麼我們可能更願意使用Swing提供的邊框。

Add:

圖表的大小可通過setPreferredSize()來設置參數爲Dimension類型;

1.3.3 圖表標題

圖表有一個標題,顯示在圖表的頂部、底部、左側或右側(同時,我們也可以添加副標題,見下章講述)。標題使用一個TextTitle的實例對象。我們可以使用getTitle()方法來獲得標題的引用。

 

修改標題文本(不修改字體和位置)的代碼如下:

 

題頭放置在圖表的頂部、底部、左側或右側的設置,使用標題本書屬性設置來完成。下面代碼顯示的是將標題移植到圖表的底部。

 

如果在我們圖表上,我們不希望顯示標題,則將標題設置爲null即可。

 

Add:

設置標題的字體

可以在初始化的時候使用TextTitle(String text, Font font)構造

也可以使用對象的setFont()方法設置

1.3.4 副標題

圖表可以擁有任何數量的副標題。添加副標題,需要先創建一個副標題對象(任何Title類的子類),然後將該對象加到圖表上即可。代碼如下:

 

我們可以在圖表上添加任何數量的副標題,但是緊急我們添加的副標題越多,圖表畫圖的區域就越小。

修改一個已有的副標題,我們需要先獲得副標題的一個引用。代碼如下:

 

在我們改變副標題屬性之前,我們需要將Title的引用轉換成我們需要的適當的子類類型。

我們可以使用getSubtitleCount()方法獲得副標題的數量。

Add:

也可以使用getSubtitles() 得到副標題List

可以使用clearSubtitles()清除所有副標題

使用removeSubtitle(Title title) 移除指定副標題

1.3.5 設置圖表背景顏色

我們可以使用setBackgroundPaint()方法設置圖表的背景顏色(注意,我們也可以設置我們圖區的背景顏色,這與圖表的背景顏色不同)。例如:

 

我們可使用Paint接口的任何實現作爲背景顏色的設置參數,其中有Color、GradientPaint(漸變顏色)和TexturePaint等。代碼如下:

 

我們可以設置我們的背景顏色爲null,這時推薦使用一個背景圖片來設置我們的圖表。

1.3.6 使用背景圖片

我們可以使用方法setBackgroundImage()來爲我們的圖表設置一幅背景圖表。

 

默認的,圖片充滿圖表的整個背景,圖片失真。但我們可以使用setBackgroundImageAlignment()方法來改變圖片不充滿整個背景。代碼如下:

 

使用setBackgroundImageAlpha()方法,我們可以控制圖片的透明度。如果我們希望圖片只填充我們圖表的區域(區域包含軸),那麼我們需要將背景圖片添加到圖表的圖區。代碼如下(以餅圖爲例):

 

1.3.7 Rendering Hints(繪製建議)

JFreeChart使用java2D的API來畫圖表。在java2D中的API中,我們可以提供繪製建議讓繪製引擎繪製圖表。JFreeChart允許我們在畫圖表時,使用setRenderingHints()方法,將繪製建議參數傳入java2D的API中。

一般抗鋸齒設置代碼爲

jfreechart.getRenderingHints().put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

jfreechart.setRenderingHints(new RenderingHints(RenderingHints.KEY_ANTIALIASING, jfreechart));

JFreeChart還提供了一個便利反鋸齒開關方法。當反鋸齒開關開時,圖表會繪製出比較光滑的圖表,但是花費的時間要長。代碼如下:

 

JFreeChart畫圖時,默認爲反鋸齒開關爲開。

1.3.8 添加圖表圖例 :

Jfreechart可以再繪製圖表時增加圖例使用addLegend()方法並設置圖例位置,默認位置爲最上方,並默認時不帶邊框同樣可以使用removeLegend()移除圖例

代碼如下:

LegendTitle legendTitle = new LegendTitle(jfreechart.getPlot());//創建圖例

legendTitle.setBorder(1, 1, 1, 2);//設置四周的邊距,帶線框.

legendTitle.setPosition(RectangleEdge.RIGHT);  //設置圖例的位置

jfreechart.addLegend(legendTitle);//圖表中添加圖例

 

圖例所擁有的一些其他方法

setBackgroundPaint(Paint paint)   可設置圖例的背景色
setTitle(String title)    圖示標題內容
setTitleFont(Font font)    圖示標題字體
setBoundingBoxArcWidth(int arcWidth)  圖示邊界圓角寬
setBoundingBoxArcHeight(int arcHeight)  圖示邊界圓角高
setOutlinePaint(Paint paint)   圖示邊界線條顏色
setOutlineStroke(Stroke stroke)   圖示邊界線條筆觸
setDisplaySeriesLines(boolean flag)  圖示項是否顯示橫線(折線圖有效)
setDisplaySeriesShapes(boolean flag)  圖示項是否顯示形狀(折線圖有效)
setItemFont(Font font)    圖示項字體
setItemPaint(Paint paint)    圖示項字體顏色
setAnchor(int anchor)    圖示在圖表中的顯示位置(參數常量在Legend類中定義)

1.3.9 爲圖表添加監聽事件

Jfreechart可以在繪製的圖表上增加監聽事件,如:addChangeListener(ChartChangeListener listener) 註冊一個用於對圖表的變化通知對象,addProgressListener(ChartProgressListener listener) 註冊一個有關的圖表事件通知的對象。

同時可以使用removeChangeListener(ChartChangeListener listener)和 removeProgressListener(ChartProgressListener listener)移除監聽

也可以使用常用的內部類匿名類等方法創建一個進程來監聽事件fireChartChanged()方法,此方法可以監聽創建圖表的時候的數據變化,並對圖表進行重繪.

代碼如下:

//設置新的數據集

jfreechart.getCategoryPlot().setDataset(createDataset());;

//通知Jfreechart 數據發生了改變,重新繪製柱狀圖

if (jfreechart != null) {

       jfreechart.fireChartChanged();

}

 

1.4 圖區屬性

1.4.1 概述

JFreeChart類在繪製圖表時,將大部分工作交給了Plot類(圖形繪製結構)或Plot的子類。JFreeChart類的getPlot()方法返回了一個圖表創建的圖區(plot)的引用。

  Plot plot = jfreechart.getPlot();

我們需要將該引用轉化成Plot的一個具體子類。例如:

CategoryPlot plot = jfreechart.getCategoryPlot();

  或

      XYPlot plot = jfreechart.getXYPlot();

注意:如果plot不是相應的類,則在轉化的時候,會拋出ClassCastException類型轉制異常。

JFreeChart 中有 18 種 Plot 抽象類的具體實現類。 Plot 的具體實現類主要由以下重要對象組成: Renderer 對象(圖形的繪製單元——繪圖域) Datset (圖形的數據源), DomainAxis (區域軸,相當於 x 軸), RangeAxis (範圍軸,相當於 y 軸)。不同的 Plot 對象組成方式不盡相同。比如餅狀圖相關的 Plot 對象( MultiplePiePlot 、 PiePlot 、 PiePlot3D 、 RingPlot )中都不含有 Renderer 對象、 DomainAxis 對象、 RangeAxis 對象。

一般來說,  對象存儲數據模型, Renderer 對象存儲顯示模型, Plot 對象根據  對象、 Renderer 對象完成畫圖操作。

仍以上面的圖形講解 Plot 對象的組成。

上圖的中間區域是是一個 XYPlot 對象。其中的折線部分即是圖形的繪製單元 Renderer 對象。 X 軸是 DomainAxis , y 軸是 RangeAxis ,其中 Datset 對象屬於數據模型範疇,是 UI 不可見對象。該圖中的 plot 背景色、網格線的各種設置可以通過 XYPlot 對象本身完成。

1.4.2 不同plot的一些設置

在圖表連接數據確沒有數據可顯示的可通過設置一些Plot的屬性來設置所顯示的消息:setNoDataMessage(String message)   沒有數據時顯示的消息
setNoDataMessageFont(Font font)   沒有數據時顯示的消息字體
setNoDataMessagePaint(Paint paint)   沒有數據時顯示的消息顏色

 

對於CategoryPlot類在圖表顯示數據時刻對數據區的分類軸進行操作達到獨特的效果

setDomainAxis(CategoryAxis axis)   數據區的分類軸

setAxisOffset(Spacer offset)   座標軸到數據區的間距
setDomainAxisLocation(AxisLocation location) 分類軸的位置(參數常量在org.jfree.chart.axis.AxisLocation類中定義)
setDomainGridlinesVisible(boolean visible)  分類軸網格是否可見
setDomainGridlinePaint(Paint paint)  分類軸網格線條顏色
setDomainGridlineStroke(Stroke stroke)  分類軸網格線條筆觸
setRangeAxis(ValueAxis axis)   數據區的數據軸
setRangeAxisLocation(AxisLocation location) 數據軸的位置(參數常量在org.jfree.chart.axis.AxisLocation類中定義)
setRangeGridlinesVisible(boolean visible)  數據軸網格是否可見
setRangeGridlinePaint(Paint paint)   數據軸網格線條顏色
setRangeGridlineStroke(Stroke stroke)  數據軸網格線條筆觸

 

對於PiePlot類在數據區可對餅圖和分類標籤進行操作

setCircular(boolean flag)    餅圖是否一定是正圓
setStartAngle(double angle)   餅圖的初始角度
setDirection(Rotation direction)   餅圖的旋轉方向

setShadowPaint(Paint paint)   餅圖的陰影顏色
setShadowXOffset(double offset)   餅圖的陰影相對圖的水平偏移
setShadowYOffset(double offset)   餅圖的陰影相對圖的垂直偏移

setPieIndex(int index)    餅圖的索引(複合餅圖中用到)
setSectionOutlinePaint(int section,Paint paint) 指定分類餅的邊框顏色
setSectionOutlineStroke(int section,Stroke stroke) 指定分類餅的邊框筆觸
setSectionPaint(int section,Paint paint)  指定分類餅的顏色
setExplodePercent(int section,double percent) 抽取的那塊(1維數據表的分類下標)以及抽取出來的距離(0.0~1.0),3D餅圖無效

setLabelBackgroundPaint(Paint paint)  分類標籤的底色
setLabelFont(Font font)    分類標籤的字體
setLabelPaint(Paint paint)    分類標籤的字體顏色
setLabelLinkMargin(double margin)   分類標籤與圖的連接線邊距
setLabelLinkPaint(Paint paint)   分類標籤與圖的連接線顏色
setLabelLinkStroke(Stroke stroke)   分類標籤與圖的連接線筆觸
setLabelOutlinePaint(Paint paint)   分類標籤邊框顏色
setLabelOutlineStroke(Paint paint)   分類標籤邊框筆觸
setLabelShadowPaint(Paint paint)   分類標籤陰影顏色
setMaximumLabelWidth(double width)   分類標籤的最大長度(0.0~1.0)
setLabelGenerator(PieSectionLabelGenerator generator) 分類標籤的格式,設置成null則整個標籤包括連接線都不顯示

PiePlot3D(PiePlot)類:
setDepthFactor(double factor)   3D餅圖的Z軸高度(0.0~1.0)

 

1.4.3 設置圖區大小、背景、邊框

獲得Plot後可根據setDataAreaRatio(double ratio)   設置數據區佔整個圖表區的百分比

我們可以使用方法setBackgroundPaint()設置圖區的背景顏色。例如:

 

我們可使用Paint接口的任何實現作爲背景顏色的設置參數,其中有Color、GradientPaint(漸變顏色)和TexturePaint等。同時,我們也可以設置背景顏色爲null。

setBackgroundAlpha(float alpha)   數據區的背景透明度(0.0~1.0)
setForegroundAlpha(float alpha)   數據區的前景透明度(0.0~1.0)

setOutLinePaint(Paint paint)   數據區的邊界線條顏色
setOutLineStroke(Stroke stroke)   數據區的邊界線條筆觸

我們可以使用方法setBackgroundImage()爲圖區設置備有圖片。

 

默認的,圖片充滿圖表的整個背景,圖片失真。但我們可以改變圖片不充滿整個背景,使用方法是setBackgroundImageAlignment()。

 

使用setBackgroundImageAlpha()方法,我們可以控制圖片的透明度。如果我們希望圖片充滿這個圖表區域,那麼我們需要將背景圖片添加到JFreeChart對象上(前面已經介紹過)。

1.4.4  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 對象進行重新設置等操作。

如:setDrawBarOutline(boolean);//可對圖形的外輪廓線修改

setSeriesPaint()//可對圖形的顏色進行修改(BarChartDemo1)

setShapesVisible(true); //series 點(即數據點)可見               
setLineVisible(true) //series 點(即數據點)間有連線可見(LineChartDemo5)

setShapesFilled(true); //數據點被填充即不是空心點(CrosshairDemo3)

setSeriesLinesVisible(0, false); //第一個XYSeries數據點間連線不可見
setSeriesShapesVisible(1, false);//第二個XYSeries數據點不可見(LineChartDemo6)

setSeriesFillPaint(0, Color.red); //數據點填充爲紅色
setSeriesFillPaint(1, Color.white); //數據點填充爲白色(TimeSeriesDemo3)

 

 

圖形 dataset plot renderer
餅圖 PieDataset(DefaultPieDataset) PiePlot 無

柱狀圖 CatagoryDataset(DefaultCategoryDataset) CategoryPlot BarRenderer
折線圖 CatagoryDataset(DefaultCategoryDataset) CategoryPlot LineAndShapeRenderer
XYDataset(XYSeriesCollection) XYPlot XYLineAndShapeRenderer
時間序列圖 XYDataset (TimeSeriesCollection) XYPlot XYLineAndShapeRenderer

1.5 軸屬性

1.5.1 概述

使用JFreeChart創建的大部分圖表都帶有兩個軸。X軸和Y軸。當然對於一些圖表(比如餅圖)根本就沒有軸。對於使用軸的圖表來說,圖區使用Axis對象來管理軸。

JFreeChart 提供了兩種類型的座標軸: CategoryAxis (等級軸)和 ValueAxis (值軸), ValueAxis 又有 3 個子類: DateAxis (時間軸)、 NumberAxis (數字軸)、 PeriodAxis (時期軸)。這些座標軸還有更詳細的子類,不再一一列舉

Axis 對象可進行的操作有:標題的設置(內容、字體、Paint、顯示角度等)、座標線的設置(筆畫、Paint、是否可見等)、刻度線的設置(是否可見、筆畫、Paint、位於繪圖區域的長度、位於繪圖區域外的長度等)、刻度標示的設置(筆畫、Paint、字體、與軸的距離等)、座標軸範圍設置等。

CategoryAxis 對象還可以進行的操作有: 刻度標示間距 設置( 最小間距、最大間距、指定間距)等。

ValueAxis 對象可進行的操作有:軸端設置(顯示的圖形形狀)、範圍設置(是否自動產生範圍、自動產生的最小範圍、最大範圍、指定確定範圍、指定範圍大小等)、間隔設置(是否自動產生間隔、指定間隔)等。

DateAxis 對象還有對時間刻度顯示格式的設置操作。

 

1.5.2 獲得軸對象引用

在你修改軸的屬性之前,我們需要先獲得一個軸的引用。圖區類CategoryPlot和XYPlot類有兩個方法getDomainAxis()和getRangeAxis()分別是獲得X軸Y軸對象。這兩個方法返回了一個ValueAxis對象的引用,除了在使用CategoryPlot的情況下,X軸使用的是CategoryAxis。代碼如下:

 

CategoryAxis和ValueAxis類有許多不同的子類。有時我們需要將軸對象引用轉化成具體的子類,爲了獲取更多具體的屬性。如,如果我們想獲得y軸爲一個對象NumberAxis。代碼如下:

 

1.5.3 設置軸標籤

我們使用方法setLabel()可以改變軸的標籤。如果我們不想在圖表的軸上有標籤,那麼我們就設置爲null即可。

我們可以使用Axis類定義的方法setLabelFont(), setLabelPaint(), 和 setLabelAngle()改變標籤的字體、顏色和座標軸標題旋轉角度(縱座標可以旋轉)內容。

1.5.4 改變周邊標籤顯示方向

當圖區在左側或右側畫一個軸(水平軸)時,軸標籤會自動旋轉90度,以滿足小空間的需要。如果我們希望標籤也水平,我們需要修改標籤的角度:

 

注意角度的表示使用弧度(PI爲180度)。

setVerticalTickLabels(boolean flag)  數據軸數據標籤是否旋轉到垂直

void setInverted(boolean flag)    數據軸是否反向(默認爲false)

1.5.5 隱藏刻度標籤

隱藏某個軸的刻度標籤:

 

對於CategoryAxis,方法setTickLabelsVisible(false)隱藏種類標籤。

1.5.6 隱藏刻度符號

隱藏某個軸的刻度符號:

 

注意category軸沒有刻度符號。

1.5.7 設置刻度尺寸

默認的,數值和日期會自動選擇一個刻度尺寸,以便刻度標籤不會重複顯示。但我們也可以使用setTickUnit()方法設置我們自己的餓刻度單位。

setLowerBound(double min)    數據軸上的顯示最小值
setUpperBound(double max)    數據軸上的顯示最大值

 

1.5.8 指定標準的數值刻度單位

在NumberAxis類中,方法允許我們設置我們自己的刻度單位替代系統自動選擇刻度danwi的機制。最普通的應用就是我們有一個僅僅顯示整數的數軸。在實例中,我們不想讓0.5或者0.25作爲刻度單位。在NumberAxis類中有一個靜態方法返回一系列的標準整數刻度單位:

 

如果我們想控制標準的刻度單位時,我們可以自由定製自己的TickUnits集合。

setAutoRange(boolean auto)    自動設置數據軸數據範圍
setAutoRangeMinimumSize(double size)  自動設置數據軸數據範圍時數據範圍的最小跨度
setAutoTickUnitSelection(boolean flag)  數據軸的數據標籤是否自動確定(默認爲true)
setFixedAutoRange(double length)   數據軸固定數據範圍(設置100的話就是顯示MAXVALUE到MAXVALUE-100那段數據範圍)

setAutoRangeIncludesZero(boolean flag)  是否強制在自動選擇的數據範圍中包含0
setAutoRangeStickyZero(boolean flag)  是否強制在整個數據軸中包含0,即使0不在數據範圍中

1.5.9 指定標準的日期刻度單位

類似於上一節內容,DateAxis類也有一個setStandardTickUnits()方法,來設置我們的刻度單位。方法createStandardDateTickUnits()爲DateAxis返回了一個缺省的集合。同時我們也可以創建我們自己的標準日期刻度單位。

Add:

setUpperMargin()可設置留白的大小比例,當設置爲1時圖大小與空白大小相當,數值越小留白越小,數值類型爲Double

setMaximumDate(Date maximumDate)   日期軸上的最大日期
setMinimumDate(Date minimumDate)  日期軸上的最小日期

1.5.10 關於軸的一些其他屬性的設置

對於所有座標軸Axis對象可設置:
setAxisLinePaint(Paint paint)   座標軸線條顏色(3D軸無效)
setAxisLineStroke(Stroke stroke)   座標軸線條筆觸(3D軸無效)
setAxisLineVisible(boolean visible)  座標軸線條是否可見(3D軸無效)

setTickLabelFont(Font font)   座標軸標尺值字體
setTickLabelPaint(Paint paint)   座標軸標尺值顏色
setTickMarkPaint(Paint paint)   座標軸標尺顏色
setTickMarkStroke(Stroke stroke)   座標軸標尺筆觸
setTickMarksVisible(boolean flag)   座標軸標尺是否顯示

ValueAxis(Axis)類:
setLowerMargin(double margin)   數據軸下(左)邊距
setUpperMargin(double margin)   數據軸上(右)邊距
setPositiveArrowVisible(boolean visible)  是否顯示正向箭頭(3D軸無效)
setNegativeArrowVisible(boolean visible)  是否顯示反向箭頭(3D軸無效)

NumberAxis(ValueAxis)類:
setNumberFormatOverride(NumberFormat formatter) 數據軸數據標籤的顯示格式

 

2 圖表工具條(Tooltips)

2.1 概述

JFreeChart爲圖表的每個組件提供了一套產生、收集和顯示工具條的機制。圖表工具條主要是嵌入到圖片中,顯示提示信息用。本章主要介紹:

l 如何產生圖表工具條(包括定製圖表工具條)

l 如何收集圖表工具條

l 如何顯示圖表工具條

l 如何隱藏圖表工具條

2.2 創建圖表工具條

如果我們需要使用圖表工具條,我們首先確保所畫的圖表中已經產生圖表工具條。我們可以爲我們的圖區或圖區條目設置圖表工具條產生器。在下面的相關章節裏面,我們將瞭解如何爲一個圖表設置一個圖表工具條。

2.2.1 餅圖

餅圖類PiePlot使用PieToolTipGenerator接口產生接口圖表工具條。系統通過了該接口的一個標準實現類StandardPieToolTipGenerator。PiePlot設置圖表工具條的方法如下:

 

該方法可以爲餅圖設置工具條產生器,如果設置null,則表示沒有工具條。

2.2.2 CategoryPlot種類圖

種類圖表—包括JFreeChart創建最多的直方條形圖—基於CategoryPlot類並使用CategoryItemRenderer來畫每一個數據條目。Renderer使用接口CategoryToolTipGenerator的指定方法來獲得圖表工具條。爲種類圖區條目設置圖表工具條產生器,使用類AbstractCategoryItemRenderer的方法:

 

該方法可以爲餅圖設置工具條產生器,如果設置null,則表示沒有工具條。

Add:

CategoryPlot類中可獲得CategoryAxis對象對座標軸增加tooltipf方法爲:

addCategoryLabelToolTip(String );

2.2.3 XY圖

XY圖表—包括JFreeChart創建的散點圖和時序圖—基於類XYPlot並使用XYItemRenderer畫出每一個數據條目。Renderer使用一個XYToolTipGenerator產生圖表工具條。

設置XY圖區條目的工具條,使用在AbstractXYItemRenderer定義的方法:

 

如果設置產生器爲null,表示沒有圖表工具條產生器。

2.2.4 柱狀圖

柱狀圖可通過BarRenderer的setBaseToolTipGenerator((CategoryToolTip

Generator generator))方法定義和設置tooltips;

例如setBaseToolTipGenerator(new StandardCategoryToolTipGene

rator());

也可以通過setLegendItemToolTipGenerator()方法添加圖例的工具條,並設置

定義方法爲:

setLegendItemToolTipGenerator(new StandardCategorySeriesLabelGenerator(String format));

 

2.2.5 折線圖

折線圖可通過LineAndShapeRenderer對象的setBaseToolTipGenerator((Category

ToolTipGenerator generator))方法定義和設置tooltips;

例如lineandshaperenderer.setBaseToolTipGenerator(new StandardCategoryToolTipGenerator());

2.3 顯示圖表工具條

使用ChartPanel類創建我們的圖表時,圖表工具條會自動顯示出來。並且你可以爲圖區(或者圖區的renderer)設置一個圖表工具條。

我們可是使用類的方法設置顯示或隱藏圖表工具條。方法如下:

      

2.4 隱藏圖表工具條

最有效的方式就是將圖表工具條設置爲null。確保沒有任何圖表工具條信息產生,這樣可以節省內存同時提供處理速度(特別是對於大數據源時,非常有好處)。

我們可是使用上節講的方法使用ChartPanele類設置圖表工具條的隱藏。

3 圖表條目標籤(Item Label)

3.1 簡介

3.1.1 概述

對於大多數的圖表類型來說,JFreeChart允許我們在圖表的每個條目上、或者內部、或者附近顯示條目標籤。例如,下圖12.1 在每個條形圖上顯示出了真實的值。

 

圖12.1 顯示數組的條形圖(參考:)

本章主要講述:

l 如何讓條目標籤可視(僅限於支持條目標籤的圖表類型)

l 如何改變條目標籤的外觀(字體和顏色)

l 如何指定條目標籤的位置

l 如何定製條目標籤的文本

忠告:我們使用上面的特徵時,要謹慎。圖表是期望用來分析總結數據的——如果我們覺得在圖表上顯示真實數據是非常有必要的話,那我們的數據應使用一個表格格式顯示更爲合適。

3.1.2 侷限性

在當前版本JFreeChart中,條目標籤的使用是有很多侷限性的:

l 一些renderer不支持條目標籤

l 軸範圍的自動調節,忽略了條目標籤的自動調整——如果圖表的周圍沒有足夠的空間(使用方法setUpperMargin()或setLowerMargin()進行了相應的調整),那麼一些圖表條目標籤在圖表上顯示不出來。

相信,在以後的JFreeChart版本中,這些限制問題將被解決。

3.2 顯示條目標籤

3.2.1 概述

條目標籤默認是不顯示的,因此我們需要使用renderer進行創建和顯示條目標籤。這主要有以下兩個步驟:

l 分配一個CategoryItemLabelGenerator或XYItemLabelGenerator給renderer—這是一個負責創建標籤的對象。

l 在renderer裏面設置一個標籤可視的標誌。可以針對全部系列進行設置,也可以針對具體的每一個系列進行設置。

此外,我們可以定製條目標籤的位置、字體和顏色。在下面的章節裏我們將詳細的介紹。

3.2.2 創建一個條目標籤並賦值

使用renderer分配的一個標籤產生器創建條目標籤(這與圖表工具條的機制是相同的)。

下面代碼說了將一個標籤產生器指派給CategoryItemRenderer:

 

同樣的,將一個產生器指派給XYItemRenderer,代碼如下:

 

我們可以在標準產生器的構造函數中定製不同的行爲。當然了,我們也可以創建我們總計的產生器,詳見12.5.2章節。

3.2.3 所有的系列顯示條目標籤

方法renderer.setBaseItemLabelsVisible(false)是控制着條目標籤的顯示。對於CategoryItemRenderer:

 

同樣對於:XYItemRenderer

 

一旦設置,這個標誌優先管理我們在所有地方對每一系列做的設置,主要爲了應用每一系列的設置。我們可以設置個標誌爲null(見12.2.4章節)

3.2.4 爲選擇的系列顯示條目標籤

我們可以控制圖表的每一個系列的條目標籤是否顯示。例如:如下圖12.2僅顯示第一系列條目標籤。

 

如圖12.2顯示第一系列條目標籤

下面代碼可以設置如上效果:

 

注意:上面代碼中對全部的系列設置爲null—這一點非常重要,因爲全部系列的標誌控制每一個系列的標誌。

 

3.3 條目標籤外觀

3.3.1 概述

我們可以通過改變條目的顏色、字體來改變圖表條目標籤的外觀。正如其他renderer屬性一樣,屬性的設置可以是全部的系列,可以是具體某一系列。

在JFreeChart目前的版本中,標籤是月年個一個透明的背景畫出來的。我們不能設置標籤的背景顏色,也不能指定標籤的邊框。這些在以後的版本中會得到解決。

3.3.2 改變條目標籤的字體

爲了在所有的系列中改變條目標籤的字體,我們可以使用下面的代碼:

 

同樣,也可以爲單個系列設置字體:

 

注意:renderer.setBaseItemLabelFont(null)方法會出錯。開發指南顯示的代碼有錯誤。

3.3.3 改變條目標籤的顏色

改變條目標籤的顏色,我們可以使用下面的代碼:

 

同樣的,可以爲單獨每一系列設置顏色:

 

注意:renderer.setBaseItemLabelPaint(null);方法會出錯。開發指南顯示的代碼有錯誤。

3.4 條目標籤位置 (DrawStringDemo.java)

3.4.1 概述

條目標籤的位置是通過ItemLabelPosition對象的四個屬性來控制的。

我們可以通過接口CategoryItemRenderer的方法來獨立定義條目標籤的正負點位置:

 

理解這些屬性如何影響獨立標籤的最終位置的關鍵是瞭解JFreeChart裏麪條目標籤的特徵。四個特徵是:

l 條目標籤點——決定標籤的起始位置

l 文本點——標籤裏的文本相對於條目標籤的位置。

l 旋轉點——標籤文本旋轉的點位置

l 旋轉角度——標籤的旋轉角度。

這些的詳細描述在下一章詳細介紹。

3.4.2 標籤的位置

設置條目標籤位置的目的,主要是爲了找出標籤在圖表上貼向數據條目的一個點(x,y)位置。同時在畫圖表時,該標籤也被畫在該點處。

 setItemLabelPosition(ItemLabelPosition position)    數據標籤位置
 setPositiveItemLabelPosition(ItemLabelPosition position)   正數標籤位置
 setNegativeItemLabelPosition(ItemLabelPosition position)   負數標籤位置

 setSeriesItemLabelPosition(int series,ItemLabelPosition position)  數據標籤位置
 setSeriesPositiveItemLabelPosition(int series,ItemLabelPosition position) 正數標籤位置
 setSeriesNegativeItemLabelPosition(int series,ItemLabelPosition position) 負數標籤位置

3.4.3 標籤旋轉點

在標籤上定義了一個旋轉點,用於旋轉標籤。在DrawStringDemo實例中很好演示了這個特徵。通過setRotationAnchor(TextAnchor textanchor)可設置旋轉描點。

 

3.4.4 標籤旋轉角度

 旋轉角度定義了標籤沿旋轉點旋轉的角度。該角度爲弧度。方法爲setAngle(double d)。

 

3.4.5 標籤偏移

通過render的setAnchor(TextAnchor textanchor)可設置描點,setItemLabelAnchorOffset(double offset) 方法數據標籤的與數據點的偏移

3.5 定製條目標籤文本

3.5.1 概述

定製條目標籤文本,我們需要依賴用JFreeChart裏的標籤產生器來爲條目標籤創建文本。如果要想完全控制標籤文本的控制,我們就需要編寫自己的標籤產生器,需要實現接口CategoryItemLabelGenerator。

在本章節裏,我們對自定義標籤器技術做了簡要的講述,然後用兩個實例來說明該技術過程。

3.5.2 實現一個自定義的標籤產生器

開發一個自定義標籤產生器,我們需要寫一個類,該類必須實現CategoryItemLabelGenerator接口裏的方法。

 

該renderer調用該方法獲得一個標籤的字符串,並且將該字符串傳入到當前條目的CategoryDataset、序列和種類。這就意味着創建這個標籤時,我們擁有完全的訪問權限。

該方法可以返回任意字符串,因此我們格式化這個字符串。如果我們不想顯示標籤,可以設置爲null。

 

4 多軸和數據源圖表(Multi Axis and Dataset)

4.1 簡介

J FreeChart在CategoryPlot和XYPlot類中支持多軸和數據源顯示。我們利用這個特徵可以在一個圖表上顯示兩個或多個數據源數據,但對於數據包含的數據有巨大差距時留有一定的餘地。如圖13.1所示。

 

圖13.1 具有多軸的圖表

典型的,使用JFreeChart構建圖表時,圖表有一個單數據源、單renderer、單X/Y軸的圖區最爲常見。然而,在一個圖區上添加多個數據源、多個renderer和多個軸也是可能的。在本章的實例中,展示瞭如何在一個圖區上顯示其他額外的數據源、renderer和軸。

4.2 實例

4.2.1 簡介

MultipleAxisDemo1.java例子提供了一個很好的實例演示如何在一個圖表上創建多軸的應用。本章在每一步的代碼中提供了很多建議,詳見後面的章節。

4.2.2 創建一個圖表

創建一個具有多軸、多數據源、多renderer的圖表,我們首先要創建一個常規的圖表(例如使用ChartFactory類創建)。在本實例中,創建了一個時序圖,代碼如下:

 

 

4.2.3 添加額外的軸

如果在圖區上添加額外的軸,我們使用setRangeAxis()方法來添加:

 

方法setRangeAxis()是用來添加圖區的軸,注意軸的索引1已經被使用——我們添加其他軸時,通過增加該索引來添加新軸。方法setRangeAxisLocation()允許我們指定軸出現的位置(使用AxisLocation類)。我們添加的軸可以跟主座標軸同一邊,或者在對立邊。例如:如果指定的是AxisLocation.BOTTOM_OR_LEFT,這意味着如果圖區的方向是垂直的話,將在右邊添加了一個Y軸,如果圖區的方向是水平的話,將在底部添加一個Y軸。

在這裏,圖表上每一添加多餘的數據源,因此如果我們顯示該圖表,我們將看到圖上顯示多軸,但軸上無數據顯示。

4.2.4 添加一個額外的數據源

在圖區上添加一個額外的數據源,使用setDataset()方法:

 

缺省的,數據源將使用主軸來顯示數據。如果使數據源在另外的軸上顯示數據,需使用方法mapDatasetToDomainAxis()和mapDatasetToRangeAxis()。這兩個方法接受兩個參數,第一個參數是數據源的索引,第二個是軸的索引。

4.2.5 添加一個額外的renderer

當我們添加一個數據源時,通常爲該數據源添加一個附加的renderer也是非常有意義的。使用方法setRenderer():

 

方法的第一個參數爲上節中添加的數據源的索引。注意:如果我們不想爲數據源指定一個附加的rendere,系統將默認使用主renderer,這樣系列的顏色就會在主數據源和附加數據源之間共享。

5 組合圖表(Combined Charts)

5.1 簡介

JFreeChart支持幾個圖區類(可以管理着多個子類)組合而成的圖表。圖區類可以管理幾個子類:

l CombinedDomainCategoryPlot / CombinedRangeCategoryPlot

l CombinedDomainXYPlot / CombinedRangeXYPlot;

    本章使用幾個實例說明了JFreeChart創建組合圖表時的便利性。

5.2 組合X種類圖區

5.2.1 概述

組合主域種類圖區就是在一個圖區上顯示兩個或者多個子圖區(CategoryPlot實例),共享一個X軸的圖區。每個子圖區維護自己的Y軸。實例如圖14.1所示。

 

如圖14.1 組合X種類圖區(共享X軸)

顯示圖表可以是水平的,也可以是垂直方向的——實例演示的是垂直的圖表。

5.2.2 構建圖表

提供了一個很好的例子,演示如何創建該圖表的類型。關鍵的步驟是創建CombinedDomainCategoryPlot實例,然後添加兩個子圖區:

 

注意,我們subplot1添加碼值時是2(方法add()的第二個參數),而subplot1添加的是1呢?因爲這控制着分配給各個圖區的空間大小。

子圖區的CategoryPlot實例對象將它們的X軸設置爲null。例如在演示的實例中,代碼如下:

 

5.3 組合Y種類圖區

5.3.1 概述

一個組合Y種類圖區就是一個圖區顯示兩個或兩個以上的子圖區(CategoryPlot實例),共享Y軸。如果14.2.

 

圖14.2 組合Y種類圖區

該圖表可以水平顯示也可以垂直顯示(本例是垂直顯示)。

5.3.2 構建圖表

實例演示瞭如何創建該類型圖表。關鍵的步驟是創建一個實例,然後添加兩個子圖區:

 

注意添加的子圖區subplot1什麼碼值是3而子圖區subplot2碼值是2呢。這是因爲該值控制這兩個子圖區分配的空間大小。

子圖區是CategoryPlot實例,將Y軸設置爲null。例如,在本實例演示的代碼如下:

 

5.4 組合X-XY圖區

5.4.1 概述

組合X-XY圖區就是一個圖區顯示兩個或者多個子圖區(XYPlot實例),共享一個X軸。每一個子圖區維護自己的Y軸。如下圖14.3所示.

 

圖14.3 組合X-XY圖區(參見:CombinedXYPlotDemo5.java)

    圖區可能水平顯示也可能垂直顯示(本例子中垂直顯示)。

5.4.2 構建圖表

   CombinedXYPlotDemo5.java實例演示瞭如何創建該類型的圖表。關鍵的步驟是創建一個實例CombinedDomainXYPlot,並在該實例上添加兩個子圖區:

 

圖區的碼值1是代表每個圖區分配的空間大小因爲該數值控制着每個圖區分配的空間大小。

子圖區是XYPlot實例,將自己的X軸設置爲null。例如,下面的代碼演示了這個特徵:

 

5.5 組合Y-XY圖區

5.5.1 概述

   組合Y-XY圖區就是一個圖區顯示兩個或者多個子圖區(XYPlot實例),共享一個Y軸。每一個子圖區維護自己的X軸。如下圖14.4所示.

 

圖14.4 組合Y-XY圖區(參見:CombinedXYPlotDemo5.java)

    圖區可能水平顯示也可能垂直顯示(本例子中垂直顯示)。

5.5.2 構建圖表

   CombinedXYPlotDemo2java實例演示瞭如何創建該類型的圖表。關鍵的步驟是創建一個實例CombinedRangeXYPlot,並在該實例上添加兩個子圖區:

 

圖區的碼值1是代表每個圖區分配的空間大小因爲該數值控制着每個圖區分配的空間大小。

子圖區是XYPlot實例,將自己的X軸設置爲null。例如,下面的代碼演示了這個特徵:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章