JFreeChart 詳解

nym2 12年前發布 | 2K 次閱讀 5.2.1版本發布

一、JFreeChart獲取。
         JFreeChart是JFreeChart公司在開源網站SourceForge.net上的一個項目,該公司的主要產品有如下:
         1、JFreeReport:報表解決工具
         2、JFreeChart:Java圖形解決方案(Application/Applet/Servlet/Jsp)
         3、JCommon:JFreeReport和JFreeChart的公共類庫
         4、JFreeDesigner:JFreeReport的報表設計工具


     我們可以從jfree官方網站上獲取最新版本和相關資料(但是jfree的document需要40美金才能獲取),
     獲取地址: http://www.jfree.org/jfreechart/index.html(同時可以獲得簡明介紹)
     我們以當前最新版本:jfreechart_0.9.21.zip為例子進行說明。


二、JFreeChart配置安裝
     1、解壓jfreechart_0.9.21.zip到指定位置,其中source是jfreechart的源碼,jfreechart-0.9.21-demo.jar
        是例子程序(該部分留給大家自己去研究)
     2、為了配置成功,我們需要關注的文件有如下三個:jfreechart-0.9.21.jar、lib\jcommon-0.9.6.jar、
        lib\gnujaxp.jar
     3、如果是Application開發,把上述三個文件拷貝到%JAVA_HOME%\LIB中,同時在環境變量CLASSPATH中加入
        如果是WEB開發,以TOMCAT中的一個WEB項目TEST為例子說明:
        把上述三個文件拷貝到TEST\WEB-INF\LIB中,然后修改TEST\WEB-INF\web.xml文件,在其中加入如下代碼:
                
                    DisplayChart
                    org.jfree.chart.servlet.DisplayChart
                
                
                    DisplayChart
                    /servlet/DisplayChart
                
                至此jfreechart的配置就完成了,下面就可以進行jfreechart的開發了。這里值得提出的是jfreechart的類
        結構設計前后兼容性不是很好,不同版本的jfreechart中類庫結構可能不一樣,有時候可能需要查源碼。如果
        是中文顯示的時候可能依據觀感需要改變源碼的字體,不過我個人覺得這個版本比以前版本要好一些。


三、JFreeChart功能介紹
     JFreeChart目前是最好的java圖形解決方案,基本能夠解決目前的圖形方面的需求,主要包括如下幾個方面: 
     pie charts (2D and 3D):餅圖(平面和立體) 
     bar charts (regular and stacked, with an optional 3D effect):柱狀圖 
     line and area charts:曲線圖 
     scatter plots and bubble charts 
     time series, high/low/open/close charts and candle stick charts:時序圖 
     combination charts:復合圖 
     Pareto charts 
     Gantt charts:甘特圖 
     wind plots, meter charts and symbol charts 
     wafer map charts 
     (態圖表,餅圖(二維和三維) , 柱狀圖 (水平,垂直),線圖,點圖,時間變化圖,甘特圖, 股票行情圖,混和圖, 溫度計圖, 刻度圖等常用商用圖表) 
     圖形可以導出成PNG和JPEG格式,同時還可以與PDF和EXCEL關聯

 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:用于生成圖象的幫助提示,不同類型圖表對應不同類型的工具提示類 

四、jFreeChart產生圖形的流程 創建一個數據源(dataset)來包含將要在圖形中顯示的數據 創建一個 JFreeChart 對象來代表要顯示的圖形 把圖形輸出 重要的類和接口: org.jfree.data.general.Dataset 所有數據源類都要實現的接口 org.jfree.chart.ChartFactory 由它來產生 JFreeChart 對象 org.jfree.chart.JFreeChart 所有對圖形的調整都是通過它噢!! org.jfree.chart.plot.Plot 通過JFreeChart 對象獲得它,然后再通過它對圖形外部部分(例:坐標軸)調整 注意:它有很多子類,一般都下嗍造型到它的子類! org.jfree.chart.renderer.AbstractRenderer 通過JFreeChart 對象獲得它,然后再通過它對圖形內部部分 (例:折線的類型)調整。同樣,針對不同類型的報表圖,它有 著不同的子類實現!在下面我們簡稱它為 Renderer 下面我們結合不同類型的圖形來具體分析這個流程。

五、餅圖 餅圖的dataset 一般是用PieDataset 接口,具體實現類是 DefaultPieDataset 1、創建一個數據源(dataset): private static PieDataset createDataset() { DefaultPieDataset defaultpiedataset = new DefaultPieDataset(); //注意是DefaultPieDataset!! 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 產生 JFreeChart 對象 private static JFreeChart createChart(PieDataset piedataset) { JFreeChart jfreechart = ChartFactory.createPieChart(”Pie Chart Demo 1″, //圖形標題名稱 piedataset, // dataset true, // legend? true, // tooltips? false); //URLs? PiePlot pieplot = (PiePlot)jfreechart.getPlot(); //通過JFreeChart 對象獲得 plot:PiePlot!! pieplot.setNoDataMessage(”No data available”); // 沒有數據的時候顯示的內容 return jfreechart; } 一些重要的方法: pieplot.setExplodePercent(0,0.3D) //把Lable 為”One” 的那一塊”挖”出來30% 3、輸出略

六、柱狀圖 柱狀圖的dataset 一般是用CatagoryDataset接口(具體實現類是DefaultCategoryDataset),也會用 IntervalXYDataset 接口 1、創建一個數據源(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 產生 JFreeChart 對象 private static JFreeChart createChart(CategoryDataset categorydataset) { JFreeChart jfreechart = ChartFactory.createBarChart( "Bar Chart Demo", //圖形標題名稱 "Category",//domain 軸 Lable這里先簡單理解為橫坐標Lable好了 "Value", //range 軸 Lable這里也先簡單理解為縱坐標Lable好了 categorydataset, // dataset PlotOrientation.VERTICAL, //垂直顯示 true, // legend? true, // tooltips? false); //URLs? jfreechart.setBackgroundPaint(Color.white); //設定背景色為白色 CategoryPlot categoryplot = jfreechart.getCategoryPlot(); //獲得 plot:CategoryPlot!! categoryplot.setBackgroundPaint(Color.lightGray); //設定圖表數據顯示部分背景色 categoryplot.setDomainGridlinePaint(Color.white); //橫坐標網格線白色 categoryplot.setDomainGridlinesVisible(true); //可見 categoryplot.setRangeGridlinePaint(Color.white); //縱坐標網格線白色 //設置series1與category的顯示位置;類似效果圖http://www.chinabs.net/webimages/PieChart7.png categoryplot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT); categoryplot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);

//使縱坐標的最小單位格為整數 NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis(); numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer(); //獲得renderer 注意這里是下嗍造型到BarRenderer!! //顯示每個柱的數值,并修改該數值的字體屬性;類似效果圖http://www.chinabs.net/webimages/PieChart6.png barrenderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator()); barrenderer.setItemLabelFont(new Font("黑體",Font.PLAIN,12)); barrenderer.setItemLabelsVisible(true);

barrenderer.setDrawBarOutline(false); // Bar的外輪廓線不畫 GradientPaint gradientpaint = new GradientPaint(0.0F, 0.0F, Color.blue,0.0F, 0.0F, new Color(0, 0, 64)); //設定特定顏色 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設定上面定義的顏色 barrenderer.setSeriesPaint(1, gradientpaint1); //給series2 Bar 設定上面定義的顏色 barrenderer.setSeriesPaint(2, gradientpaint2); //給series3 Bar 設定上面定義的顏色 CategoryAxis categoryaxis = categoryplot.getDomainAxis(); //橫軸上的 Lable 45度傾斜 categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45); return jfreechart; } 一些重要的方法:(增加一塊標記) 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接口(具體實現類是DefaultCategoryDataset),XYDataset 接口 1、CatagoryDataset接口: A、創建一個數據源(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 產生 JFreeChart 對象 (與上面重復的部分就不再注釋) 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!! LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)categoryplot.getRenderer(); lineandshaperenderer.setShapesVisible(true); //series 點(即數據點)可見 lineandshaperenderer.setSeriesStroke(0, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] { 10F, 6F }, 0.0F)); //定義series為”First”的(即series1)點之間的連線 ,這里是虛線,默認是直線 lineandshaperenderer.setSeriesStroke(1, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] { 6F, 6F }, 0.0F)); //定義series為”Second”的(即series2)點之間的連線 lineandshaperenderer.setSeriesStroke(2, new BasicStroke(2.0F, 1, 1, 1.0F, new float[] { 2.0F, 6F }, 0.0F)); //定義series為”Third”的(即series3)點之間的連線 return jfreechart; } 一些重要的方法: lineandshaperenderer.setLineVisible(true) //series 點(即數據點)間有連線可見 2、XYDataset 接口: A、創建一個數據源(dataset): private static XYDataset createDataset() { XYSeries xyseries = new XYSeries(”First”); //先產生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 產生 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); //設定圖表數據顯示部分背景色 xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D)); //設定坐標軸與圖表數據顯示部分距離 xyplot.setDomainGridlinePaint(Color.white); //網格線顏色 xyplot.setRangeGridlinePaint(Color.white); //獲得 renderer 注意這里是XYLineAndShapeRenderer !! XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer(); xylineandshaperenderer.setShapesVisible(true); //數據點可見 xylineandshaperenderer.setShapesFilled(true); //數據點被填充即不是空心點 NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis(); numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); return jfreechart; } 一些重要的方法: XYLineAndShapeRenderer xylineandshaperenderer = new XYLineAndShapeRenderer(); xylineandshaperenderer.setSeriesLinesVisible(0, false); //第一個XYSeries數據點間連線不可見 xylineandshaperenderer.setSeriesShapesVisible(1, false); //第二個XYSeries數據點不可見 xyplot.setRenderer(xylineandshaperenderer);

八、時間序列圖 時間序列圖和折線圖很相似,不同的是它在 domain軸的數據是時間而不是數字。 時間序列圖的dataset 是 XYDataset 接口,具體實現類是TimeSeriesCollection ,和上面類似,有TimeSeries 對象,它被添加入 TimeSeriesCollection 。 1、創建一個數據源(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軸上的刻度點代表的是時間點而不是時間段 return timeseriescollection; } 2、由ChartFactory 產生 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); //數據點可見 xylineandshaperenderer.setDefaultShapesFilled(true); //數據點是實心點 } DateAxis dateaxis = (DateAxis)xyplot.getDomainAxis(); //對domain 軸上日期顯示格式定義 dateaxis.setDateFormatOverride(new SimpleDateFormat(”MMM-yyyy”)); return jfreechart; } 一些重要的方法: A、增加標記線: xyplot.addRangeMarker(new ValueMarker(550D)); //數值軸 Quarter quarter = new Quarter(2, 2002); xyplot.addDomainMarker(new ValueMarker(quarter.getMiddleMillisecond())); //時間軸 B、數據點的調整 XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyplot.getRenderer(); xylineandshaperenderer.setDefaultShapesVisible(true); //數據點可見 xylineandshaperenderer.setSeriesFillPaint(0, Color.red); //數據點填充為紅色 xylineandshaperenderer.setSeriesFillPaint(1, Color.white); //數據點填充為白色 xylineandshaperenderer.setUseFillPaint(true); //應用 C、平均值曲線 這個曲線有什么用呢?很簡單的例子,這里有一個以半年每天為單位的數據繪制的曲線,我們想看看以月為單位數據 的變化,這時就可以用到它了。 TimeSeries timeseries = createEURTimeSeries(); //就是以半年每天為單位的數據 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;

九、總結一下 dataset plot renderer 餅圖 PieDataset(DefaultPieDataset) PiePlot —— 柱狀圖 CatagoryDataset(DefaultCategoryDataset) CategoryPlot BarRenderer 折線圖 CatagoryDataset(DefaultCategoryDataset) CategoryPlot LineAndShapeRenderer XYDataset(XYSeriesCollection) XYPlot XYLineAndShapeRenderer 時間序列圖 XYDataset (TimeSeriesCollection) XYPlot XYLineAndShapeRenderer 這里只是一些常用的方法,具體還是看API 十、Item Lable 這里以柱狀圖為例說明,具體來說就是在每個柱狀上顯示它的數據,具體有下面內容: A、使 Item Lable 可見 B、調整 Item Lable 的顏色、字體等 C、調整 Item Lable 的位置 D、定制 Item Lable 的內容 1、分配一個 Lable Generator 給 renderer BarRenderer barrenderer = (BarRenderer)categoryplot.getRenderer(); GategoryLableGenerator generator =new StandardGategoryLableGenerator( “{2}”, new DecimalFormat(”0.00″) //調整顯示的數字和字符格式 ); barrenderer.setLableGenerator(generator); 2、使 Item Lable 可見 barrenderer.setItemLableVisible(true); 3、調整 Item Lable 的顏色、字體等 barrenderer.setItemLablePaint(Color.red); barrenderer.setItemLableFont(new Font(”SansSerif”,Font.PLAIN,10)); 4、調整 Item Lable 的位置 這里涉及到一個新的對象 ItemLablePosition , ItemLablePosition的構造函數有兩個或四個參數 public ItemLabelPosition(ItemLabelAnchor itemLabelAnchor, org.jfree.ui.TextAnchor textAnchor, org.jfree.ui.TextAnchor rotationAnchor, double angle) itemLabelAnchor - Item Lable 的位置 (最重要的!!) textAnchor - Item Lable里包含的正文相對于Item Lable 的位置 rotationAnchor - Item Lable里包含的正文旋轉的位置 angle - 旋轉的角度 ItemLabelPosition itemlabelposition = new ItemLabelPosition(ItemLabelAnchor.INSIDE12, TextAnchor.CENTER_RIGHT, TextAnchor.CENTER_RIGHT, -1.57D); barrenderer.setPositiveItemLabelPosition(itemlabelposition); 這樣就可以每個柱狀上顯示它的數據了,當然可以定制 Item Lable 的內容,比如 Item Lable text 超過100的才顯示,這樣就需要定制自己的類,它要實現GategoryLableGenerator 接口,實現generateItemLable()方法

其他說明: //設置Legend的位置 //((JFreeChart) chart).getLegend().setPosition(RectangleEdge.RIGHT); //設置最高的一個 Item 與圖片頂端的距離 plot.getRangeAxis().setUpperMargin(0.15); //設置最低的一個 Item 與圖片底端的距離 plot.getRangeAxis().setLowerMargin(0.15); //坐標軸字體 plot.getDomainAxis().setLabelFont(new Font("宋體", Font.PLAIN, 12)); //橫軸每個分類的字體 plot.getDomainAxis().setTickLabelFont(new Font("宋體", Font.BOLD, 12)); if(labelPositionsUP_45) plot.getDomainAxis().setCategoryLabelPositions(CategoryLabelPositions.UP_45); //柱圖列寬度((BarRenderer) plot.getRenderer()).setMaximumBarWidth(barWidth);</pre>

2

我想用jfreechart做一個折線圖,要求橫軸是日1期,豎軸是數量。橫軸日期為每個月的所有天數。如1月是1-31日,則頁面上是31個點的折線圖。根據每個月天數不同橫軸坐標有不同的天數,問怎樣實現?有樣例代碼也可以。謝謝了。

你的折線圖只有一條線?線上有31個點?

給你一個例子,參考著改改就行了。jfc_0.9

package org.jfree.chart.demo;

import java.awt.BasicStroke; import java.awt.Color; import java.awt.Polygon; import java.awt.Shape; import java.awt.geom.Rectangle2D;

import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.DefaultDrawingSupplier; import org.jfree.chart.plot.DrawingSupplier; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.renderer.category.LineAndShapeRenderer; import org.jfree.data.category.CategoryDataset; import org.jfree.data.category.DefaultCategoryDataset; 字串4

import org.jfree.ui.ApplicationFrame; import org.jfree.ui.RefineryUtilities;

/**

  • A line chart demo showing the use of a custom drawing supplier. / public class LineChartDemo5 extends ApplicationFrame {

/**

  • Creates a new demo. *
  • @param title the frame title. */ public LineChartDemo5(final String title) { super(title); final CategoryDataset dataset = createDataset(); final JFreeChart chart = createChart(dataset); final ChartPanel chartPanel = new ChartPanel(chart); chartPanel.setPreferredSize(new java.awt.Dimension(500, 270)); setContentPane(chartPanel);

}

/**

  • Creates a sample dataset.
  • @return a sample dataset. */ private CategoryDataset createDataset() {

// row keys... final String series1 = "First"; final String series2 = "Second"; 字串4

final String series3 = "Third";

// column keys... final String type1 = "Type 1"; final String type2 = "Type 2"; final String type3 = "Type 3"; final String type4 = "Type 4"; final String type5 = "Type 5"; final String type6 = "Type 6"; final String type7 = "Type 7"; final String type8 = "Type 8";

// create the dataset... final DefaultCategoryDataset dataset = new DefaultCategoryDataset();

dataset.addValue(1.0, series1, type1); dataset.addValue(4.0, series1, type2); dataset.addValue(3.0, series1, type3); dataset.addValue(5.0, series1, type4); dataset.addValue(5.0, series1, type5); dataset.addValue(7.0, series1, type6); dataset.addValue(7.0, series1, type7); dataset.addValue(8.0, series1, type8); 字串5

dataset.addValue(5.0, series2, type1); dataset.addValue(7.0, series2, type2); dataset.addValue(6.0, series2, type3); dataset.addValue(8.0, series2, type4); dataset.addValue(4.0, series2, type5); dataset.addValue(4.0, series2, type6); dataset.addValue(2.0, series2, type7); dataset.addValue(1.0, series2, type8);

dataset.addValue(4.0, series3, type1); dataset.addValue(3.0, series3, type2); dataset.addValue(2.0, series3, type3); dataset.addValue(3.0, series3, type4); dataset.addValue(6.0, series3, type5); dataset.addValue(3.0, series3, type6); dataset.addValue(4.0, series3, type7); dataset.addValue(3.0, series3, type8);

return dataset;

}

/**

  • Creates a sample chart.
  • @param dataset the dataset.
  • @return a chart. 字串2 */ private JFreeChart createChart(final CategoryDataset dataset) {

final JFreeChart chart = ChartFactory.createLineChart( "Line Chart Demo 5", // chart title "Type", // domain axis label "Value", // range axis label dataset, // data PlotOrientation.VERTICAL, // orientation true, // include legend true, // tooltips false // urls );

// final StandardLegend legend = (StandardLegend) chart.getLegend(); // legend.setDisplaySeriesShapes(true);

final Shape[] shapes = new Shape[3]; int[] xpoints; int[] ypoints;

// right-pointing triangle 3 /**

  • 獲取一個演示用的組合數據集對象 (時間曲線圖)
  • @return */ private static XYDataset createDataset() {

     TimePeriodValues   timeseries1   =   new   TimePeriodValues("Chart   Title");   
    
     //這地方可以使用循環,把x軸,y軸   的值   輔給timeseries1 
     TimePeriodValuesCollection   timeseriescollection   =   new   TimePeriodValuesCollection();   
     for(int i =1;i<10;i++)
     {
      Minute   min   = new Minute(new Date());
      timeseries1.add(min,   i);   
    timeseriescollection.addSeries(timeseries1);   
   }
   return   timeseriescollection;   

} </pre>

 本文由用戶 nym2 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!