以前已經實現了數據的採集,如今已經有了基本的數據,下一步就須要使用這些數據實現統計圖的繪製了。這裏使用Jfreechart實現這些統計圖的繪製。首先看一下Jfreechart的基本用法,只有知道了它的基本用法纔有可能實現對更爲複雜的統計圖的繪製。html
這裏主要使用了它的三種繪製方式,繪製餅圖、折線圖和柱狀圖java
源代碼地址:https://github.com/kdyzm/day74_jfreechartDemogit
首先去官網下載相關jar包:http://www.jfree.org/jfreechart/download.htmlgithub
實際下載地址:http://sourceforge.net/projects/jfreechart/files/app
這裏我使用了1.0.14版本的。dom
解壓jar包以後在lib目錄下找到如下三個jar包添加到classpath:學習
而後就能進行下一步了。測試
String title="各大公司Java EE AS 市場佔有率調查";
1 DefaultPieDataset dpd=new DefaultPieDataset(); 2 dpd.setValue("IBM", 25); 3 dpd.setValue("Oracle", 25); 4 dpd.setValue("JBoss", 25); 5 dpd.setValue("用友", 25);
JFreeChart chart=ChartFactory.createPieChart(title, dpd, true, false, false);
很明顯參數1是標題,參數2是數據源,參數三是legend(圖例),便是否顯示圖例,所謂圖例就是對統計圖中的不一樣部分加以說明的部分。字體
ChartUtilities.saveChartAsJPEG(new File("D://a.jpg"), chart, 800, 500);
使用ChartUtilities保存到文件,800是寬度,500是長度。spa
咱們發現中文的部分所有變成亂碼了。統計圖中有三處亂碼,這三處亂碼應當分別給予解決,可是解決方法是如出一轍的,那就是設置中文字體,在jfreechart中全部亂碼都是沒有設置好字引發的。
JFreechart中的統計圖能夠大體分爲兩部分,一部分是繪圖區(plot),另外一部分是非繪圖區(有點廢話),繪圖區很明顯就是圖中的圓形盤子,而非繪圖區就包括了title、legend等部分。
PiePlot plot = (PiePlot)chart.getPlot(); plot.setLabelFont(new Font("宋體",Font.BOLD,15));
解決title中文亂碼:
chart.getTitle().setFont(new Font("宋體", Font.BOLD, 30));
解決legend中文亂碼
chart.getLegend().setItemFont(new Font("微軟雅黑", Font.PLAIN, 15));
注意設置字體必定要在ChartUtilities.saveChartAsJPEG方法以前,不然確定是沒有效果的。
解決完成中文亂碼問題以後效果:
雖然問題是解決了,可是要注意,一旦使用中文字體以後生成統計圖的速度就會下降不少,這大概和程序須要獲取系統字體有關係吧。
固然這個效果比較難看,是由於沒有設置透明度的問題,設置透明度
plot.setForegroundAlpha(0.7F);
這樣就顯得有立體效果了。
plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}/{1}/{2}/{3}"));
經過向StandardPieSectionLabelGenerator類的構造方法傳入一個字符串,咱們能夠定製標籤的內容,這裏設置的{}參數只有四種:
{0},標籤名稱
{1},實際的數量
{2},佔的百分比
{3},總的數量
若是超出了這個範圍,則直接不給解析若是加上了{4},則直接打印{4}
1 //設置圖表區背景 2 chart.setBackgroundImage(ImageIO.read(new File("C:/Users/kdyzm/Pictures/IA.full.1795695.jpg"))); 3 //設置繪圖區背景 4 plot.setBackgroundImage(ImageIO.read(new File("C:/Users/kdyzm/Pictures/IA.full.1787513.jpg")));
plot.setExplodePercent("IBM", 0.3D);
plot.setExplodePercent("Oracle", 0.1D);
1 package com.kdyzm.test.pie; 2 3 import java.awt.Font; 4 import java.io.File; 5 6 import org.jfree.chart.ChartFactory; 7 import org.jfree.chart.ChartUtilities; 8 import org.jfree.chart.JFreeChart; 9 import org.jfree.chart.labels.StandardPieSectionLabelGenerator; 10 import org.jfree.chart.plot.PiePlot; 11 import org.jfree.data.general.DefaultPieDataset; 12 13 /** 14 * 測試餅狀圖的生成 15 * @author kdyzm 16 * 17 * 須要注意的一點就是爲了解決中文亂碼問題,必定要在將流寫入文件以前設置字體。 18 * 19 */ 20 public class TestPie { 21 public static void main(String[] args) throws Exception { 22 String title="各大公司Java EE AS 市場佔有率調查"; 23 DefaultPieDataset dpd=new DefaultPieDataset(); 24 dpd.setValue("IBM", 25); 25 dpd.setValue("Oracle", 25); 26 dpd.setValue("JBoss", 25); 27 dpd.setValue("用友", 25); 28 29 //使用最簡單的繪圖方式 30 JFreeChart chart=ChartFactory.createPieChart3D(title, dpd, true, false, false); 31 //解決標題中文亂碼問題 32 chart.getTitle().setFont(new Font("宋體", Font.BOLD, 30)); 33 //解決底部bar中中文亂碼問題 34 chart.getLegend().setItemFont(new Font("微軟雅黑", Font.PLAIN, 15)); 35 PiePlot plot = (PiePlot)chart.getPlot(); 36 // plot.setExplodePercent("IBM", 0.3D); 37 // plot.setExplodePercent("Oracle", 0.1D); 38 plot.setLabelFont(new Font("宋體",Font.BOLD,15)); 39 plot.setForegroundAlpha(0.3F); 40 plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}/{1}/{2}/{3}")); 41 //繪圖區 42 /** 43 * 這裏設置的{}參數只有四種 44 * {0},標籤名稱 45 * {1},實際的數量 46 * {2},佔的百分比 47 * {3},總的數量 48 * 若是超出了這個範圍,則直接不給解析若是加上了{4},則直接打印{4} 49 */ 50 // //設置圖表區背景 51 // chart.setBackgroundImage(ImageIO.read(new File("C:/Users/kdyzm/Pictures/IA.full.1795695.jpg"))); 52 // //設置繪圖區背景 53 // plot.setBackgroundImage(ImageIO.read(new File("C:/Users/kdyzm/Pictures/IA.full.1787513.jpg"))); 54 55 //設置分裂效果 56 ChartUtilities.saveChartAsJPEG(new File("D://a.jpg"), chart, 800, 500); 57 //解決每一個扇形區域中中文亂碼問題 58 System.out.println("打印完成!"); 59 } 60 }
有了以前的餅狀圖的實現,再學習柱狀統計圖的實現就簡單了不少,雖然有不少地方不同,可是解決思路倒是有不少類似之處。
package com.kdyzm.test.bar; import java.awt.Font; import java.io.File; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.data.category.DefaultCategoryDataset; /** * 測試柱狀圖的生成 * @author kdyzm * */ public class BarTest { public static void main(String[] args) throws Exception { //提供數據集合 DefaultCategoryDataset dataset=new DefaultCategoryDataset(); dataset.addValue(100,"IBM", "第一季度"); dataset.addValue(103,"Oracle", "第一季度"); dataset.addValue(1000,"JBoss", "第一季度"); dataset.addValue(208,"用友", "第一季度"); dataset.addValue(2477,"IBM", "第二季度"); dataset.addValue(2343,"Oracle", "第二季度"); dataset.addValue(987,"JBoss", "第二季度"); dataset.addValue(3473,"用友", "第二季度"); dataset.addValue(1890,"IBM", "第三季度"); dataset.addValue(2980,"Oracle", "第三季度"); dataset.addValue(3889,"JBoss", "第三季度"); dataset.addValue(2890,"用友", "第三季度"); dataset.addValue(2347,"IBM", "第四季度"); dataset.addValue(1340,"Oracle", "第四季度"); dataset.addValue(2340,"JBoss", "第四季度"); dataset.addValue(3000,"用友", "第四季度"); //生成圖表的進程 String title="一年之中各大公司Java EE AS銷售統計"; JFreeChart chart=ChartFactory.createBarChart3D(title, "季度", "銷量(萬臺)", dataset, PlotOrientation.VERTICAL, true, false, false); //集中解決中文亂碼問題 chart.getTitle().setFont(new Font("微軟雅黑", Font.BOLD, 30)); //設置底部bar中的字體樣式 chart.getLegend().setItemFont(new Font("微軟雅黑", Font.ITALIC, 20)); CategoryPlot categoryPlot=chart.getCategoryPlot(); //設置橫座標字體的樣式 categoryPlot.getDomainAxis().setLabelFont(new Font("微軟雅黑", Font.PLAIN, 15)); //設置橫座標小字體標題的樣式 categoryPlot.getDomainAxis().setTickLabelFont(new Font("微軟雅黑",Font.PLAIN,14)); //設置縱座標標題的字體樣式 categoryPlot.getRangeAxis().setLabelFont(new Font("微軟雅黑",Font.PLAIN,15)); //設置前景色透明度 categoryPlot.setForegroundAlpha(0.7F); ChartUtilities.saveChartAsJPEG(new File("d:/bar.jpg"), chart, 800, 500); System.out.println("圖表生成完畢"); } }
效果圖:
代碼說明:
和餅狀統計圖相比生成柱狀統計圖有幾處不同的地方
JFreeChart chart=ChartFactory.createBarChart3D(title, "季度", "銷量(萬臺)", dataset, PlotOrientation.VERTICAL, true, false, false);
這裏季度是橫座標上的說明,銷量(萬臺)是縱座標上的說明,PlotOrientation.VERTICAL指定了繪圖區的方向爲垂直方向。
dataset.addValue(100,"IBM", "第一季度");
第一個參數是數量,第二個參數是名稱,第三個參數是「組號」,雖然API上給出的是「columnKey」,可是徹底不明因此,從效果上來看確實是「組號」
非繪圖區的title和legend解決亂碼的方式不變,須要改變的是繪圖區的亂碼解決方式。在JFreechart中橫座標的名稱叫作domain,作座標的名稱叫作range,經過CategoryPlot(其實也是Plot)獲取橫縱座標對象從而設置字體是解決中文亂碼的方式。
CategoryPlot categoryPlot=chart.getCategoryPlot(); //設置橫座標字體的樣式 categoryPlot.getDomainAxis().setLabelFont(new Font("微軟雅黑", Font.PLAIN, 15)); //設置橫座標小字體標題的樣式 categoryPlot.getDomainAxis().setTickLabelFont(new Font("微軟雅黑",Font.PLAIN,14)); //設置縱座標標題的字體樣式 categoryPlot.getRangeAxis().setLabelFont(new Font("微軟雅黑",Font.PLAIN,15));
所謂小標題的字體樣式指的就是"第一季度"、"第二季度"這樣的"組標題"。
折線統計圖的實現和柱狀統計圖的實現幾乎徹底相同,只須要將建立柱狀統計圖的方法改變成爲建立折線統計圖的方法便可。
package com.kdyzm.test.bar; import java.awt.Font; import java.io.File; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; import org.jfree.chart.plot.CategoryPlot; import org.jfree.chart.plot.PlotOrientation; import org.jfree.data.category.DefaultCategoryDataset; /** * 測試柱狀圖的生成 * @author kdyzm * */ public class BarTest { public static void main(String[] args) throws Exception { //提供數據集合 DefaultCategoryDataset dataset=new DefaultCategoryDataset(); dataset.addValue(100,"IBM", "第一季度"); dataset.addValue(103,"Oracle", "第一季度"); dataset.addValue(1000,"JBoss", "第一季度"); dataset.addValue(208,"用友", "第一季度"); dataset.addValue(2477,"IBM", "第二季度"); dataset.addValue(2343,"Oracle", "第二季度"); dataset.addValue(987,"JBoss", "第二季度"); dataset.addValue(3473,"用友", "第二季度"); dataset.addValue(1890,"IBM", "第三季度"); dataset.addValue(2980,"Oracle", "第三季度"); dataset.addValue(3889,"JBoss", "第三季度"); dataset.addValue(2890,"用友", "第三季度"); dataset.addValue(2347,"IBM", "第四季度"); dataset.addValue(1340,"Oracle", "第四季度"); dataset.addValue(2340,"JBoss", "第四季度"); dataset.addValue(3000,"用友", "第四季度"); //生成圖表的進程 String title="一年之中各大公司Java EE AS銷售統計"; JFreeChart chart=ChartFactory.createLineChart(title, "季度", "銷量(萬臺)", dataset, PlotOrientation.VERTICAL, true, false, false); //集中解決中文亂碼問題 chart.getTitle().setFont(new Font("微軟雅黑", Font.BOLD, 30)); //設置底部bar中的字體樣式 chart.getLegend().setItemFont(new Font("微軟雅黑", Font.ITALIC, 20)); CategoryPlot categoryPlot=chart.getCategoryPlot(); //設置橫座標字體的樣式 categoryPlot.getDomainAxis().setLabelFont(new Font("微軟雅黑", Font.PLAIN, 15)); //設置橫座標小字體標題的樣式 categoryPlot.getDomainAxis().setTickLabelFont(new Font("微軟雅黑",Font.PLAIN,14)); //設置縱座標標題的字體樣式 categoryPlot.getRangeAxis().setLabelFont(new Font("微軟雅黑",Font.PLAIN,15)); ChartUtilities.saveChartAsJPEG(new File("d:/bar.jpg"), chart, 800, 500); System.out.println("圖表生成完畢"); } }
效果圖以下:
線條不夠明顯,解決方法就是加粗線條。
1 LineAndShapeRenderer renderer=(LineAndShapeRenderer) categoryPlot.getRenderer(); 2 renderer.setSeriesStroke(0, new BasicStroke(3F)); 3 renderer.setSeriesStroke(1, new BasicStroke(3F)); 4 renderer.setSeriesStroke(2, new BasicStroke(3F)); 5 renderer.setSeriesStroke(3, new BasicStroke(3F));
加粗線條以後的效果圖:
試試3D效果:設置3D效果以後設置線條粗細就無效了。
JFreeChart chart=ChartFactory.createLineChart3D(title, "季度", "銷量(萬臺)", dataset, PlotOrientation.VERTICAL, true, false, false);
這是設置了前景色透明度爲0.8的效果。
categoryPlot.setForegroundAlpha(0.8F);
實現的完整代碼:
1 package com.kdyzm.test.appline; 2 3 import java.awt.BasicStroke; 4 import java.awt.Font; 5 import java.io.File; 6 7 import org.jfree.chart.ChartFactory; 8 import org.jfree.chart.ChartUtilities; 9 import org.jfree.chart.JFreeChart; 10 import org.jfree.chart.plot.CategoryPlot; 11 import org.jfree.chart.plot.PlotOrientation; 12 import org.jfree.chart.renderer.category.LineAndShapeRenderer; 13 import org.jfree.data.category.DefaultCategoryDataset; 14 /** 15 * 折線圖的生成方式和柱狀圖的生成方式幾乎沒有區別,可是最好設置一下線條的粗細,不然很難看 16 * @author kdyzm 17 * 18 */ 19 public class AppLine { 20 public static void main(String[] args) throws Exception { 21 //提供數據集合 22 DefaultCategoryDataset dataset=new DefaultCategoryDataset(); 23 dataset.addValue(100,"IBM", "第一季度"); 24 dataset.addValue(103,"Oracle", "第一季度"); 25 dataset.addValue(1000,"JBoss", "第一季度"); 26 dataset.addValue(208,"用友", "第一季度"); 27 28 dataset.addValue(2477,"IBM", "第二季度"); 29 dataset.addValue(2343,"Oracle", "第二季度"); 30 dataset.addValue(987,"JBoss", "第二季度"); 31 dataset.addValue(3473,"用友", "第二季度"); 32 33 dataset.addValue(1890,"IBM", "第三季度"); 34 dataset.addValue(2980,"Oracle", "第三季度"); 35 dataset.addValue(3889,"JBoss", "第三季度"); 36 dataset.addValue(2890,"用友", "第三季度"); 37 38 dataset.addValue(2347,"IBM", "第四季度"); 39 dataset.addValue(1340,"Oracle", "第四季度"); 40 dataset.addValue(2340,"JBoss", "第四季度"); 41 dataset.addValue(3000,"用友", "第四季度"); 42 43 //生成圖表的進程 44 String title="一年之中各大公司Java EE AS銷售統計"; 45 JFreeChart chart=ChartFactory.createLineChart3D(title, "季度", "銷量(萬臺)", dataset, PlotOrientation.VERTICAL, true, false, false); 46 47 //集中解決中文亂碼問題 48 chart.getTitle().setFont(new Font("微軟雅黑", Font.BOLD, 30)); 49 //設置底部bar中的字體樣式 50 chart.getLegend().setItemFont(new Font("微軟雅黑", Font.ITALIC, 14)); 51 CategoryPlot categoryPlot=chart.getCategoryPlot(); 52 //設置橫座標字體的樣式 53 categoryPlot.getDomainAxis().setLabelFont(new Font("微軟雅黑", Font.PLAIN, 15)); 54 //設置橫座標小字體標題的樣式 55 categoryPlot.getDomainAxis().setTickLabelFont(new Font("微軟雅黑",Font.PLAIN,14)); 56 57 //設置縱座標標題的字體樣式 58 categoryPlot.getRangeAxis().setLabelFont(new Font("微軟雅黑",Font.PLAIN,15)); 59 //設置前景色透明度 60 categoryPlot.setForegroundAlpha(0.8F); 61 62 //設置折線粗細 63 /*LineAndShapeRenderer renderer=(LineAndShapeRenderer) categoryPlot.getRenderer(); 64 renderer.setSeriesStroke(0, new BasicStroke(3F)); 65 renderer.setSeriesStroke(1, new BasicStroke(3F)); 66 renderer.setSeriesStroke(2, new BasicStroke(3F)); 67 renderer.setSeriesStroke(3, new BasicStroke(3F));*/ 68 69 ChartUtilities.saveChartAsJPEG(new File("d:/appLine.jpg"), chart, 800, 500); 70 System.out.println("折線圖表生成完畢"); 71 } 72 }