在使用cewolf?之前,首先來熟悉一下jFreeChart?。這里分三部分來介紹?jFreeChart?。第一部分介紹jFreeChart產(chǎn)生
圖形的流程及相關(guān)的重要的類;第二部分介紹四種常用的報表圖(餅圖、柱狀圖、折線圖、時間序列圖);第三部分
介紹在圖形中增加Item?Lable?。?
jFreeChart?的版本是jfreechart-1.0.0-pre2(1)
cewolf?的最新版本是cewolf-0.12.0
一、jFreeChart產(chǎn)生圖形的流程
???創(chuàng)建一個數(shù)據(jù)源(dataset)來包含將要在圖形中顯示的數(shù)據(jù)?????>>創(chuàng)建一個?JFreeChart?對象來代表要顯示的圖形
?????????>>把圖形輸出
???重要的類和接口:
???org.jfree.data.general.Dataset??所有數(shù)據(jù)源類都要實(shí)現(xiàn)的接口
???org.jfree.chart.ChartFactory????由它來產(chǎn)生?JFreeChart?對象
???org.jfree.chart.JFreeChart????所有對圖形的調(diào)整都是通過它噢?。?br />???org.jfree.chart.plot.Plot????通過JFreeChart?對象獲得它,然后再通過它對圖形外部部分(例:坐標(biāo)軸)調(diào)整
????????????????????????????????注意:它有很多子類,一般都下嗍造型到它的子類!
???org.jfree.chart.renderer.AbstractRenderer?????通過JFreeChart?對象獲得它,然后再通過它對圖形內(nèi)部部分
????????????????????????????????????????????????(例:折線的類型)調(diào)整。同樣,針對不同類型的報表圖,它有
????????????????????????????????????????????????著不同的子類實(shí)現(xiàn)!在下面我們簡稱它為?Renderer
???下面我們結(jié)合不同類型的圖形來具體分析這個流程。
???
二、餅圖
???餅圖的dataset?一般是用PieDataset?接口,具體實(shí)現(xiàn)類是?DefaultPieDataset
???1、創(chuàng)建一個數(shù)據(jù)源(dataset):
????private?static?PieDataset?createDataset()
????{
????????DefaultPieDataset?defaultpiedataset?=?new?DefaultPieDataset();?//注意是DefaultPieDataset?。?br />????????defaultpiedataset.setValue("One",?new?Double(43.200000000000003D));
????????defaultpiedataset.setValue("Two",?new?Double(10D));
????????defaultpiedataset.setValue("Three",?new?Double(27.5D));
????????defaultpiedataset.setValue("Four",?new?Double(17.5D));
????????return?defaultpiedataset;
????}?
???2、由ChartFactory??產(chǎn)生?JFreeChart?對象
????private?static?JFreeChart?createChart(PieDataset?piedataset)
????{
????????JFreeChart?jfreechart?=?ChartFactory.createPieChart("Pie?Chart?Demo?1",??//圖形標(biāo)題名稱
??????????????????????????????????????????????????????????????piedataset,???//?dataset
??????????????????????????????????????????????????????????????true,??????//?legend?
??????????????????????????????????????????????????????????????true,?????//?tooltips?
??????????????????????????????????????????????????????????????false);??//URLs?
????????PiePlot?pieplot?=?(PiePlot)jfreechart.getPlot();??//通過JFreeChart?對象獲得?plot:PiePlot??!
????????pieplot.setNoDataMessage("No?data?available");????//?沒有數(shù)據(jù)的時候顯示的內(nèi)容
????????return?jfreechart;
????}?
????一些重要的方法:
????pieplot.setExplodePercent(0,0.3D)?//把Lable?為"One"?的那一塊”挖“出來30%????
???3、輸出略??
???
三、柱狀圖
???柱狀圖的dataset?一般是用CatagoryDataset接口(具體實(shí)現(xiàn)類是DefaultCategoryDataset),也會用?IntervalXYDataset?
???接口
???1、創(chuàng)建一個數(shù)據(jù)源(dataset):
????private?static?CategoryDataset?createDataset()
????{
????????String?series1?=?"First";
????????String?series2?=?"Second";
????????String?series3?=?"Third";
????????String?category1?=?"Category?1";
????????String?category2?=?"Category?2";
????????String?category3?=?"Category?3";
????????String?category4?=?"Category?4";
????????String?category5?=?"Category?5";
????????DefaultCategoryDataset?defaultcategorydataset?=?new?DefaultCategoryDataset();
????????defaultcategorydataset.addValue(1.0D,?series1,?category1);
????????defaultcategorydataset.addValue(4D,?series1,?category2);
????????defaultcategorydataset.addValue(3D,?series1,?category3);
????????defaultcategorydataset.addValue(5D,?series1,?category4);
????????defaultcategorydataset.addValue(5D,?series1,?category5);
????????
????????defaultcategorydataset.addValue(5D,?series2,?category1);
????????defaultcategorydataset.addValue(7D,?series2,?category2);
????????defaultcategorydataset.addValue(6D,?series2,?category3);
????????defaultcategorydataset.addValue(8D,?series2,?category4);
????????defaultcategorydataset.addValue(4D,?series2,?category5);
????????
????????defaultcategorydataset.addValue(4D,?series3,?category1);
????????defaultcategorydataset.addValue(3D,?series3,?category2);
????????defaultcategorydataset.addValue(2D,?series3,?category3);
????????defaultcategorydataset.addValue(3D,?series3,?category4);
????????defaultcategorydataset.addValue(6D,?series3,?category5);
????????return?defaultcategorydataset;
????}
???2、由ChartFactory??產(chǎn)生?JFreeChart?對象????
????private?static?JFreeChart?createChart(CategoryDataset?categorydataset)
????{
????????JFreeChart?jfreechart?=?ChartFactory.createBarChart("Bar?Chart?Demo",?//圖形標(biāo)題名稱
????????????????????????????????????????????????????????????"Category",//domain?軸?Lable?
?????????????????????????????????????????????????????????????????????????這里先簡單理解為橫坐標(biāo)Lable好了
????????????????????????????????????????????????????????????"Value",?//range?軸?Lable
???????????????????????????????????????????????????????????????????????這里也先簡單理解為縱坐標(biāo)Lable好了
????????????????????????????????????????????????????????????categorydataset,?//??dataset
????????????????????????????????????????????????????????????PlotOrientation.VERTICAL,?//垂直顯示
????????????????????????????????????????????????????????????true,?//?legend?
????????????????????????????????????????????????????????????true,??//?tooltips?
????????????????????????????????????????????????????????????false);?//URLs?
????????jfreechart.setBackgroundPaint(Color.white);???//設(shè)定背景色為白色
????????CategoryPlot?categoryplot?=?jfreechart.getCategoryPlot();?//獲得?plot:CategoryPlot!!
????????categoryplot.setBackgroundPaint(Color.lightGray);?//設(shè)定圖表數(shù)據(jù)顯示部分背景色
????????categoryplot.setDomainGridlinePaint(Color.white);?//橫坐標(biāo)網(wǎng)格線白色
????????categoryplot.setDomainGridlinesVisible(true);?//可見
????????categoryplot.setRangeGridlinePaint(Color.white);?//縱坐標(biāo)網(wǎng)格線白色
????????//下面兩行使縱坐標(biāo)的最小單位格為整數(shù)
????????NumberAxis?numberaxis?=?(NumberAxis)categoryplot.getRangeAxis();
????????numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
????????BarRenderer?barrenderer?=?(BarRenderer)categoryplot.getRenderer();?//獲得renderer?注意這里是下嗍造型
?????????????????????????????????????????????????????????????????????????????到BarRenderer??!
????????barrenderer.setDrawBarOutline(false);?//?Bar的外輪廓線不畫
????????GradientPaint?gradientpaint?=?new?GradientPaint(0.0F,?0.0F,?Color.blue,?
????????0.0F,?0.0F,?new?Color(0,?0,?64));???//設(shè)定特定顏色
????????GradientPaint?gradientpaint1?=?new?GradientPaint(0.0F,?0.0F,?Color.green,?
????????0.0F,?0.0F,?new?Color(0,?64,?0));
????????GradientPaint?gradientpaint2?=?new?GradientPaint(0.0F,?0.0F,?Color.red,
????????0.0F,?0.0F,?new?Color(64,?0,?0));
????????barrenderer.setSeriesPaint(0,?gradientpaint);?//給series1?Bar設(shè)定上面定義的顏色
????????barrenderer.setSeriesPaint(1,?gradientpaint1);?//給series2?Bar?設(shè)定上面定義的顏色
????????barrenderer.setSeriesPaint(2,?gradientpaint2);?//給series3?Bar?設(shè)定上面定義的顏色
????????CategoryAxis?categoryaxis?=?categoryplot.getDomainAxis();??//橫軸上的?Lable?45度傾斜
????????categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);????????
????????return?jfreechart;
????}??
????一些重要的方法:(增加一塊標(biāo)記)
????????IntervalMarker?intervalmarker?=?new?IntervalMarker(4.5D,?7.5D);
????????intervalmarker.setLabel("Target?Range");
????????intervalmarker.setLabelFont(new?Font("SansSerif",?2,?11));
????????intervalmarker.setLabelAnchor(RectangleAnchor.LEFT);
????????intervalmarker.setLabelTextAnchor(TextAnchor.CENTER_LEFT);
????????intervalmarker.setPaint(new?Color(222,?222,?255,?128));
????????categoryplot.addRangeMarker(intervalmarker,?Layer.BACKGROUND);????
????????
四、折線圖
???折線圖的dataset?兩種CatagoryDataset接口(具體實(shí)現(xiàn)類是DefaultCategoryDataset),XYDataset?接口?
???1、CatagoryDataset接口:?????????
???A、創(chuàng)建一個數(shù)據(jù)源(dataset):?
????private?static?CategoryDataset?createDataset()
????{
????????String?series1?=?"First";
????????String?series2?=?"Second";
????????String?series3?=?"Third";
????????String?type1?=?"Type?1";
????????String?type2?=?"Type?2";
????????String?type3?=?"Type?3";
????????String?type4?=?"Type?4";
????????String?type5?=?"Type?5";
????????String?type6?=?"Type?6";
????????String?type7?=?"Type?7";
????????String?type8?=?"Type?8";
????????DefaultCategoryDataset?defaultcategorydataset?=?new?DefaultCategoryDataset();
????????defaultcategorydataset.addValue(1.0D,?series1,?type1);
????????defaultcategorydataset.addValue(4D,?series1,?type2);
????????defaultcategorydataset.addValue(3D,?series1,?type3);
????????defaultcategorydataset.addValue(5D,?series1,?type4);
????????defaultcategorydataset.addValue(5D,?series1,?type5);
????????defaultcategorydataset.addValue(7D,?series1,?type6);
????????defaultcategorydataset.addValue(7D,?series1,?type7);
????????defaultcategorydataset.addValue(8D,?series1,?type8);
????????
????????defaultcategorydataset.addValue(5D,?series2,?type1);
????????defaultcategorydataset.addValue(7D,?series2,?type2);
????????defaultcategorydataset.addValue(6D,?series2,?type3);
????????defaultcategorydataset.addValue(8D,?series2,?type4);
????????defaultcategorydataset.addValue(4D,?series2,?type5);
????????defaultcategorydataset.addValue(4D,?series2,?type6);
????????defaultcategorydataset.addValue(2D,?series2,?type7);
????????defaultcategorydataset.addValue(1.0D,?series2,?type8);
????????
????????defaultcategorydataset.addValue(4D,?series3,?type1);
????????defaultcategorydataset.addValue(3D,?series3,?type2);
????????defaultcategorydataset.addValue(2D,?series3,?type3);
????????defaultcategorydataset.addValue(3D,?series3,?type4);
????????defaultcategorydataset.addValue(6D,?series3,?type5);
????????defaultcategorydataset.addValue(3D,?series3,?type6);
????????defaultcategorydataset.addValue(4D,?series3,?type7);
????????defaultcategorydataset.addValue(3D,?series3,?type8);
????????return?defaultcategorydataset;
????}?
???B、由ChartFactory??產(chǎn)生?JFreeChart?對象?????(與上面重復(fù)的部分就不再注釋)
????private?static?JFreeChart?createChart(CategoryDataset?categorydataset)
????{
????????JFreeChart?jfreechart?=?ChartFactory.createLineChart("Line?Chart?Demo?1",?
?????????????????????????????????????????????????????????????"Type",?
?????????????????????????????????????????????????????????????"Value",?
?????????????????????????????????????????????????????????????categorydataset,?
?????????????????????????????????????????????????????????????PlotOrientation.VERTICAL,?
?????????????????????????????????????????????????????????????true,?
?????????????????????????????????????????????????????????????true,?
?????????????????????????????????????????????????????????????false);
????????jfreechart.setBackgroundPaint(Color.white);
????????CategoryPlot?categoryplot?=?(CategoryPlot)jfreechart.getPlot();
????????categoryplot.setBackgroundPaint(Color.lightGray);
????????categoryplot.setRangeGridlinePaint(Color.white);
????????NumberAxis?numberaxis?=?(NumberAxis)categoryplot.getRangeAxis();
????????numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
????????numberaxis.setAutoRangeIncludesZero(true);
????????//獲得renderer?注意這里是下嗍造型到lineandshaperenderer?。?br />????????LineAndShapeRenderer?lineandshaperenderer?=?(LineAndShapeRenderer)categoryplot.getRenderer();
????????lineandshaperenderer.setShapesVisible(true);?//series?點(diǎn)(即數(shù)據(jù)點(diǎn))可見
????????lineandshaperenderer.setSeriesStroke(0,?new?BasicStroke(2.0F,?1,?1,?1.0F,?new?float[]?{
????????????10F,?6F
????????},?0.0F));?//定義series為"First"的(即series1)點(diǎn)之間的連線?,這里是虛線,默認(rèn)是直線
????????lineandshaperenderer.setSeriesStroke(1,?new?BasicStroke(2.0F,?1,?1,?1.0F,?new?float[]?{
????????????6F,?6F
????????},?0.0F));?//定義series為"Second"的(即series2)點(diǎn)之間的連線
????????lineandshaperenderer.setSeriesStroke(2,?new?BasicStroke(2.0F,?1,?1,?1.0F,?new?float[]?{
????????????2.0F,?6F
????????},?0.0F));?//定義series為"Third"的(即series3)點(diǎn)之間的連線
????????return?jfreechart;
????}?
????????一些重要的方法:
????????lineandshaperenderer.setLineVisible(true)??//series?點(diǎn)(即數(shù)據(jù)點(diǎn))間有連線可見
???2、XYDataset?接口:
???A、創(chuàng)建一個數(shù)據(jù)源(dataset):
????private?static?XYDataset?createDataset()
????{
????????XYSeries?xyseries?=?new?XYSeries("First");?//先產(chǎn)生XYSeries?對象
????????xyseries.add(1.0D,?1.0D);
????????xyseries.add(2D,?4D);
????????xyseries.add(3D,?3D);
????????xyseries.add(4D,?5D);
????????xyseries.add(5D,?5D);
????????xyseries.add(6D,?7D);
????????xyseries.add(7D,?7D);
????????xyseries.add(8D,?8D);
????????
????????XYSeries?xyseries1?=?new?XYSeries("Second");
????????xyseries1.add(1.0D,?5D);
????????xyseries1.add(2D,?7D);
????????xyseries1.add(3D,?6D);
????????xyseries1.add(4D,?8D);
????????xyseries1.add(5D,?4D);
????????xyseries1.add(6D,?4D);
????????xyseries1.add(7D,?2D);
????????xyseries1.add(8D,?1.0D);
????????
????????XYSeries?xyseries2?=?new?XYSeries("Third");
????????xyseries2.add(3D,?4D);
????????xyseries2.add(4D,?3D);
????????xyseries2.add(5D,?2D);
????????xyseries2.add(6D,?3D);
????????xyseries2.add(7D,?6D);
????????xyseries2.add(8D,?3D);
????????xyseries2.add(9D,?4D);
????????xyseries2.add(10D,?3D);
????????
????????XYSeriesCollection?xyseriescollection?=?new?XYSeriesCollection();?//再用XYSeriesCollection添加入XYSeries?對象
????????xyseriescollection.addSeries(xyseries);
????????xyseriescollection.addSeries(xyseries1);
????????xyseriescollection.addSeries(xyseries2);
????????return?xyseriescollection;
????}
???B、由ChartFactory??產(chǎn)生?JFreeChart?對象?
????private?static?JFreeChart?createChart(XYDataset?xydataset)
????{
????????JFreeChart?jfreechart?=?ChartFactory.createXYLineChart("Line?Chart?Demo?2",?
???????????????????????????????????????????????????????????????"X",?
???????????????????????????????????????????????????????????????"Y",?
???????????????????????????????????????????????????????????????xydataset,?
???????????????????????????????????????????????????????????????PlotOrientation.VERTICAL,?
???????????????????????????????????????????????????????????????true,?
???????????????????????????????????????????????????????????????true,?
???????????????????????????????????????????????????????????????false);
????????jfreechart.setBackgroundPaint(Color.white);
????????XYPlot?xyplot?=?(XYPlot)jfreechart.getPlot();?//獲得?plot:XYPlot!!
????????xyplot.setBackgroundPaint(Color.lightGray);?//設(shè)定圖表數(shù)據(jù)顯示部分背景色
????????xyplot.setAxisOffset(new?RectangleInsets(5D,?5D,?5D,?5D));?//設(shè)定坐標(biāo)軸與圖表數(shù)據(jù)顯示部分距離
????????xyplot.setDomainGridlinePaint(Color.white);?//網(wǎng)格線顏色
????????xyplot.setRangeGridlinePaint(Color.white);
????????//獲得?renderer?注意這里是XYLineAndShapeRenderer?!!
????????XYLineAndShapeRenderer?xylineandshaperenderer?=?(XYLineAndShapeRenderer)xyplot.getRenderer();
????????xylineandshaperenderer.setShapesVisible(true);?//數(shù)據(jù)點(diǎn)可見
????????xylineandshaperenderer.setShapesFilled(true);?//數(shù)據(jù)點(diǎn)被填充即不是空心點(diǎn)
????????NumberAxis?numberaxis?=?(NumberAxis)xyplot.getRangeAxis();
????????numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
????????return?jfreechart;
????}??????????????????????
???一些重要的方法:
????????XYLineAndShapeRenderer?xylineandshaperenderer?=?new?XYLineAndShapeRenderer();
????????xylineandshaperenderer.setSeriesLinesVisible(0,?false);?//第一個XYSeries數(shù)據(jù)點(diǎn)間連線不可見
????????xylineandshaperenderer.setSeriesShapesVisible(1,?false);?//第二個XYSeries數(shù)據(jù)點(diǎn)不可見
????????xyplot.setRenderer(xylineandshaperenderer);???
????????
五、時間序列圖
????時間序列圖和折線圖很相似,不同的是它在?domain軸的數(shù)據(jù)是時間而不是數(shù)字。?時間序列圖的dataset?是
????XYDataset?接口,具體實(shí)現(xiàn)類是TimeSeriesCollection?,和上面類似,有TimeSeries?對象,它被添加入
????TimeSeriesCollection?。???????????????????????????????????????????????????????????????????????????????
??1、創(chuàng)建一個數(shù)據(jù)源(dataset):
????private?static?XYDataset?createDataset()
????{
????????TimeSeries?timeseries?=?new?TimeSeries("L&G?European?Index?Trust",Month.class);
????????timeseries.add(new?Month(2,?2001),?181.8D);//這里用的是Month.class,同樣還有Day.class?Year.class?等等
????????timeseries.add(new?Month(3,?2001),?167.3D);
????????timeseries.add(new?Month(4,?2001),?153.8D);
????????timeseries.add(new?Month(5,?2001),?167.6D);
????????timeseries.add(new?Month(6,?2001),?158.8D);
????????timeseries.add(new?Month(7,?2001),?148.3D);
????????timeseries.add(new?Month(8,?2001),?153.9D);
????????timeseries.add(new?Month(9,?2001),?142.7D);
????????timeseries.add(new?Month(10,?2001),?123.2D);
????????timeseries.add(new?Month(11,?2001),?131.8D);
????????timeseries.add(new?Month(12,?2001),?139.6D);
????????timeseries.add(new?Month(1,?2002),?142.9D);
????????timeseries.add(new?Month(2,?2002),?138.7D);
????????timeseries.add(new?Month(3,?2002),?137.3D);
????????timeseries.add(new?Month(4,?2002),?143.9D);
????????timeseries.add(new?Month(5,?2002),?139.8D);
????????timeseries.add(new?Month(6,?2002),?137D);
????????timeseries.add(new?Month(7,?2002),?132.8D);
????????
????????TimeSeries?timeseries1?=?new?TimeSeries("L&G?UK?Index?Trust",Month.class);
????????timeseries1.add(new?Month(2,?2001),?129.6D);
????????timeseries1.add(new?Month(3,?2001),?123.2D);
????????timeseries1.add(new?Month(4,?2001),?117.2D);
????????timeseries1.add(new?Month(5,?2001),?124.1D);
????????timeseries1.add(new?Month(6,?2001),?122.6D);
????????timeseries1.add(new?Month(7,?2001),?119.2D);
????????timeseries1.add(new?Month(8,?2001),?116.5D);
????????timeseries1.add(new?Month(9,?2001),?112.7D);
????????timeseries1.add(new?Month(10,?2001),?101.5D);
????????timeseries1.add(new?Month(11,?2001),?106.1D);
????????timeseries1.add(new?Month(12,?2001),?110.3D);
????????timeseries1.add(new?Month(1,?2002),?111.7D);
????????timeseries1.add(new?Month(2,?2002),?111D);
????????timeseries1.add(new?Month(3,?2002),?109.6D);
????????timeseries1.add(new?Month(4,?2002),?113.2D);
????????timeseries1.add(new?Month(5,?2002),?111.6D);
????????timeseries1.add(new?Month(6,?2002),?108.8D);
????????timeseries1.add(new?Month(7,?2002),?101.6D);
????????TimeSeriesCollection?timeseriescollection?=?new?TimeSeriesCollection();
????????timeseriescollection.addSeries(timeseries);
????????timeseriescollection.addSeries(timeseries1);
????????timeseriescollection.setDomainIsPointsInTime(true);?//domain軸上的刻度點(diǎn)代表的是時間點(diǎn)而不是時間段
????????return?timeseriescollection;
????}
???2、由ChartFactory??產(chǎn)生?JFreeChart?對象?
????private?static?JFreeChart?createChart(XYDataset?xydataset)
????{
????????JFreeChart?jfreechart?=?ChartFactory.createTimeSeriesChart("Legal?&?General?Unit?Trust?Prices",?
???????????????????????????????????????????????????????????????????"Date",?
???????????????????????????????????????????????????????????????????"Price?Per?Unit",?
???????????????????????????????????????????????????????????????????xydataset,?
???????????????????????????????????????????????????????????????????true,?
???????????????????????????????????????????????????????????????????true,?
???????????????????????????????????????????????????????????????????false);
????????jfreechart.setBackgroundPaint(Color.white);
????????XYPlot?xyplot?=?(XYPlot)jfreechart.getPlot();?//獲得?plot?:?XYPlot!!
????????xyplot.setBackgroundPaint(Color.lightGray);
????????xyplot.setDomainGridlinePaint(Color.white);
????????xyplot.setRangeGridlinePaint(Color.white);
????????xyplot.setAxisOffset(new?RectangleInsets(5D,?5D,?5D,?5D));
????????xyplot.setDomainCrosshairVisible(true);
????????xyplot.setRangeCrosshairVisible(true);
????????org.jfree.chart.renderer.xy.XYItemRenderer?xyitemrenderer?=?xyplot.getRenderer();
????????if(xyitemrenderer?instanceof?XYLineAndShapeRenderer)
????????{
????????????XYLineAndShapeRenderer?xylineandshaperenderer?=?(XYLineAndShapeRenderer)xyitemrenderer;
????????????xylineandshaperenderer.setDefaultShapesVisible(true);?//數(shù)據(jù)點(diǎn)可見
????????????xylineandshaperenderer.setDefaultShapesFilled(true);??//數(shù)據(jù)點(diǎn)是實(shí)心點(diǎn)
????????}
????????DateAxis?dateaxis?=?(DateAxis)xyplot.getDomainAxis();?//對domain?軸上日期顯示格式定義
????????dateaxis.setDateFormatOverride(new?SimpleDateFormat("MMM-yyyy"));
????????return?jfreechart;
????}??
???????一些重要的方法:
?????A、增加標(biāo)記線:?
????????xyplot.addRangeMarker(new?ValueMarker(550D));?//數(shù)值軸
????????Quarter?quarter?=?new?Quarter(2,?2002);
????????xyplot.addDomainMarker(new?ValueMarker(quarter.getMiddleMillisecond()));??//時間軸
?????B、數(shù)據(jù)點(diǎn)的調(diào)整
????????XYLineAndShapeRenderer?xylineandshaperenderer?=?(XYLineAndShapeRenderer)xyplot.getRenderer();
????????xylineandshaperenderer.setDefaultShapesVisible(true);??//數(shù)據(jù)點(diǎn)可見
????????xylineandshaperenderer.setSeriesFillPaint(0,?Color.red);??//數(shù)據(jù)點(diǎn)填充為紅色
????????xylineandshaperenderer.setSeriesFillPaint(1,?Color.white);??//數(shù)據(jù)點(diǎn)填充為白色
????????xylineandshaperenderer.setUseFillPaint(true);????//應(yīng)用
?????C、平均值曲線?
???????這個曲線有什么用呢?很簡單的例子,這里有一個以半年每天為單位的數(shù)據(jù)繪制的曲線,我們想看看以月為單位數(shù)據(jù)
???????的變化,這時就可以用到它了。?
????????TimeSeries?timeseries?=?createEURTimeSeries();??//就是以半年每天為單位的數(shù)據(jù)
????????TimeSeries?timeseries1?=?MovingAverage.createMovingAverage(timeseries,?
???????????????????????????????????????????????????????????????????"30?day?moving?average",?
???????????????????????????????????????????????????????????????????30,?//30天為一個周期
???????????????????????????????????????????????????????????????????30);?//最開始的30天跳過
????????TimeSeriesCollection?timeseriescollection?=?new?TimeSeriesCollection();
????????timeseriescollection.addSeries(timeseries);
????????timeseriescollection.addSeries(timeseries1);
????????return?timeseriescollection;?
?????
六、總結(jié)一下
???????????????????????????dataset??????????????????????????plot????????????????????renderer???????????????????????
??餅圖???????????PieDataset(DefaultPieDataset)???????????PiePlot????????????????????------
??柱狀圖????CatagoryDataset(DefaultCategoryDataset)????CategoryPlot????????????????BarRenderer
??折線圖????CatagoryDataset(DefaultCategoryDataset)????CategoryPlot??????????????LineAndShapeRenderer
??????????????????XYDataset(XYSeriesCollection)???????????XYPlot????????????????XYLineAndShapeRenderer
??時間序列圖?????XYDataset?(TimeSeriesCollection)?????????XYPlot????????????????XYLineAndShapeRenderer
七、Item?Lable?
???這里以柱狀圖為例說明,具體來說就是在每個柱狀上顯示它的數(shù)據(jù),具體有下面內(nèi)容:
???A、使?Item?Lable?可見
???B、調(diào)整?Item?Lable?的顏色、字體等
???C、調(diào)整?Item?Lable?的位置
???D、定制?Item?Lable?的內(nèi)容
???1、分配一個?Lable?Generator?給?renderer
??????BarRenderer?barrenderer?=?(BarRenderer)categoryplot.getRenderer();
??????GategoryLableGenerator?generator?=new?StandardGategoryLableGenerator(
???????????"{2}",?new?DecimalFormat("0.00")????//調(diào)整顯示的數(shù)字和字符格式
??????);
??????barrenderer.setLableGenerator(generator);
???2、使?Item?Lable?可見
??????barrenderer.setItemLableVisible(true);
???3、調(diào)整?Item?Lable?的顏色、字體等
??????barrenderer.setItemLablePaint(Color.red);
??????barrenderer.setItemLableFont(new?Font("SansSerif",Font.PLAIN,10));
???4、調(diào)整?Item?Lable?的位置
??????這里涉及到一個新的對象?ItemLablePosition?,?ItemLablePosition的構(gòu)造函數(shù)有兩個或四個參數(shù)
??????public?ItemLabelPosition(ItemLabelAnchor?itemLabelAnchor,
?????????????????????????org.jfree.ui.TextAnchor?textAnchor,
?????????????????????????org.jfree.ui.TextAnchor?rotationAnchor,
?????????????????????????double?angle)
??????itemLabelAnchor?-?Item?Lable?的位置?(最重要的?。。?br />??????textAnchor?-?Item?Lable里包含的正文相對于Item?Lable?的位置
??????rotationAnchor?-?Item?Lable里包含的正文旋轉(zhuǎn)的位置
??????angle?-?旋轉(zhuǎn)的角度
??????ItemLabelPosition?itemlabelposition?=?new?ItemLabelPosition(ItemLabelAnchor.INSIDE12,?
??????????????????????????????????????????????????????TextAnchor.CENTER_RIGHT,?
??????????????????????????????????????????????????????TextAnchor.CENTER_RIGHT,?
??????????????????????????????????????????????????????-1.57D);
??????barrenderer.setPositiveItemLabelPosition(itemlabelposition);?
???這樣就可以每個柱狀上顯示它的數(shù)據(jù)了,當(dāng)然可以定制?Item?Lable?的內(nèi)容,比如?Item?Lable?text?超過100的才
???顯示,這樣就需要定制自己的類,它要實(shí)現(xiàn)GategoryLableGenerator?接口,實(shí)現(xiàn)generateItemLable()方法。
???
了解了jFreeChart?,現(xiàn)在要使用cewolf?。具體在web?中如何配置,就不說了。首先也是了解cewolf?工作的流程,然后對
它的標(biāo)簽進(jìn)行說明.
一、cewolf?產(chǎn)生圖形的流程
???創(chuàng)建一個數(shù)據(jù)源(dataset)來包含將要在圖形中顯示的數(shù)據(jù)?????>><cewolf:chart/>標(biāo)簽對圖形進(jìn)行調(diào)整
?????????>><cewolf:img/>標(biāo)簽把圖形輸出
?1、創(chuàng)建一個數(shù)據(jù)源(dataset)
???創(chuàng)建數(shù)據(jù)源基本上和上面一樣,所不同的是?cewolf?對其重新進(jìn)行了包裝,它提供了一個DatasetProducer?接口,你需要
???實(shí)現(xiàn)這一接口,下面是一個例子
??DatasetProducer?timeData?=?new?DatasetProducer()?{
????public?Object?produceDataset(Map?params)?{??//cewolf?對其重新進(jìn)行了包裝
??????TimeSeries?ts?=?new?TimeSeries("Cewolf?Release?Schedule",?Month.class);//怎么樣?和上面一樣吧
??????ts.add(new?Month(7,?2002),?0.1);
??????ts.add(new?Month(8,?2002),?0.4);
??????ts.add(new?Month(9,?2002),?0.9);
??????ts.add(new?Month(10,?2002),?1.0);
??????return?new?TimeSeriesCollection(ts);
????}
????public?String?getProducerId()?{??//返回唯一的ID
??????return?"TimeDataProducer";
????}
????public?boolean?hasExpired(Map?params,?Date?since)?{?//默認(rèn)就好
??????return?false;
????}
??};
??pageContext.setAttribute("timeData",?timeData);?//產(chǎn)生完以后要把它放到頁面中保存以給?cewolf標(biāo)簽調(diào)用
?2、<cewolf:chart/>標(biāo)簽
??<cewolf:chart?id="timeChart"?????//這個id要唯一,給下邊<cewolf:img/>標(biāo)簽引用
????????????????title="TimeSeries"??//圖形的標(biāo)題
????????????????type="timeseries"???//圖形的類型?
????????????????xaxislabel="x-values"????//橫軸?Lable
????????????????yaxislabel="y-values">???//縱軸Lable
????<cewolf:colorpaint?color="#EEEEFF"/>??//圖形的背景色
????<cewolf:data>
????????<cewolf:producer?id="timeData"/>??//引用上面產(chǎn)生的數(shù)據(jù)
????</cewolf:data>
??</cewolf:chart>?
??一些說明:
??關(guān)于圖形的背景色,還有兩個選擇,分別是
????<cewolf:gradientpaint>???//產(chǎn)生色彩傾斜的背景
????????<cewolf:point?x="0"?y="0"?color="#AAAAFFEE"?/>
????????<cewolf:point?x="300"?y="0"?color="#DDDDFF"?/>
????</cewolf:gradientpaint>
??和
????<cewolf:texturepaint?image="/img/bg.jpg"?width="60"?height="60"?/>?//加入背景圖案
?3、<cewolf:img/>標(biāo)簽
???<cewolf:img?chartid="timeChart"???//就是上面那個?id
???????????????renderer="/cewolf"????//這個是必需的!web.xml?中有配置
???????????????width="300"?????????//寬
???????????????height="300"?/>??????//高
???還有一種圖形輸出方式:
??<img?src='<cewolf:imgurl?chartid="foobar"?renderer="/cewolf"?width="100"?height="100"/>'>
??很明顯,這種方式把圖形包含到?Html?的<img/>中
?4、進(jìn)一步調(diào)整
???看到上面的步驟,你可能會認(rèn)為用?cewolf?輸出圖形是如此的簡單,是這樣的,但看了最開始的?jFreeChart?對圖形
???的一些調(diào)整,你會想我如何調(diào)整呢?我不想用默認(rèn)值,我想輸出更復(fù)雜的圖形。很好,我是這樣做的:
???這里要介紹一個新的接口ChartPostProcessor??和一個標(biāo)簽<cewolf:chartpostprocessor/>
???我們要寫自己的類實(shí)現(xiàn)這個ChartPostProcessor?接口,然后再用標(biāo)簽<cewolf:chartpostprocessor/>調(diào)用我們所寫
???的類
??ChartPostProcessor?dataColor?=?new?ChartPostProcessor()?{
????public?void?processChart(Object?chart,?Map?params)?{??//這個接口就這一個方法
??????CategoryPlot?plot?=?(CategoryPlot)?((JFreeChart)?chart).getPlot();?//看到了什么???。Γ@得了plot!
?????????????????????????????????????????????????????????????????下面就可以通過plot?對圖形進(jìn)行調(diào)整??!??????????
??????plot.setAxisOffset(new?RectangleInsets(5D,?5D,?5D,?5D));??//一個實(shí)驗,坐標(biāo)軸與圖分離
??????for?(int?i?=?0;?i?<?params.size();?i++)?{???//這里的params?是通過標(biāo)簽<cewolf:chartpostprocessor/>輸入的!
????????String?colorStr?=?(String)?params.get(String.valueOf(i));
????????plot.getRenderer().setSeriesPaint(i,?java.awt.Color.decode(colorStr));//看到?renderer了吧,又可以大
????????????????????????????????????????????????????????????????????????????????干一場了,嘿嘿!
??????}
????}
??};
??pageContext.setAttribute("dataColor",?dataColor);?//記得要放起來噢
??具體引用:
<cewolf:chart?id="stackedHorizontalBar"?title="StackedHorizontalBar"?
??????????????type="stackedHorizontalBar"?xaxislabel="Fruit"?yaxislabel="favorite">
????<cewolf:data>
????????<cewolf:producer?id="categoryData"?/>
????</cewolf:data>
????<cewolf:chartpostprocessor?id="dataColor">???//在這里?。?br />????????<cewolf:param?name="0"?value='<%=?"#FFFFAA"?%>'/>
????????<cewolf:param?name="1"?value='<%=?"#AAFFAA"?%>'/>
????????<cewolf:param?name="2"?value='<%=?"#FFAAFF"?%>'/>
????????<cewolf:param?name="3"?value='<%=?"#FFAAAA"?%>'/>
????</cewolf:chartpostprocessor>
</cewolf:chart>??
?我們當(dāng)然也可以在實(shí)現(xiàn)ChartPostProcessor?接口的類里把一切都做好,然后這么用:
????<cewolf:chartpostprocessor?id="dataColor"/>???