TNT blog |
|
|||
日歷
統計
導航常用鏈接留言簿(2)隨筆分類隨筆檔案文章分類
文章檔案
收藏夾home搜索最新隨筆最新評論
閱讀排行榜 |
jfreechart目前最高版本為1.0.0版(http://www.jfree.org/jfreechart/index.html)??梢岳L制 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[i].getHours(); ????int?count?=?objecthash1[i].getCount(); ?//將每一對數據(時間,數值)添加到數據集合1(曲線對象1)中 ????timeseries1.add(new?Hour(hour,?day,?month,?year),count); } for?(int?i?=0;i<objecthash2.size();i++)?{ ????int?hour?=?objecthash2[i].getHours(); ????int?count?=?objecthash2[i].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)分類軸分類標簽的最大寬度
|
![]() |
|
Copyright © TNT | Powered by: 博客園 模板提供:滬江博客 |