jfreechart

jfreechart目前最高版本爲1.0.0版(http://www.jfree.org/jfreechart/index.html)。可以繪製
pie charts  餅圖,bar charts 柱狀圖,line and area charts曲線圖, scatter plots and bubble charts 散列圖,time series 時序圖,Area Charts區域圖, Difference Chart差異圖,Step Chart步驟圖,Multiple Axis Charts 混合圖,Gantt charts甘特圖,combination charts 複合圖
JFreeChart核心類庫介紹:
jfreechart主要由兩個大的包組成:org.jfree.chart,org.jfree.data。其中前者主要與圖形
本身有關,後者與圖形顯示的數據有關。
核心類主要有:
org.jfree.chart.JFreeChart:圖表對象,任何類型的圖表的最終表現形式都是在該對象進行一些屬性的定製。JFreeChart引擎本身提供了一個工廠類用於創建不同類型的圖表對象
org.jfree.data.category.XXXDataSet:數據集對象,用於提供顯示圖表所用的數據。根據不同類型的圖表對應着很多類型的數據集對象類
org.jfree.chart.plot.XXXPlot:圖表區域對象,基本上這個對象決定着什麼樣式的圖表,創建該對象的時候需要Axis、Renderer以及數據集對象的支持
org.jfree.chart.axis.XXXAxis:用於處理圖表的兩個軸:縱軸和橫軸
org.jfree.chart.render.XXXRender:負責如何顯示一個圖表對象
org.jfree.chart.urls.XXXURLGenerator:用於生成Web圖表中每個項目的鼠標點擊鏈接
XXXXXToolTipGenerator:用於生成圖象的幫助提示,不同類型圖表對應不同類型的工具提示類
對於常用的餅圖闔柱狀圖,比較簡單而且網上有很多的文章介紹,在這裏就不再一一複述了,
(可以參考這篇文章http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/index.html?ca=dwcn-isc&me=ccid)
主要說明下另一種常見的報表,時序圖,首先聲明一個曲線數據****對象和曲線對象

TimePeriodValuesCollection timeseriescollection = new TimePeriodValuesCollection();
//聲明具體是曲線對象,(可根據實際情況在同一張圖中顯示多條曲線進行數據比對,根據實際應用情況當超過4條曲線時,就會有些亂。)
TimePeriodValues timeperiod1 = new TimePeriodValues("服務器A在線用戶數量");
TimePeriodValues timeperiod2 = new TimePeriodValues("服務器B在線用戶數量");
我在使用TimeSeriesCollection tsc = new TimeSeriesCollection();
TimeSeries ts = new TimeSeries();
在生成數據集時(ts.add(new Day(day, month, year),10)))只能生成最小單位爲天的橫軸所以改用了TimePeriodValuesCollection
//根據當前時間取得橫軸座標,時間間隔爲1小時
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;
int day = cal.get(Calendar.DAY_OF_MONTH);
//這裏改爲根據自己程序得到的需要顯示的時間點和對應的數據的****;
List objectList1 = dao.getList1();
List objectList2 = dao.getList2();
//使用循環,把x軸,y軸的值賦給timeseries1
for (int i =0;i<objecthash1.size();i++) {
    int hour = objecthash1.getHours();
    int count = objecthash1.getCount();
//將每一對數據(時間,數值)添加到數據****1(曲線對象1)中
    timeseries1.add(new Hour(hour, day, month, year),count);
}
for (int i =0;i<objecthash2.size();i++) {
    int hour = objecthash2.getHours();
    int count = objecthash2.getCount();
//將每一對數據(時間,數值)添加到數據****2(曲線對象2)中
    timeseries2.add(new Hour(hour, day, month, year),count);
}
//將曲線對象添加到曲線數據****對象中
timeseriescollection.addSeries(timeseries1);
timeseriescollection.addSeries(timeseries2);
//繪製報表
String title = "日在線用戶統計"; //報表標題
String domain = "時間";    //x軸
String range = "用戶在線數量";   //y軸
//創建時間序列圖對象
JFreeChart chart = ChartFactory.createTimeSeriesChart(
title,  //報表標題
domain, //報表橫軸標籤
range,  //報表縱軸標籤
timeseriescollection, //數據****
true,  //是否顯示圖例,在這裏如果爲true則會在圖表的下方顯示各條數據曲線的名稱和顏色
false, // 是否生成工具
false   // 是否生成URL鏈接);
//將報表保存爲jpg文件
ChartUtilities.saveChartAsJPEG(file, //文件保存物理路徑包括路徑和文件名
100,   //圖片質量
chart, //圖表對象
1024,  //圖像寬度
768,   //圖像高度
null); //顯示信息
//將報表直接在頁面輸出
ChartUtilities.writeChartAsJPEG(res.getOutputStream(),100,chart,1024,768,null);

String title="月在線用戶統計";  //標題
String domain="時間(天)";//x軸
String range="用戶在線數量";//y軸
TimePeriodValuesCollection   timeseriescollection   =   new   TimePeriodValuesCollection();
TimePeriodValues timeseries = new TimePeriodValues( "用戶數量");
timeseries.add(new Minute(0, 1, 1, 1, 2006), 100);
timeseries.add(new Minute(10, 1, 1, 1, 2006), 500);
timeseries.add(new Minute(20, 1, 1, 1, 2006), 300);
timeseries.add(new Minute(30, 1, 1, 1, 2006), 800);
JFreeChart chart =ChartFactory.createTimeSeriesChart(title,domain,range,timeseriescollection,true,false,false);
當我們生成了一個報表對象時,可能需要根據實際情況來決定報表的橫軸和縱軸的數值間隔,顯示方式等。
可以用XYPlot xyplot = (XYPlot)chart.getPlot();來得到所有數據點的****。(其它形狀圖表得到的數據集對象根據實際情況造型)
得到數據點****後,我們就可以設置各條曲線的顏色,和座標軸的距離,x軸、y軸的顯示方式等等屬性
xyplot.setBackgroundPaint(Color.lightGray); //設定圖表數據顯示部分背景色
xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); //設定座標軸與圖表數據顯示部分距離
xyplot.setDomainGridlinePaint(Color.white); //網格線縱向顏色
xyplot.setRangeGridlinePaint(Color.white); //網格線橫向顏色
數據點的調整
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer();
xylineandshaperenderer.setDefaultShapesVisible(true);  //數據點可見
xylineandshaperenderer.setSeriesFillPaint(0, Color.red);  //設置第一條曲線數據點填充爲紅色,如果一個圖表有多條曲線可分別設置
xylineandshaperenderer.setUseFillPaint(true);    //應用

使用xyplot.getRangeAxis()得到縱軸,xyplot.getDomainAxis()得到橫軸,得到後可以根據實際情況造型爲自己所需要的類型。
我的圖表縱軸爲數值類型,橫軸爲時間類型,使用如下方式
NumberAxis numAxis = (NumberAxis)xyplot.getRangeAxis();
DateAxis  dateaxis =   (DateAxis)xyplot.getDomainAxis();
//設置y顯示方式
numAxis.setAutoTickUnitSelection(false);//數據軸的數據標籤是否自動確定
double  rangetick = 0.1D;
numAxis.setTickUnit(new NumberTickUnit(rangetick));  //y軸單位間隔爲0.1
//設置x軸顯示方式
dateaxis.setAutoTickUnitSelection(false);//數據軸的數據標籤是否自動確定
dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.DAY,1));//x軸單位間隔爲1天
我們還可以是將數據格式化以後顯示,比如y軸顯示百分比(10%~100%),x軸顯示爲×月×日
NumberFormat nf =NumberFormat.getPercentInstance();
numAxis.setNumberFormatOverride(nf);//設置y軸以百分比方式顯示
SimpleDateFormat format = new SimpleDateFormat("MM月dd");
dateaxis.setDateFormatOverride(format);//設置x軸數據單位以×月×日方式顯示
時序圖中還有一個很重要的方法
timeseriescollection.setDomainIsPointsInTime(true); //x軸上的刻度點代表的是時間點而不是時間段
最開始我沒有設置這個屬性,結果畫出來的圖,老是差半格不能在這個刻度的時候準確顯示,往後移了半格,就是因爲JFreeChart默認這個刻度是
一個時間段,它把這個刻度和下個刻度的中間點認爲是顯示數據點最佳位置。

其他一些關於AXIS類的方法:
Axis類:
void setVisible(boolean flag)座標軸是否可見
void setAxisLinePaint(Paint paint)座標軸線條顏色(3D軸無效)
void setAxisLineStroke(Stroke stroke)座標軸線條筆觸(3D軸無效)
void setAxisLineVisible(boolean visible)座標軸線條是否可見(3D軸無效)
void setFixedDimension(double dimension)(用於複合表中對多座標軸的設置)
void setLabel(String label)座標軸標題
void setLabelFont(Font font)座標軸標題字體
void setLabelPaint(Paint paint)座標軸標題顏色
void setLabelAngle(double angle)`座標軸標題旋轉角度(縱座標可以旋轉)
void setTickLabelFont(Font font)座標軸標尺值字體
void setTickLabelPaint(Paint paint)座標軸標尺值顏色
void setTickLabelsVisible(boolean flag)座標軸標尺值是否顯示
void setTickMarkPaint(Paint paint)座標軸標尺顏色
void setTickMarkStroke(Stroke stroke)座標軸標尺筆觸
void setTickMarksVisible(boolean flag)座標軸標尺是否顯示
ValueAxis(Axis)類:
void setAutoRange(boolean auto)自動設置數據軸數據範圍
void setAutoRangeMinimumSize(double size)自動設置數據軸數據範圍時數據範圍的最小跨度
void setAutoTickUnitSelection(boolean flag)數據軸的數據標籤是否自動確定(默認爲true)
void setFixedAutoRange(double length)數據軸固定數據範圍(設置100的話就是顯示MAXVALUE到MAXVALUE-100那段數據範圍)
void setInverted(boolean flag)數據軸是否反向(默認爲false)
void setLowerMargin(double margin)數據軸下(左)邊距
void setUpperMargin(double margin)數據軸上(右)邊距
void setLowerBound(double min)數據軸上的顯示最小值
void setUpperBound(double max)數據軸上的顯示最大值
void setPositiveArrowVisible(boolean visible)是否顯示正向箭頭(3D軸無效)
void setNegativeArrowVisible(boolean visible)是否顯示反向箭頭(3D軸無效)
void setVerticalTickLabels(boolean flag)數據軸數據標籤是否旋轉到垂直
void setStandardTickUnits(TickUnitSource source)數據軸的數據標籤(可以只顯示整數標籤,需要將AutoTickUnitSelection設false)
NumberAxis(ValueAxis)類:
void setAutoRangeIncludesZero(boolean flag)是否強制在自動選擇的數據範圍中包含0
void setAutoRangeStickyZero(boolean flag)是否強制在整個數據軸中包含0,即使0不在數據範圍中
void setNumberFormatOverride(NumberFormat formatter)數據軸數據標籤的顯示格式
void setTickUnit(NumberTickUnit unit)數據軸的數據標籤(需要將AutoTickUnitSelection設false)
DateAxis(ValueAxis)類:
void setMaximumDate(Date maximumDate)日期軸上的最小日期
void setMinimumDate(Date minimumDate)日期軸上的最大日期
void setRange(Date lower,Date upper)日期軸範圍
void setDateFormatOverride(DateFormat formatter)日期軸日期標籤的顯示格式
void setTickUnit(DateTickUnit unit)日期軸的日期標籤(需要將AutoTickUnitSelection設false)
void setTickMarkPosition(DateTickMarkPosition position)日期標籤位置(參數常量在org.jfree.chart.axis.DateTickMarkPosition類中定義)
CategoryAxis(Axis)類:
void setCategoryMargin(double margin)分類軸邊距
void setLowerMargin(double margin)分類軸下(左)邊距
void setUpperMargin(double margin)分類軸上(右)邊距
void setVerticalCategoryLabels(boolean flag)分類軸標題是否旋轉到垂直
void setMaxCategoryLabelWidthRatio(float ratio)分類軸分類標籤的最大寬度

發佈了65 篇原創文章 · 獲贊 0 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章