天天看點

JFreeChart 好文收集

JFreeChart中柱狀圖的詳細設定

柱狀圖: bar charts (regular and stacked, with an optional 3D effect),用到的主要類如下:

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

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

 org.jfree.chart.plot.CategoryPlot:圖表區域對象,基本上這個對象決定着什麼樣式的圖表,建立該對象的時候需要Axis、Renderer以及資料集對象的支援

 org.jfree.chart.axis.CategoryAxis:用于處理圖表的兩個軸:縱軸和橫軸

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

 org.jfree.chart.urls.CategoryURLGenerator:用于生成Web圖表中每個項目的滑鼠點選連結

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

 org.jfree.chart.axis.ValueAxis:用于處理圖表中的柱

14:35  |   永久連結  |   浏覽 (715)  |   評論 (1)  |    收藏  |   jfreechart  |  
永久連結
http://laiseeme.iteye.com/blog/105767
評論    共 1 條 發表評論

laiseeme     2007-07-26 14:36

代碼
  1. package org.jfree.demo;   
  2. import java.io.*;   
  3. import org.jfree.data.*;   
  4. import org.jfree.chart.*;   
  5. import org.jfree.chart.plot.*;   
  6. import org.jfree.data.category.*;   
  7. import java.awt.Color;   
  8. import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;   
  9. import java.awt.Font;   
  10. import org.jfree.chart.axis.AxisLocation;   
  11. import java.awt.event.WindowAdapter;   
  12. import java.awt.event.WindowEvent;   
  13. import java.awt.Toolkit;   
  14. import java.awt.Dimension;   
  15. public class BarChartDemo {   
  16.   public BarChartDemo() {   
  17.     super();   
  18.   }   
  19.   public static void main(String[] args) throws IOException{   
  20.           CategoryDataset dataset = getDataSet();   
  21.           JFreeChart chart = ChartFactory.createBarChart3D(   
  22.                                                   "招生資訊總覽", // 圖表标題   
  23.                                                   "應報與實報對照", // 目錄軸的顯示标簽   
  24.                                                   "人數", // 數值軸的顯示标簽   
  25.                                                   dataset, // 資料集   
  26.                                                   PlotOrientation.VERTICAL, // 圖表方向:水準、垂直   
  27.                                                   true,  // 是否顯示圖例(對于簡單的柱狀圖必須是false)   
  28.                                                   true,  // 是否生成工具   
  29.                                                   true  // 是否生成URL連結   
  30.                                                   );   
  31.           CategoryPlot plot = chart.getCategoryPlot();//獲得圖表區域對象   
  32.           //設定圖表的縱軸和橫軸org.jfree.chart.axis.CategoryAxis   
  33.           org.jfree.chart.axis.CategoryAxis domainAxis = plot.getDomainAxis();   
  34.           domainAxis.setLowerMargin(0.1);//設定距離圖檔左端距離此時為10%   
  35.           domainAxis.setUpperMargin(0.1);//設定距離圖檔右端距離此時為百分之10   
  36.           domainAxis.setCategoryLabelPositionOffset(10);//圖表橫軸與标簽的距離(10像素)   
  37.           domainAxis.setCategoryMargin(0.2);//橫軸标簽之間的距離20%   
  38.           //domainAxis.setMaximumCategoryLabelLines(1);   
  39.           //domainAxis.setMaximumCategoryLabelWidthRatio(0);   
  40.           //設定柱子的屬性   
  41.           org.jfree.chart.axis.ValueAxis rangeAxis = plot.getRangeAxis();   
  42.           rangeAxis.setUpperMargin(0.1);//設定最高的一個柱與圖檔頂端的距離(最高柱的10%)   
  43.           //設定圖表的顔色   
  44.           org.jfree.chart.renderer.category.BarRenderer3D renderer;   
  45.           renderer = new org.jfree.chart.renderer.category.BarRenderer3D();   
  46.           renderer.setBaseOutlinePaint(Color.red);   
  47.           renderer.setSeriesPaint(0, new Color(0, 255, 255));//計劃柱子的顔色為青色   
  48.           renderer.setSeriesOutlinePaint(0,Color.BLACK);//邊框為黑色   
  49.           renderer.setSeriesPaint(1, new Color(0, 255, 0));//實報柱子的顔色為綠色   
  50.           renderer.setSeriesOutlinePaint(1,Color.red);//邊框為紅色   
  51.           renderer.setItemMargin(0.1);//組内柱子間隔為組寬的10%   
  52.           //顯示每個柱的數值,并修改該數值的字型屬性   
  53.           renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());   
  54.           renderer.setItemLabelFont(new Font("黑體",Font.BOLD,12));//12号黑體加粗   
  55.           renderer.setItemLabelPaint(Color.black);//字型為黑色   
  56.           renderer.setItemLabelsVisible(true);   
  57.           plot.setRenderer(renderer);//使用我們設計的效果   
  58.           //設定縱橫坐标的顯示位置   
  59.           plot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_LEFT);//學校顯示在下端(柱子豎直)或左側(柱子水準)   
  60.           plot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_LEFT); //人數顯示在下端(柱子水準)或左側(柱子豎直)   
  61.           try {   
  62.             File file = new File("c:/student.png");   
  63.             ChartUtilities.saveChartAsPNG(file,chart,400,300);//把報表儲存為檔案   
  64.           }catch (Exception e) {   
  65.                     String s = e.getLocalizedMessage();   
  66.                     s = e.getMessage();   
  67.                     s = e.toString();   
  68.           }   
  69.       //将生成的報表放到預覽視窗中   
  70.       final ChartFrame preview = new ChartFrame("招生資訊",chart);   
  71.        preview.addWindowListener(new WindowAdapter() {   
  72.          public void windowClosing(final WindowEvent event) {   
  73.            preview.dispose();   
  74.          }   
  75.        });   
  76.        preview.pack();   
  77.        //調整預覽視窗的大小和位置,适合螢幕,并且居中   
  78.        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();   
  79.        preview.setSize(screenSize.width,screenSize.height-50);//适合螢幕,50表示把工具欄要考慮在内   
  80.        Dimension frameSize = preview.getSize();   
  81.        if (frameSize.height > screenSize.height) {   
  82.          frameSize.height = screenSize.height;   
  83.        }   
  84.        if (frameSize.width > screenSize.width) {   
  85.          frameSize.width = screenSize.width;   
  86.        }   
  87.        preview.setLocation( (screenSize.width - frameSize.width) / 2,   
  88.                   (screenSize.height - frameSize.height-50) / 2);   
  89.        //顯示報表預覽視窗   
  90.        preview.setVisible(true);   
  91.   }   
  92.   private static CategoryDataset getDataSet() {   
  93.           DefaultCategoryDataset dataset = new DefaultCategoryDataset();   
  94.           dataset.addValue(200, "計劃", "清華大學");   
  95.           dataset.addValue(400, "實報", "清華大學");   
  96.           dataset.addValue(100, "計劃", "天津大學");   
  97.           dataset.addValue(205, "實報", "天津大學");   
  98.           dataset.addValue(200, "計劃", "鄭州大學");   
  99.           dataset.addValue(285, "實報", "鄭州大學");   
  100.           return dataset;   
  101.   }   
  102. }    

JfreeChart學習總結

關鍵字:   JfreeChart    

自己最近學習了JfreeChart的使用,覺得這個冬冬的功能非常強大,總結一下。主要介紹JfreeChart生成圖檔的幾種方式

先從網上找點介紹。

一、簡介

WW 的發展使得基于網際網路的應用程式不再局限于靜态或者簡單的動态内容提供。傳統的一些以軟體包形式釋出應用程式例如報表系統等都在逐漸搬到網際網路上。但是這兩者之間有着天壤之别,雖然對于資料擷取、業務處理等方面基本類似,但是最大的差别在于使用者界面。為了能在web浏覽器上顯示要求使用者界面使用 HTML以及圖檔的方式來展現資料,而傳統的一些利用作業系統本身的控件來開發的使用者界面無法适應琳琅滿目的用戶端,是以在這裡也變得無能為力。回到本文的題目上來,為了建立一個可以在web浏覽器上檢視到圖表一般有兩種做法:第一種就是使用applet利用java本身對圖形的支援來顯示一個圖表;第二 種就是直接在web伺服器端生成好圖表圖檔檔案後發送給浏覽器。第一種方式顯然對于用戶端要求太高,随着現在主流浏覽器放棄對JAVA的支援後,這種方式 隻适合一些區域網路的應用,而對于網際網路的環境就顯得不太适合。是以我們下面将介紹一個JAVA的圖表引擎JFreeChart用來産生基于WEB的圖表。

JFreeChart 項目簡介 JFreeChart是開放源代碼站點SourceForge.net上的一個JAVA項目,它主要用來各種各樣的圖表,這些圖表包括:餅圖、柱狀圖(普 通柱狀圖以及堆棧柱狀圖)、線圖、區域圖、分布圖、混合圖、甘特圖以及一些儀表盤等等。這些不同式樣的圖表基本上可以滿足目前的要求。

二、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-1.0.1.zip為例子進行說明。

三、JFreeChart配置安裝

1 、解壓jfreechart-1.0.1.zip.zip到指定位置,其中source是jfreechart的源碼,jfreechart-1.0.1-demo.jar 是例子程式,可以先運作一下看看各種效果,就知道他的nb之處了。

2 、為了配置成功,我們需要關注的檔案有如下三個:

設定classpath。加入下面三個jar包。

jfreechart-1.0.1.jar 、jcommon-1.0.0.jar、gnujaxp.jar

加上第三個jar包有時web.xml會報錯,把它去掉就好了。

至此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可以滿足大部分圖檔建立的需要,美中不足的是:對字型的設定做的不夠好,特别是使用中文的時候字型很不清晰。因為這個原因建議你自己去修改他的源代碼,最好使用properties檔案去設定字型.還有就是文檔要錢是以要多花點時間去看源代碼。或多上社群.

五.開始開發

對JfreeChart有了初步了解并做好準備工作之後,開始作例子程式試驗。在這裡我隻介紹餅圖的做法,而這張圖采用不同的方式進行輸出,其他類型的圖檔可以參考jfreechart提供的例子,做法都差不多。

1) 直接生成圖檔

代碼

  1. public class PieChartPicture {   
  2. public static void main(String[] args)    
  3. {   
  4.  PieDataset dataset = getDataSet();   
  5.  JFreeChart chart = ChartFactory.createPieChart3D(   
  6.     " 項目進度分布", // chart title   
  7.     dataset,// data   
  8.     true,// include legend   
  9.     true,   
  10.     false  
  11.    );   
  12.   PiePlot3D  plot=(PiePlot3D)chart.getPlot();   
  13.     // 圖檔中顯示百分比:預設方式   
  14.     //plot.setLabelGenerator(new           StandardPieSectionLabelGenerator(StandardPieToolTipGenerator.DEFAULT_TOOLTIP_FORMAT));   
  15. // 圖檔中顯示百分比:自定義方式,{0} 表示選項, {1} 表示數值, {2} 表示所占比例 ,小數點後兩位   
  16.  plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})", NumberFormat.getNumberInstance(), new DecimalFormat("0.00%")));    
  17. // 圖例顯示百分比:自定義方式, {0} 表示選項, {1} 表示數值, {2} 表示所占比例                   
  18.  plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator("{0}={1}({2})"));    
  19. // 設定背景色為白色    
  20. chart.setBackgroundPaint(Color.white);    
  21. // 指定圖檔的透明度(0.0-1.0)    
  22.  plot.setForegroundAlpha(1.0f);    
  23. // 指定顯示的餅圖上圓形(false)還橢圓形(true)    
  24. plot.setCircular(true);    
  25. // 設定圖示題的字型    
  26. Font font = new Font(" 黑體",Font.CENTER_BASELINE,20);    
  27. TextTitle title = new TextTitle(" 項目狀态分布");    
  28. title.setFont(font);     
  29. chart.setTitle(title);    
  30. FileOutputStream fos_jpg = null;    
  31. try {    
  32.      fos_jpg=new FileOutputStream("D:\\ 項目狀态分布.jpg");    
  33.      ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,640,480,null);    
  34.      fos_jpg.close();    
  35. } catch (Exception e) {    
  36.  }    
  37. }    
  38. private static PieDataset getDataSet() {    
  39. DefaultPieDataset dataset = new DefaultPieDataset();    
  40. dataset.setValue(" 市場前期", new Double(10));    
  41. dataset.setValue(" 立項", new Double(15));    
  42. dataset.setValue(" 計劃", new Double(10));    
  43. dataset.setValue(" 需求與設計", new Double(10));    
  44. dataset.setValue(" 執行控制", new Double(35));    
  45. dataset.setValue(" 收尾", new Double(10));    
  46. dataset.setValue(" 運維",new Double(10));    
  47. return dataset;           
  48. }   
  49. }   

<script>render_code();</script>

2) 采用servlet和struts的action方式輸出

采用這種方式輸出,不用生成圖檔。

A .servlet輸出

代碼

  1. public class PieByServlet extends HttpServlet{    
  2. public void service(ServletRequest req, ServletResponse res)    
  3. throws ServletException, IOException    
  4. {    
  5.    res.setContentType("image/jpeg");    
  6.    PieDataset dataset = getDataSet();    
  7.    JFreeChart chart = ChartFactory.createPieChart3D(    
  8.    " 水果餅圖", // chart title    
  9.    dataset,// data    
  10.    true, // include legend    
  11.    true,    
  12.    false );    
  13.    //設定圖表屬性   
  14. // 輸出圖檔    
  15.  ChartUtilities.writeChartAsJPEG(res.getOutputStream(),100,chart,800,600,null);    
  16. }   

<script>render_code();</script>

B .struts的action方式輸出

隻将這條語句加上try catch即可,并傳回null。

代碼

  1. try{          
  2. ChartUtilities.writeChartAsJPEG(response.getOutputStream(),100,chart,800,600,null);    
  3.  } catch (Exception e) {    
  4. }   
  5. return null;   

<script>render_code();</script>

其實采用這兩種方式與生成圖檔的方式改動并不大

加上語句response.setContentType("image/jpeg");

ChartUtilities.writeChartAsJPEG(new FileOutputStream("D:\\ 項目狀态分布.jpg");,100,chart,640,480,null);

檔案流改成response的輸出流就可以了

hartUtilities.writeChartAsJPEG(response.getOutputStream(),100,chart,800,600,null);

3)jsp+servlet+javabean方式

1. Create ChartViewer servlet

代碼

  1. public class ChartViewer extends HttpServlet {    
  2. public void init() throws ServletException {   
  3. }    
  4. //Process the HTTP Get request   
  5. public void doGet(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {    
  6. // get the chart from session   
  7. HttpSession session = request.getSession();    
  8. BufferedImage chartImage = (BufferedImage) session.getAttribute("chartImage");    
  9. // set the content type so the browser can see this as a picture    
  10. response.setContentType("image/png");    
  11. // send the picture    
  12. PngEncoder encoder = new PngEncoder(chartImage, false, 0, 9);    
  13. response.getOutputStream().write(encoder.pngEncode());   
  14. }    
  15. //Process the HTTP Post request    
  16. public void doPost(HttpServletRequest request, HttpServletResponse response)  throws ServletException, IOException {    

繼續閱讀