轉自:http://blog.csdn.net/crazy1235/article/details/8535999
介紹:
JFreeChart是JAVA平臺上的一個開放的圖表繪製類庫。它完全使用JAVA語言編寫,是爲applications, applets, servlets 以及JSP等使用所設計。JFreeChart可生成餅圖(pie charts)、柱狀圖(bar charts)、散點圖(scatter plots)、時序圖(time series)、甘特圖(Gantt charts)等等多種圖表,並且可以產生PNG和JPEG格式的輸出,還可以與PDF和EXCEL關聯。
獲取:
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/index.html
功能介紹:
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 ( 態圖表,餅圖(二維和三維) , 柱狀圖 (
水平,垂直),線圖,點圖,時間變化圖,甘特圖, 股票行情圖,混和圖, 溫度計圖,
刻度圖等常用商用圖表)
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:
用於生成圖象的幫助提示,不同類型圖表對應不同類型的工具提示類
配置安裝:
如圖所示:從官網下載下來工具包之後,解壓之後的結構如圖所示。
lib文件夾中是所需的jar包。source文件夾中是源碼,需要看的話,可以添加到eclipse中查看。
新建一個項目,將jfreechart-1.0.1.jar, jcommon-1.0.0.jar, gunjaxp.jar 這三個包添加到你的項目中就OK了。
代碼編寫:
用JFreeChart生成的各種圖表,可以直接保存成爲本地的一個圖片(.jpeg .png等格式),也可以直接顯示到圖形用戶界面, 還可以顯示在jsp網頁上。下面我只介紹前兩種方法!
大體上分爲一下幾個步驟:
(1)建立Dataset。將你所想要顯示的數據都放到這個庫中。
(2)建立JFreeChart對象。將你的dataset填入到這個對象中。
(3)設置各種JFreeChart的屬性和效果。通過它提供的各種方法和接口設置相關的屬性。
(4)生成圖表,然後按照個人的需求進行執行。
個人感覺這幾個步驟類似於C#中的數據綁定,不知網友們如何看呢?!
先以柱狀圖爲例,下面看代碼:
- package chart.demo02;
- import java.awt.Font;
- import java.awt.RenderingHints;
- import java.io.FileOutputStream;
- import org.jfree.chart.ChartFactory;
- import org.jfree.chart.ChartFrame;
- import org.jfree.chart.ChartUtilities;
- import org.jfree.chart.JFreeChart;
- import org.jfree.chart.axis.CategoryAxis;
- import org.jfree.chart.axis.ValueAxis;
- import org.jfree.chart.plot.CategoryPlot;
- import org.jfree.chart.plot.PlotOrientation;
- import org.jfree.chart.title.TextTitle;
- import org.jfree.data.category.CategoryDataset;
- import org.jfree.data.category.DefaultCategoryDataset;
- public class BarChartDemo {
- public static void main(String[] args) {
- // 1. 得到數據
- CategoryDataset dataset = getDataSet();
- // 2. 構造chart
- JFreeChart chart = ChartFactory.createBarChart3D(
- "水果產量圖", // 圖表標題
- "水果", // 目錄軸的顯示標籤--橫軸
- "產量", // 數值軸的顯示標籤--縱軸
- dataset, // 數據集
- PlotOrientation.VERTICAL, // 圖表方向:水平、
- true, // 是否顯示圖例(對於簡單的柱狀圖必須
- false, // 是否生成工具
- false // 是否生成URL鏈接
- );
- // 3. 處理chart中文顯示問題
- processChart(chart);
- // 4. chart輸出圖片
- writeChartAsImage(chart);
- // 5. chart 以swing形式輸出
- ChartFrame pieFrame = new ChartFrame("XXX", chart);
- pieFrame.pack();
- pieFrame.setVisible(true);
- }
- private static CategoryDataset getDataSet() {
- DefaultCategoryDataset dataset = new DefaultCategoryDataset();
- dataset.addValue(100, "北京", "蘋果");
- dataset.addValue(120, "上海", "蘋果");
- dataset.addValue(160, "廣州", "蘋果");
- dataset.addValue(210, "北京", "梨子");
- dataset.addValue(220, "上海", "梨子");
- dataset.addValue(230, "廣州", "梨子");
- dataset.addValue(330, "北京", "葡萄");
- dataset.addValue(340, "上海", "葡萄");
- dataset.addValue(340, "廣州", "葡萄");
- dataset.addValue(420, "北京", "香蕉");
- dataset.addValue(430, "上海", "香蕉");
- dataset.addValue(400, "廣州", "香蕉");
- dataset.addValue(510, "北京", "荔枝");
- dataset.addValue(530, "上海", "荔枝");
- dataset.addValue(510, "廣州", "荔枝");
- return dataset;
- }
- private static void processChart(JFreeChart chart) {
- CategoryPlot plot = chart.getCategoryPlot();
- CategoryAxis domainAxis = plot.getDomainAxis();
- ValueAxis rAxis = plot.getRangeAxis();
- chart.getRenderingHints().put(RenderingHints.KEY_TEXT_ANTIALIASING,
- RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
- TextTitle textTitle = chart.getTitle();
- textTitle.setFont(new Font("宋體", Font.PLAIN, 20));
- domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));
- domainAxis.setLabelFont(new Font("宋體", Font.PLAIN, 12));
- rAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));
- rAxis.setLabelFont(new Font("宋體", Font.PLAIN, 12));
- chart.getLegend().setItemFont(new Font("宋體", Font.PLAIN, 12));
- // renderer.setItemLabelGenerator(new LabelGenerator(0.0));
- // renderer.setItemLabelFont(new Font("宋體", Font.PLAIN, 12));
- // renderer.setItemLabelsVisible(true);
- }
- private static void writeChartAsImage(JFreeChart chart) {
- FileOutputStream fos_jpg = null;
- try {
- fos_jpg = new FileOutputStream("D:\\test\\fruit.jpg");
- ChartUtilities.writeChartAsJPEG(fos_jpg, 1, chart, 400, 300, null);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- try {
- fos_jpg.close();
- } catch (Exception e) {
- }
- }
- }
- }
效果圖如下:
接下來看其他的圖表的生成:
餅狀圖:
- public void createPieChart() {
- DefaultPieDataset dataset = new DefaultPieDataset();
- dataset.setValue("蘋果", 250);
- dataset.setValue("桔子", 350);
- dataset.setValue("梨子", 200);
- dataset.setValue("香蕉", 50);
- dataset.setValue("荔枝", 150);
- JFreeChart chart = ChartFactory.createPieChart("水果產量比率圖", dataset,
- true, true, true);
- Plot cp = chart.getPlot();
- cp.setBackgroundPaint(ChartColor.WHITE); // 背景色設置
- // ChartFrame frame = new ChartFrame("水果產量比率圖 ", chart, true);
- // frame.pack();
- // frame.setVisible(true);
- try {
- ChartUtilities.saveChartAsPNG(new File("D:\\test\\PieChart.png"),
- chart, 800, 500);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
3D餅狀圖:
- public void createPieChart3D() {
- DefaultPieDataset dataset = new DefaultPieDataset();
- dataset.setValue("蘋果", 250);
- dataset.setValue("桔子", 350);
- dataset.setValue("梨子", 200);
- dataset.setValue("香蕉", 50);
- dataset.setValue("荔枝", 150);
- JFreeChart chart = ChartFactory.createPieChart3D("水果產量比率圖", dataset,
- true, true, true);
- PiePlot3D plot = (PiePlot3D) chart.getPlot();
- // 設置開始角度
- plot.setStartAngle(150D);
- // 設置方向爲"順時針方向"
- plot.setDirection(Rotation.CLOCKWISE);
- // 設置透明度,0.5F爲半透明,1爲不透明,0爲全透明
- plot.setForegroundAlpha(1F);
- // 沒有數據的時候顯示的內容
- plot.setNoDataMessage("無數據顯示");
- // 背景色設置
- plot.setBackgroundPaint(ChartColor.WHITE);
- // ChartFrame frame = new ChartFrame("水果產量比率圖 ", chart, true);
- // frame.pack();
- // frame.setVisible(true);
- try {
- ChartUtilities.saveChartAsPNG(new File("D:\\test\\PieChart3D.png"),
- chart, 800, 500);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
柱狀圖:
- public void createColumnChart() {
- DefaultCategoryDataset dataset = new DefaultCategoryDataset();
- dataset.addValue(100, "北京", "蘋果");
- dataset.addValue(100, "上海", "蘋果");
- dataset.addValue(100, "廣州", "蘋果");
- dataset.addValue(200, "北京", "梨子");
- dataset.addValue(200, "上海", "梨子");
- dataset.addValue(200, "廣州", "梨子");
- dataset.addValue(300, "北京", "葡萄");
- dataset.addValue(300, "上海", "葡萄");
- dataset.addValue(300, "廣州", "葡萄");
- dataset.addValue(400, "北京", "香蕉");
- dataset.addValue(400, "上海", "香蕉");
- dataset.addValue(400, "廣州", "香蕉");
- dataset.addValue(500, "北京", "荔枝");
- dataset.addValue(500, "上海", "荔枝");
- dataset.addValue(500, "廣州", "荔枝");
- JFreeChart chart = ChartFactory.createBarChart("水果產量圖", "水量", "產量",
- dataset, PlotOrientation.VERTICAL, true, true, true);
- CategoryPlot cp = chart.getCategoryPlot();
- cp.setBackgroundPaint(ChartColor.WHITE); // 背景色設置
- cp.setRangeGridlinePaint(ChartColor.GRAY); // 網格線色設置
- // ChartFrame frame=new ChartFrame ("水果產量圖 ",chart,true);
- // frame.pack();
- // frame.setVisible(true);
- try {
- ChartUtilities.saveChartAsPNG(new File("D:\\test\\ColumnChart.png"),
- chart, 800, 500);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
折線圖:
- public void createLineChart() {
- DefaultCategoryDataset dataset = new DefaultCategoryDataset();
- dataset.addValue(100, "北京", "蘋果");
- dataset.addValue(200, "上海", "蘋果");
- dataset.addValue(300, "廣州", "蘋果");
- dataset.addValue(400, "北京", "梨子");
- dataset.addValue(500, "上海", "梨子");
- dataset.addValue(600, "廣州", "梨子");
- dataset.addValue(700, "北京", "葡萄");
- dataset.addValue(800, "上海", "葡萄");
- dataset.addValue(900, "廣州", "葡萄");
- dataset.addValue(800, "北京", "香蕉");
- dataset.addValue(700, "上海", "香蕉");
- dataset.addValue(600, "廣州", "香蕉");
- dataset.addValue(500, "北京", "荔枝");
- dataset.addValue(400, "上海", "荔枝");
- dataset.addValue(300, "廣州", "荔枝");
- JFreeChart chart = ChartFactory.createLineChart("水果產量圖 ", "水果", "產量",
- dataset, PlotOrientation.VERTICAL, true, true, true);
- CategoryPlot cp = chart.getCategoryPlot();
- cp.setBackgroundPaint(ChartColor.WHITE); // 背景色設置
- cp.setRangeGridlinePaint(ChartColor.GRAY); // 網格線色設置
- // ChartFrame frame=new ChartFrame ("水果產量圖 ",chart,true);
- // frame.pack();
- // frame.setVisible(true);
- try {
- ChartUtilities.saveChartAsPNG(new File("D:\\test\\LineChart.png"),
- chart, 800, 500);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
3D折線圖:
- public void createLineChart3D() {
- DefaultCategoryDataset dataset = new DefaultCategoryDataset();
- dataset.addValue(300, "北京", "蘋果");
- dataset.addValue(100, "上海", "蘋果");
- dataset.addValue(900, "廣州", "蘋果");
- dataset.addValue(200, "北京", "梨子");
- dataset.addValue(200, "上海", "梨子");
- dataset.addValue(700, "廣州", "梨子");
- dataset.addValue(300, "北京", "葡萄");
- dataset.addValue(300, "上海", "葡萄");
- dataset.addValue(300, "廣州", "葡萄");
- dataset.addValue(400, "北京", "香蕉");
- dataset.addValue(800, "上海", "香蕉");
- dataset.addValue(400, "廣州", "香蕉");
- dataset.addValue(100, "北京", "荔枝");
- dataset.addValue(500, "上海", "荔枝");
- dataset.addValue(500, "廣州", "荔枝");
- JFreeChart chart = ChartFactory.createLineChart3D("水果產量圖 ", "水果", "產量",
- dataset, PlotOrientation.VERTICAL, true, true, true);
- CategoryPlot cp = chart.getCategoryPlot();
- cp.setBackgroundPaint(ChartColor.WHITE); // 背景色設置
- cp.setRangeGridlinePaint(ChartColor.GRAY); // 網格線色設置
- // ChartFrame frame=new ChartFrame ("水果產量圖 ",chart,true);
- // frame.pack();
- // frame.setVisible(true);
- try {
- ChartUtilities.saveChartAsPNG(new File("D:\\test\\LineChart3D.png"),
- chart, 800, 500);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }