【程序員眼中的統計學(1)】信息圖形化:第一印象


信息圖形化:第一印象

作者 白寧超
2015年10月13日23:23:13

摘要:程序員眼中的統計學系列是作者和團隊共同學習筆記的整理。首先提到統計學,很多人認為是經濟學或者數學的專利,與計算機並沒有交集。誠然在傳統學科中,其在以上學科發揮作用很大。然而隨着科學技術的發展和機器智能的普及,統計學在機器智能中的作用越來越重要。本系列統計學的學習基於《深入淺出統計學》一書(偏向代碼實現,需要讀者有一定基礎,可以參見后面PPT學習)。正如(吳軍)先生在《數學之美》一書中闡述的,基於統計和數學模型對機器智能發揮重大的作用。諸如:語音識別、詞性分析、機器翻譯等世界級的難題也是從統計中找到開啟成功之門鑰匙的。尤其是在自然語言處理方面更顯得重要,因此,對統計和數學建模的學習是尤為重要的。最后感謝團隊所有人的參與。( 本文原創,轉載注明出處信息圖形化:第一印象  )

 目錄


【程序員眼中的統計學(1)】 信息圖形化:第一印象

【程序員眼中的統計學(2)】集中趨勢度量:分散性、變異性、強大的距

【程序員眼中的統計學(3)】概率計算:把握機會

【程序員眼中的統計學(4)】離散概率分布的運用:善用期望

【程序員眼中的統計學(5)】排列組合:排序、排位、排

【程序員眼中的統計學(6)】幾何分布、二項分布及泊松分布:堅持離散

【程序員眼中的統計學(7)】正態分布的運用:正態之美

【程序員眼中的統計學(8)】統計抽樣的運用:抽取樣本

【程序員眼中的統計學(9)】總體和樣本的估計:進行預測

【程序員眼中的統計學(10)】假設檢驗的運用:研究證據

【程序員眼中的統計學(11)】卡方分布的應用

【程序員眼中的統計學(12)】相關與回歸:我的線條如何?

0 引言


在大學時期我打了三年的暑假工,我的工作就是檢測數碼產品的屏幕的油墨厚度,每天都有好幾萬的數據報表,面對着這大量的待處理數據,我們就利用了圖表來進行統計。

 

1 餅圖算法描述


1.1 餅圖算法基本描述

在介紹餅圖之前我們先來看一張表格:

上圖是表示某公司在下半年中每月的利潤情況。

就這張表格而言,我們只能知道各個月份的利潤,卻無法知道每個月份占總利潤的比例,根據這張表格我們畫出了兩張圖,如下:

我們從圖中很容易可以得到兩個信息:第一幅圖看起來數據相差不大,第二幅圖看起來數據相差非常大,對於同一張表所畫出的兩張圖為什么會有兩種截然不同的見解呢?

其實會發生上述不同的觀點主要是因為這兩張圖的縱軸和標度不一樣,第一張圖縱軸的起點是0,標度是0.5,而第二張圖的縱軸的起點是2.0,標度是0.1。那么什么是標度呢?

標度:標度是指圖形縱軸上每段的大小。

數據:不添加任何修飾成分的原始事實與數字,比如說:對、錯;123  

信息:是指加入了某種修飾成分的數據,比如說:這個答案是對的;這個小孩3歲 。

前面的准備工作做完了,那么我們現在來看看什么叫餅圖吧。

餅圖為圓形,被分割為幾個扇形塊,每一塊代表一個組(類),扇形塊的大小表示這類數據占總體的比例即頻數。

頻數:一個特定組中的對象數目稱為頻數。

餅圖將整個數據計划分為幾個互不相干的組。這意味着,如果把每個扇形塊的頻數加起來,結果應為100%

請根據餅圖的定義將下面這張表格轉化為餅圖:

下面總結餅圖的優缺點及應用場景:

優點:在進行比例比較的時候,可以一眼看出哪個組具有較高的頻數。

缺點:當每種類型的比例大小相差不大時,我們很難根據扇形塊的大小來比較頻數的高低。

應用場景:根據扇形的優缺點我們可以知道,扇形只能適用於比例相差較大的情況下頻數的比較。

該算法是在給定一些數據集的情況下繪制出符合該數據集的餅圖。

  1. 定義:餅圖是將圓形分割為幾個扇形塊,每一塊代表一個組(類),扇形塊的大小表示這類數據占總體的比例。
  2. 符號解釋:無。
  3. 具體計算方法:該算法是利用JFreeChart里的jar包里的類和方法來繪制餅圖的。

1.2算法的應用場景

在需要繪制餅圖的時候使用該算法。

1.3算法的優缺點

  • 優點是可以很快速的建立一個餅圖;
  • 缺點是無法直接從餅圖中看出各部分所占的比例。

1.4算法的輸入輸出(Java代碼實現)

輸入:

* @param  Panel_Pictuer's name  string 表示面板名稱  My Pie Chart

* @param  Pie_Pictuer's name  string 表示圖形名稱  Pie Chart

* @param  x_name  string 表示各類名稱  One Two Three Four Five Six ##

* @param  y_size  double  表示各類的頻數  23 34 25 31 30 28 0

java代碼實現:

package pictuer;
import java.awt.Dimension;
import java.awt.font.TextAttribute;
import java.text.AttributedCharacterIterator;
import java.text.AttributedString;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import javax.swing.JPanel;
import org.jfree.chart.*;
import org.jfree.chart.labels.PieSectionLabelGenerator;
import org.jfree.chart.plot.PiePlot;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
public class PieChartDemo8 extends ApplicationFrame
{	
	/**
	 * 設置餅圖各小塊的個數
	 *  @return 餅圖各小塊的個數
	 * @author bnc 
	 *
	 */
	static class CustomLabelGenerator implements PieSectionLabelGenerator
	{
		public String generateSectionLabel(PieDataset piedataset, Comparable comparable)
		{
			String s = null;
			if (piedataset != null && !comparable.equals("Two"))
				s = comparable.toString();
			return s;
		}
		/**
		 * @return 返回裝載圖片的圖形構造
		 */
		public AttributedString generateAttributedSectionLabel(PieDataset piedataset, Comparable comparable)
		{
			AttributedString attributedstring = null;
			String s = comparable.toString();
			String s1 = (new StringBuilder()).append(s).append(" : ").append(String.valueOf(piedataset.getValue(comparable))).toString();
			attributedstring = new AttributedString(s1);
			attributedstring.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, 0, s.length() - 1);
			return attributedstring;
		}

		CustomLabelGenerator()
		{
		}
	}
	/*
	 * 構造函數,創建面板用來存放圖片
	 * @parame s 表示面板的名稱
	 */
	public PieChartDemo8(String s)
	{
		super(s);
		JPanel jpanel = createDemoPanel();//jpanel  創建面板的名稱
		jpanel.setPreferredSize(new Dimension(500, 270));
		setContentPane(jpanel);
	}
	/**
	 * 獲得繪制餅圖所需的數據
	 * @return 繪制餅圖所需的數據集
	 */
	private static PieDataset createDataset()
	{
		DefaultPieDataset defaultpiedataset = new DefaultPieDataset();//defaultpiedataset 裝載餅圖所需數據的數據集
		List<String> list_name=new ArrayList<String>();//list_name 裝載直方圖各小塊區間的容器
		list_name.add("One");
		list_name.add("Two");
		list_name.add("Three");
		list_name.add("Four");
		list_name.add("Five");
		int n=5;
		List<String> li_name=list_name;//li_name 存放餅圖各小塊名稱的容器
		List<Double> list_size=new ArrayList<Double>();//list_size 裝載條形圖各小塊頻數的容器
		list_size.add(23.0);
		list_size.add(13.0);
		list_size.add(25.0);
		list_size.add(12.0);
		list_size.add(18.0);
		List<Double> li_size=list_size;//li_size 存放餅圖各小塊頻數的容器
		for(int i=0;i<n;i++){
			defaultpiedataset.setValue(li_name.get(i),new Double(li_size.get(i)));//存放數據
		}
		return defaultpiedataset;
	}
	/**
	 * 創建餅圖
	 * @return 返回餅圖
	 */
	private static JFreeChart createChart(PieDataset piedataset,String Pie_Name)
	{
		JFreeChart jfreechart = ChartFactory.createPieChart(Pie_Name, piedataset, false, true, false);//jfreechart  圖形變量,用來裝載圖形
		PiePlot pieplot = (PiePlot)jfreechart.getPlot();
		pieplot.setLabelGenerator(new CustomLabelGenerator());
		return jfreechart;
	}
	/**
	 * 創建餅圖面板
	 * @return 返回餅圖面板
	 */
	public static JPanel createDemoPanel()
	{
		String Pie_name;
		Pie_name="My Chart";
		JFreeChart jfreechart = createChart(createDataset(),Pie_name);//jfreechart 圖形變量,通過圖形數據和圖形名稱創建圖形
		return new ChartPanel(jfreechart);
	}	
	public static void main(String args[])
	{
		/**
		 * 繪制餅圖
		 * @author cuit
		 * @return 返回餅圖
		 */
		String Panel_name;
		Panel_name="My Chart";
		PieChartDemo8 piechartdemo8 = new PieChartDemo8(Panel_name);//piechartdemo8   構造方法實例變量
		piechartdemo8.pack();
		RefineryUtilities.centerFrameOnScreen(piechartdemo8);
		piechartdemo8.setVisible(true);
	}
}

 輸出結果:

 

1.5 導致算法異常

y_size輸入的個數大於x_name的個數會導致異常,系統會自動的將y_size多余的數值剔除掉

1.6 代碼的算法參考

類源碼:見源程序:Panel. src. All_Pictuer. PieChartDemo8

本算法是通過輸入繪制餅圖的數據集來繪制出餅圖的具體實現。

類和方法調用接口

見源程序:Panel. src. All_Pictuer. PieChartDemo8

PieChartDemo8.java 下包含如下方法:

getN_name()   //得到餅圖各小塊的個數

setN_name(int n_name)  //設置餅圖各小塊的個數

Input_Name()   //輸入餅圖各小塊的名稱

Input_Size()    //輸入餅圖各小塊的頻數

generateAttributedSectionLabel(PieDataset piedataset, Comparable comparable)  //裝載圖片的圖形構造

PieChartDemo8(String s)  //構造函數,創建面板用來存放圖片

createDataset()   //獲得繪制餅圖所需的數據

createChart(PieDataset piedataset,String Pie_Name)   //創建餅圖

createDemoPanel()   //創建餅圖面板

條形圖算法描述


2.1 條形圖算法基本描述

條形圖

通過前面我們知道了餅圖的基本特征,那么請看看下面這張餅圖有什么問題吧。

這個餅圖的問題就在於很難一眼看出哪一類玩家的滿意度最高。用於扇形塊所占整體比例無關的百分數來標識餅圖通常也會讓人犯暈,例如,“體育”塊標示着99%,但這一塊在餅圖中所占的比例僅為20%左右。另一個問題是,我們不知道每種游戲的反饋數目是否相等,因此也無法知道用這種方式對滿意度進行比較是否公正。

餅圖的作用是對不同組(或者類)所占的比例進行比較,但在這個例子中,各個組的比例相差無幾,這就是餅圖失效的地方,那么究竟什么圖可以完成這種情況呢?那么我們就得引入條形圖了。

條形圖:條形圖是用一個一個間隔的長方形來表示的,每一個長方形代表一個特定的類,長方形的長度代表某種數值。長方形越長,數值越大,所有長方形的寬都是相等的。

 垂直條形圖

條形圖分為垂直條形圖和水平條形圖兩種,下面我們就來看看垂直條形圖的具體畫法:

水平條形圖

同樣是將上面的表格轉換成水平條形圖(水平條形圖跟垂直條形圖相比,只是坐標軸調換了一下而已)

在一般情況下,我們經常用垂直條形圖,但在類名稱太長的時候,水平條形圖就有用了----你將有大量空白位置標示每個類的名稱,不用橫七豎八的進行擺布。

百分度標度:類的數目的大小是用百分數來表示的。

在使用百分度標度時,一定要設法指出頻數-----或是將頻數標在圖形中間,或是標在圖形旁邊。

頻數標度:類的數目的大小是用數字而非百分數表示的。

在使用頻數標度時,一定要小心縱軸的起點,通常縱軸的起點是從0開始,不過當使用不以0為起點的縱軸可以讓數據給人不同的第一印象。

堆積條形圖

堆積條形圖:將同一種類的不同的屬性分別用兩個相連的的長方形在一張條形圖

下面總結堆積條形圖的優缺點及應用場景: 優點:黨比表同一種類的不同屬性的頻數的時候很簡單明了。

缺點:很難看出某個類的比例和屬性的比例。

應用場景:同一個類有多個屬性而我們只需比較不同屬性之間的頻數

分段條形圖

分段條形圖:將同一種類的不同的屬性分段在一個長方形上展示

 

下面總結分段條形圖的優缺點及應用場景:

優點:可以很清晰的看出每個類的總和和各個屬性的比例。

缺點:不容易看出各個屬性的頻數。

應用場景:同一個類有多個屬性而我們需要比較各個類的比較或不同屬性之間的比例。

該算法是在給定一些數據集的情況下繪制出符合該數據集的條形圖。

  1. 定義:條形圖是用一個一個間隔的長方形來表示的,每一個長方形代表一個特定的類,長方形的長度代表某種數值。
  2. 符號解釋:無。
  3. 具體計算方法:該算法是利用JFreeChart里的jar包里的類和方法來繪制條形圖的。

2.2算法的應用場景

在需要繪制條形圖的時候使用該算法。

2.3算法的優缺點

  • 優點是可以很快速的建立一個條形圖;
  • 缺點是所輸入的各小塊的名稱時必須得轉化成Year類型。

2.4算法的輸入輸出

輸入量:

* @param  Panel's name  string 表示面板名稱  My Chart

* @param  Pictuer's name  string 表示圖形名稱  Chart

* @param  x_name  double 表示各類名稱  1 2 3 4 5 6 0

* @param  y_size  double  表示各類的頻數 23 34 25 31 30 28 0

java代碼實現:

package pictuer;
import java.awt.Dimension;
import java.awt.Font;
import java.io.PrintStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import javax.swing.JPanel;
import org.jfree.chart.*;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickMarkPosition;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.time.*;
import org.jfree.data.xy.IntervalXYDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
public class XYBarChartDemo1 extends ApplicationFrame
{
	/**
	 * 構造函數,用來創建面板用來存放圖片
	 * @param s 表示面板的名稱
	 */
	public XYBarChartDemo1(String s)
	{
		super(s);
		JPanel jpanel = createDemoPanel();//jpanel  創建面板的名稱
		jpanel.setPreferredSize(new Dimension(500, 270));
		setContentPane(jpanel);
	}
	/**
	 * 創建條形圖
	 * @param intervalxydataset  數周數據生成變量,用來存放數軸數據
	 * @return 返回條形圖
	 */
	private static JFreeChart createChart(IntervalXYDataset intervalxydataset,String Pictuer_name)
	{
		//System.out.println("請輸入該圖片的名稱(類型是String):");
		//Scanner input = new Scanner(System.in);//input 輸入流變量,存放從鍵盤輸入的字符串
		//String Pictuer_name=input.nextLine();//Pictuer_name 字符串變量,用來存放條形圖的名稱
		JFreeChart jfreechart = ChartFactory.createXYBarChart(Pictuer_name, "Year", true, "Number of People", intervalxydataset, PlotOrientation.VERTICAL, true, false, false);
		//jfreechart  圖形變量,用來裝載圖形
		XYPlot xyplot = (XYPlot)jfreechart.getPlot();//xyplot  數軸變量,用來存放和設置數軸的信息
		XYBarRenderer xybarrenderer = (XYBarRenderer)xyplot.getRenderer();//xybarrenderer  圖形方塊變量
		StandardXYToolTipGenerator standardxytooltipgenerator = new StandardXYToolTipGenerator("{1} = {2}", new SimpleDateFormat("yyyy"), new DecimalFormat("0"));
		//standardxytooltipgenerator 數周數據生成變量,用來存放數軸數據
		xybarrenderer.setBaseToolTipGenerator(standardxytooltipgenerator);
		xybarrenderer.setMargin(0.10000000000000001D);
		DateAxis dateaxis = (DateAxis)xyplot.getDomainAxis();//dateaxis 數值變量,用來設置數軸的數值的 
		dateaxis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);
		dateaxis.setLowerMargin(0.01D);
		dateaxis.setUpperMargin(0.01D);
		ChartUtilities.applyCurrentTheme(jfreechart);
		return jfreechart;
	}
	/**
	 * 獲得繪制條形圖所需的數據
	 * @return 繪制條形圖所需的數據集
	 */
	private static IntervalXYDataset createDataset()
	{
		List<Integer> list_name=new ArrayList<Integer>();//list_name 裝載直方圖各小塊區間的容器
		list_name.add(1);
		list_name.add(2);
		list_name.add(3);
		list_name.add(4);
		list_name.add(5);
		int n=5;
		TimeSeries timeseries = new TimeSeries("Executions", "Year", "Count");//timeseries  時間變量,存放數據時間的
		List<Integer> li_name=list_name;//li_name 存放條形圖各小塊區間的容器
		List<Double> list_size=new ArrayList<Double>();//list_size 裝載條形圖各小塊頻數的容器
		list_size.add(23.0);
		list_size.add(13.0);
		list_size.add(25.0);
		list_size.add(12.0);
		list_size.add(18.0);
		List<Double> li_size=list_size;//li_size 存放條形圖各區間頻數的容器
		for(int i=0;i<n;i++){
		try
		{
			timeseries.add(new Year(li_name.get(i)), new Double(li_size.get(i)));
		}
		catch (Exception exception)
		{
			System.err.println(exception.getMessage());
		}//拋異常
		}
		TimeSeriesCollection timeseriescollection = new TimeSeriesCollection(timeseries);//timeseriescollection  時間數集變量
		return timeseriescollection;
	}
	/**
	 * 得到條形圖各小塊的個數
	 * @return 直方圖各小塊的個數
	 */
	/**
	 * 設置條形圖各小塊的個數
	 * @return 直方圖各小塊的個數
	 */
	/**
	 * 創建條形圖面板
	 * @param ChartPanel 圖形面板變量
	 * @return 返回直方圖面板
	 */
	public static JPanel createDemoPanel()
	{
		String Pictuer_name;
		Pictuer_name="Chart";
		return new ChartPanel(createChart(createDataset(),Pictuer_name));
	}

	public static void main(String args[])
	{
		/**
		 * 繪制條形圖
		 * @author cuit
		 * @return 返回直方圖
		 */
		String panel_name;
		panel_name="My Chart";
		XYBarChartDemo1 xybarchartdemo1 = new XYBarChartDemo1(panel_name);//xybarchartdemo1   構造方法實例變量
		xybarchartdemo1.pack();
		RefineryUtilities.centerFrameOnScreen(xybarchartdemo1);
		xybarchartdemo1.setVisible(true);
	}
}

 輸出:

 

2.5導致算法異常

當y_size輸入的個數大於x_name的個數會導致異常,系統會自動的將y_size多余的數值剔除掉

2.6代碼的算法參考

類源碼:見源程序:Panel. src. All_Pictuer. XYBarChartDemo1

本算法是通過輸入繪制條形圖的數據集來繪制出餅圖的具體實現。

類和方法調用接口

見源程序:Panel. src. All_Pictuer. XYBarChartDemo1

XYBarChartDemo1.java 下包含如下方法:

getN_name()   //得到條形圖各小塊的個數

setN_name(int n_name)  //設置條形圖各小塊的個數

Input_Name()   //輸入條形圖各小塊的名稱

Input_Size()    //輸入條形圖各小塊的頻數

XYBarChartDemo1(String s)  //構造函數,創建面板用來存放圖片

createDataset()  //獲得繪制條形圖所需的數據

createChart(IntervalXYDataset intervalxydataset)  //創建條形圖

createDemoPanel()   //創建條形圖面板

直方圖算法描述


3.1 直方圖算法基本描述

該算法是在給定一些數據集的情況下繪制出符合該數據集的直方圖。

  1. 定義:直方圖是用一個一個連續的長方形來表示的,每一個長方形代表一個特定的類,長方形的長度代表某種數值。
  2. 符號解釋:無。
  3. 具體計算方法:該算法是利用JFreeChart里的jar包里的類和方法來繪制直方圖的。

3.2算法的應用場景

在需要繪制直方圖的時候使用該算法。

3.3算法的優缺點

  • 優點是可以很快速的建立一個直方圖
  • 缺點是無法自由設置縱軸的標度。

3.4算法的輸入輸出

輸入:

* @param  panel's name  string 表示面板名稱  My Chart

* @param  histograme's name  string 表示圖形名稱  Chart

* @param  x's name  string  表示x軸的名稱  My X

* @param  x_QuJian  double 表示各類名稱  1 2 3 4 5 6 0

* @param  y_size  double  表示各類的頻數 23 34 25 31 30 28 0

java代碼實現:

package pictuer;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import javax.swing.JPanel;
import org.jfree.chart.*;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.data.statistics.SimpleHistogramBin;
import org.jfree.data.statistics.SimpleHistogramDataset;
import org.jfree.data.xy.IntervalXYDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
public class HistogramDemo2 extends ApplicationFrame
{
	/**
	 * 構造函數,用來創建面板用來存放圖片
	 * @param s 表示面板的名稱
	 */
	public HistogramDemo2(String s)
	{
		super(s);
		JPanel jpanel = createDemoPanel();//jpanel  創建面板的名稱
		jpanel.setPreferredSize(new Dimension(500, 270));
		setContentPane(jpanel);
	}
	/**
	 * 得到直方圖各小塊的個數
	 * @return 直方圖各小塊的個數
	 */
	/**
	 * 獲得繪制直方圖所需的數據 
	 * @return 繪制餅圖所需的數據集
	 */
	private static IntervalXYDataset createDataset()
	{
		String x_name;
		x_name="X_Name";
		SimpleHistogramDataset simplehistogramdataset = new SimpleHistogramDataset(x_name);//simplehistogramdataset 裝載直方圖所需數據的數據集
		List<Double> list_size=new ArrayList<Double>();//list_size 裝載條形圖各小塊頻數的容器
		list_size.add(9.0);
		list_size.add(10.0);
		list_size.add(11.0);
		list_size.add(12.0);
		list_size.add(13.0);
		int n=5;
		List<Double> l_qujian=list_size;//l_qujian 存放直方圖各小塊區間的容器
		List<Integer> list_name=new ArrayList<Integer>();//list_name 裝載直方圖各小塊區間的容器
		list_name.add(23);
		list_name.add(12);
		list_name.add(56);
		list_name.add(32);
		list_name.add(22);
		List<Integer> l_size=list_name;//l_size 存放直方圖各區間頻數的容器
		for(int i=0;i<n-1;i++){
			SimpleHistogramBin simplehistogrambin = new SimpleHistogramBin(l_qujian.get(i),l_qujian.get(i+1), true, false);//simplehistogrambin  圖形變量
			simplehistogrambin.setItemCount(l_size.get(i));
			simplehistogramdataset.addBin(simplehistogrambin);
		}
		return simplehistogramdataset;
	}
	/**
	 * 創建直方圖
	 * @param intervalxydataset 裝載直方圖所需數據的數據集
	 * @return 返回直方圖
	 */
	private static JFreeChart createChart(IntervalXYDataset intervalxydataset)
	{
		String h_name;
		h_name="Y_Name";
		JFreeChart jfreechart = ChartFactory.createHistogram(h_name, null, null, intervalxydataset, PlotOrientation.VERTICAL, true, true, false);
		//jfreechart  圖形變量,用來裝載圖形
		XYPlot xyplot = (XYPlot)jfreechart.getPlot();//xyplot  數軸變量,用來存放和設置數軸的信息
		xyplot.setForegroundAlpha(0.85F);
		xyplot.setDomainPannable(true);
		xyplot.setRangePannable(true);
		NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis();//numberaxis 數值變量,用來設置數軸的數值的
		numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
		XYBarRenderer xybarrenderer = (XYBarRenderer)xyplot.getRenderer();//xybarrenderer  圖形方塊變量
		xybarrenderer.setDrawBarOutline(false);
		return jfreechart;
	}
	/**
	 * 創建直方圖面板 
	 * @return 返回直方圖面板
	 */
	public static JPanel createDemoPanel()
	{
		JFreeChart jfreechart = createChart(createDataset());//jfreechart 圖形變量,通過圖形數據和圖形名稱創建圖形
		ChartPanel chartpanel = new ChartPanel(jfreechart);//chartpanel 圖形面板變量
		chartpanel.setMouseWheelEnabled(true);
		return chartpanel;
	}
	public static void main(String args[])
	{
		/**
		 * 繪制直方圖
		 * @author cuit
		 * @return 返回直方圖
		 */
		String panel_name;
		panel_name="My Chart";
		HistogramDemo2 histogramdemo2 = new HistogramDemo2(panel_name);//histogramdemo2   構造方法實例變量
		histogramdemo2.pack();
		RefineryUtilities.centerFrameOnScreen(histogramdemo2);
		histogramdemo2.setVisible(true);
	}
}

 

輸出:

 

3.5導致算法異常

當y_size輸入的個數大於x_QuJian的個數會導致異常,系統會自動的將y_size多余的數值剔除掉。

3.6代碼的算法參考

類源碼:見源程序:Panel. src. All_Pictuer. HistogramDemo2

本算法是通過輸入繪制直方圖的數據集來繪制出餅圖的具體實現。

類和方法調用接口

見源程序:Panel. src. All_Pictuer. HistogramDemo2

HistogramDemo2.java 下包含如下方法:

getN_qujian()  //得到直方圖各小塊的個數

setN_qujian(int n_qujian)  //設置直方圖各小塊的個數

Input_QuJian()   //輸入直方圖各小塊的區間

Input_Size()    //輸入直方圖各小塊的頻數

HistogramDemo2(String s)  //構造函數,創建面板用來存放圖片

createDataset()  //獲得繪制直方圖所需的數據

createChart(IntervalXYDataset intervalxydataset)   //創建直方圖

createDemoPanel()   //創建直方圖面板

折線圖算法描述


4.1 折線圖算法基本描述

當我們在處理存在負增長的數據時我們就不能用累計頻數圖了,因為累計頻數圖永遠都是增長的,那么這個時候我們就該用到折線圖了。

折線圖:用來體現數據型數據的發展趨勢的。

那么我們現在來看一下根據下面的這張表轉換成折線圖的畫法吧。

該算法是在給定一些數據集的情況下繪制出符合該數據集的折線圖。

  1. 定義:折線圖用來體現數據型數據的發展趨勢的。
  2. 符號解釋:無。
  3. 具體計算方法:該算法是利用JFreeChart里的jar包里的類和方法來繪制折線圖的。

4.2算法的應用場景

在需要繪制折線圖的時候使用該算法。

4.3算法的優缺點

  • 優點是可以很快速的建立一個折線圖
  • 缺點是所輸入的各小塊的名稱時必須得轉化成Year類型。

4.4算法的輸入輸出

輸入:

* @param  Panel's name  string 表示面板名稱  My Chart

* @param  Classes's name  string 表示類名稱  Chart

* @param  pictuer's name  string  表示圖形名稱  Pictuer Chart

* @param  y's name  string  表示y軸的名稱  Chart Y

* @param  x's name  string  表示x軸的名稱  My X

* @param  x_name  string 表示各類名稱  1 2 3 4 5 6 ##

* @param  y_size  double  表示各類的頻數 23 34 25 31 30 28 0

java代碼實現:

package pictuer;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import org.jfree.chart.*;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.*;
public class LineChartDemo1 extends ApplicationFrame
{
	/**
	 * 構造函數,用來創建面板用來存放圖片
	 * @param s 表示面板的名稱
	 */
	public LineChartDemo1(String s)
	{
		super(s);
		JPanel jpanel = createDemoPanel();//jpanel  創建面板的名稱
		jpanel.setPreferredSize(new Dimension(500, 270));
		setContentPane(jpanel);
	}
	/**
	 * 獲得繪制折線圖所需的數據
	 * @return 繪制餅圖所需的數據集
	 */
	private static CategoryDataset createDataset()
	{
		DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();//defaultcategorydataset 裝載折線圖所需數據的數據集
		List<String> list_name=new ArrayList<String>();//list_name 裝載直方圖各小塊區間的容器
		list_name.add("One");
		list_name.add("Two");
		list_name.add("Three");
		list_name.add("Four");
		list_name.add("Five");
		int n=5;
		List<String> li_name=list_name;//li_name 存放折線圖各點的容器
		List<Double> list_size=new ArrayList<Double>();//list_size 裝載條形圖各小塊頻數的容器
		list_size.add(23.0);
		list_size.add(13.0);
		list_size.add(25.0);
		list_size.add(12.0);
		list_size.add(18.0);
		List<Double> li_size=list_size;//li_size 存放折線圖各點頻數的容器
		String Classess_name;
		Classess_name="Class";
		for(int i=0;i<n;i++){
			defaultcategorydataset.addValue(new Double(li_size.get(i)),Classess_name,li_name.get(i));//存放數據
		}
		return defaultcategorydataset;
	}
	/**
	 * 創建折線圖
	 * @param categorydataset 裝載折線圖所需數據的數據集
	 * @return 返回直方圖
	 */
	private static JFreeChart createChart(CategoryDataset categorydataset)
	{
		String Pictuer_name;
		Pictuer_name="My Chart";
		String y_name;
		y_name="Chart";
		JFreeChart jfreechart = ChartFactory.createLineChart(Pictuer_name, null,y_name, categorydataset, PlotOrientation.VERTICAL, false, true, false);
		//jfreechart  圖形變量,用來裝載圖形
		CategoryPlot categoryplot = (CategoryPlot)jfreechart.getPlot();//categoryplot  數軸變量,用來存放和設置數軸的信息
		categoryplot.setRangePannable(true);
		categoryplot.setRangeGridlinesVisible(false);
		NumberAxis numberaxis = (NumberAxis)categoryplot.getRangeAxis();//numberaxis 數值變量,用來設置數軸的數值的
		numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
		ChartUtilities.applyCurrentTheme(jfreechart);
		LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer)categoryplot.getRenderer();//lineandshaperenderer  圖形方塊變量
		lineandshaperenderer.setBaseShapesVisible(true);
		lineandshaperenderer.setDrawOutlines(true);
		lineandshaperenderer.setUseFillPaint(true);
		lineandshaperenderer.setBaseFillPaint(Color.white);
		lineandshaperenderer.setSeriesStroke(0, new BasicStroke(3F));
		lineandshaperenderer.setSeriesOutlineStroke(0, new BasicStroke(2.0F));
		lineandshaperenderer.setSeriesShape(0, new java.awt.geom.Ellipse2D.Double(-5D, -5D, 10D, 10D));
		return jfreechart;
	}
	/**
	 * 創建折線圖面板
	 * @return 返回折線圖面板
	 */
	public static JPanel createDemoPanel()
	{
		JFreeChart jfreechart = createChart(createDataset());//jfreechart 圖形變量,通過圖形數據和圖形名稱創建圖形
		ChartPanel chartpanel = new ChartPanel(jfreechart);//chartpanel 圖形面板變量
		chartpanel.setMouseWheelEnabled(true);
		return chartpanel;
	}
	public static void main(String args[])
	{
		/**
		 * 繪制折線圖
		 * @author cuit
		 * @return 返回直方圖
		 */
		String Panel_name;
		Panel_name="Chart";
		LineChartDemo1 linechartdemo1 = new LineChartDemo1(Panel_name);//linechartdemo1   構造方法實例變量
		linechartdemo1.pack();
		RefineryUtilities.centerFrameOnScreen(linechartdemo1);
		linechartdemo1.setVisible(true);
	}
}

 輸出:

 

4.5導致算法異常

當y_size輸入的個數大於x_name的個數會導致異常,系統會自動的將y_size多余的數值剔除掉

4.6代碼的算法參考

類源碼:見源程序:Panel. src. All_Pictuer. LineChartDemo1

本算法是通過輸入繪制折線圖的數據集來繪制出餅圖的具體實現。

類和方法調用接口

見源程序:Panel. src. All_Pictuer. LineChartDemo1

LineChartDemo1.java 下包含如下方法:

getN_name()  //得到折線圖點的個數

setN_name(int n_name)  //設置直折線圖點的個數

Input_Name()   //輸入折線圖各點的區間

Input_Size()    //輸入折線圖各點的頻數

LineChartDemo1(String s)  //構造函數,創建面板用來存放圖片

createDataset()  //獲得繪制折線圖所需的數據

createChart(CategoryDataset categorydataset)   //創建折線圖

createDemoPanel()   //創建折線圖面板

箱線圖算法描述


5.1 箱線圖算法基本描述

該算法是在給定一些數據集的情況下繪制出符合該數據集的箱線圖。

  1. 定義:箱線圖是用來顯示數據的全距、四分位距以及中位數的圖形。
  2. 符號解釋:無。
  3. 具體計算方法:該算法是利用JFreeChart里的jar包里的類和方法來繪制箱線圖的。

5.2算法的應用場景

在需要繪制箱線圖的時候使用該算法。

5.3算法的優缺點

優點是可以很快速的建立一個箱線圖。

5.4算法的輸入輸出

輸入:

* @param  panel's name  string 表示面板名稱 My Chart

* @param  x's name  string 表示x軸名稱  My X

* @param  y's name  string 表示y軸名稱  My Y

* @param  the max  double  表示最大值  1

* @param  the min  double  表示最小值  33

* @param  the under_four  double  表示下四分位數  10

* @param  the over_four   double  表示上四分位數  15

* @param  Pictuer's name  string 表示圖片名稱  Chart

java代碼實現:

package pictuer;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import javax.swing.JPanel;
import org.jfree.chart.*;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.data.statistics.SimpleHistogramBin;
import org.jfree.data.statistics.SimpleHistogramDataset;
import org.jfree.data.xy.IntervalXYDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
public class HistogramDemo2 extends ApplicationFrame
{
	/**
	 * 構造函數,用來創建面板用來存放圖片
	 * @param s 表示面板的名稱
	 */
	public HistogramDemo2(String s)
	{
		super(s);
		JPanel jpanel = createDemoPanel();//jpanel  創建面板的名稱
		jpanel.setPreferredSize(new Dimension(500, 270));
		setContentPane(jpanel);
	}
	/**
	 * 得到直方圖各小塊的個數
	 * @return 直方圖各小塊的個數
	 */
	/**
	 * 獲得繪制直方圖所需的數據 
	 * @return 繪制餅圖所需的數據集
	 */
	private static IntervalXYDataset createDataset()
	{
		String x_name;
		x_name="X_Name";
		SimpleHistogramDataset simplehistogramdataset = new SimpleHistogramDataset(x_name);//simplehistogramdataset 裝載直方圖所需數據的數據集
		List<Double> list_size=new ArrayList<Double>();//list_size 裝載條形圖各小塊頻數的容器
		list_size.add(9.0);
		list_size.add(10.0);
		list_size.add(11.0);
		list_size.add(12.0);
		list_size.add(13.0);
		int n=5;
		List<Double> l_qujian=list_size;//l_qujian 存放直方圖各小塊區間的容器
		List<Integer> list_name=new ArrayList<Integer>();//list_name 裝載直方圖各小塊區間的容器
		list_name.add(23);
		list_name.add(12);
		list_name.add(56);
		list_name.add(32);
		list_name.add(22);
		List<Integer> l_size=list_name;//l_size 存放直方圖各區間頻數的容器
		for(int i=0;i<n-1;i++){
			SimpleHistogramBin simplehistogrambin = new SimpleHistogramBin(l_qujian.get(i),l_qujian.get(i+1), true, false);//simplehistogrambin  圖形變量
			simplehistogrambin.setItemCount(l_size.get(i));
			simplehistogramdataset.addBin(simplehistogrambin);
		}
		return simplehistogramdataset;
	}
	/**
	 * 創建直方圖
	 * @param intervalxydataset 裝載直方圖所需數據的數據集
	 * @return 返回直方圖
	 */
	private static JFreeChart createChart(IntervalXYDataset intervalxydataset)
	{
		String h_name;
		h_name="Y_Name";
		JFreeChart jfreechart = ChartFactory.createHistogram(h_name, null, null, intervalxydataset, PlotOrientation.VERTICAL, true, true, false);
		//jfreechart  圖形變量,用來裝載圖形
		XYPlot xyplot = (XYPlot)jfreechart.getPlot();//xyplot  數軸變量,用來存放和設置數軸的信息
		xyplot.setForegroundAlpha(0.85F);
		xyplot.setDomainPannable(true);
		xyplot.setRangePannable(true);
		NumberAxis numberaxis = (NumberAxis)xyplot.getRangeAxis();//numberaxis 數值變量,用來設置數軸的數值的
		numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
		XYBarRenderer xybarrenderer = (XYBarRenderer)xyplot.getRenderer();//xybarrenderer  圖形方塊變量
		xybarrenderer.setDrawBarOutline(false);
		return jfreechart;
	}
	/**
	 * 創建直方圖面板 
	 * @return 返回直方圖面板
	 */
	public static JPanel createDemoPanel()
	{
		JFreeChart jfreechart = createChart(createDataset());//jfreechart 圖形變量,通過圖形數據和圖形名稱創建圖形
		ChartPanel chartpanel = new ChartPanel(jfreechart);//chartpanel 圖形面板變量
		chartpanel.setMouseWheelEnabled(true);
		return chartpanel;
	}
	public static void main(String args[])
	{
		/**
		 * 繪制直方圖
		 * @author cuit
		 * @return 返回直方圖
		 */
		String panel_name;
		panel_name="My Chart";
		HistogramDemo2 histogramdemo2 = new HistogramDemo2(panel_name);//histogramdemo2   構造方法實例變量
		histogramdemo2.pack();
		RefineryUtilities.centerFrameOnScreen(histogramdemo2);
		histogramdemo2.setVisible(true);
	}
}

 

輸出:

 

5.5導致算法異常

當所輸入的上四分位數比下四分位數大或者最小值比最大值大的時候畫出的圖形將不再是箱線圖了。

5.6代碼的算法參考

類源碼:見源程序:Panel. src. All_Pictuer. BoxAndWhiskerChartDemo2

本算法是通過輸入繪制箱線圖的數據集來繪制出餅圖的具體實現。

類和方法調用接口

見源程序:Panel. src. All_Pictuer. BoxAndWhiskerChartDemo2

BoxAndWhiskerChartDemo2.java 下包含如下方法:

BoxAndWhiskerChartDemo2(String s)  //構造函數,創建面板用來存放圖片

createDataset()  //獲得繪制箱線圖所需的數據

createChart(BoxAndWhiskerXYDataset boxandwhiskerxydataset)  //創建箱線圖

createDemoPanel()   //創建箱線圖面板

正態分布圖算法描述


6.1 正態分布圖算法基本描述

該算法是在給定一些數據集的情況下繪制出符合該數據集的正態分布圖。

  1. 定義:正態分布具有鍾型曲線,曲線對稱,中央部位的概率密度最大。
  2. 符號解釋:無。
  3. 具體計算方法:該算法是利用JFreeChart里的jar包里的類和方法來繪制正態分布圖的。

6.2算法的應用場景

在需要繪制正態分布圖的時候使用該算法。

6.3算法的優缺點

  • 優點是可以很快速的建立一個正態分布圖
  • 缺點是無法直接讀出方差。

6.4算法的輸入輸出

輸入:

* @param  Pie's name  string 表示面板名稱 My Chart

* @param  u  double  表示均值  2

* @param  squal_t  double  表示方差  0.25

* @param  Line's name  string 表示線條名稱  Chart

* @param  Pictuer's name  string 表示圖片名稱 Pictuer Chart

java代碼實現:

package pictuer;
import java.awt.Dimension;
import java.util.Scanner;
import javax.swing.JPanel;
import org.jfree.chart.*;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.function.NormalDistributionFunction2D;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
public class NormalDistributionDemo1 extends ApplicationFrame
{
	/**
	 * 構造函數,用來創建面板用來存放圖片
	 * @param s 表示面板的名稱
	 */
	public NormalDistributionDemo1(String s)
	{
		super(s);
		JPanel jpanel = createDemoPanel();//jpanel  創建面板的名稱
		jpanel.setPreferredSize(new Dimension(500, 270));
		setContentPane(jpanel);
	}
	/**
	 * 創建正態分布圖面板
	 * @return 返回正態分布圖面板
	 */
	public static JPanel createDemoPanel()
	{
		JFreeChart jfreechart = createChart(createDataset());//jfreechart 圖形變量,通過圖形數據和圖形名稱創建圖形
		return new ChartPanel(jfreechart);//ChartPanel 圖形面板變量
	}
	/**
	 * 獲得繪制正態分布圖所需的數據 
	 * @return 返回正態分布圖所需的數據
	 */
	public static XYDataset createDataset()
	{
		Double u=2.0;
		Double squal_t=0.25;
		NormalDistributionFunction2D normaldistributionfunction2d = new NormalDistributionFunction2D(u, squal_t);
		//normaldistributionfunction2d  數據變量,用來存放數軸的數據
		String Line_name;
		Line_name="Chart";
		XYDataset xydataset = DatasetUtilities.sampleFunction2D(normaldistributionfunction2d, -5D, 5D, 100, Line_name);
		//xydataset  數據變量,用來存放和設置數軸的數據
		return xydataset;
	}
	/**
	 * 創建正態分布圖
	 * @param xydataset  數據變量,用來存放和設置數軸的數據
	 * @return 返回正態分布圖
	 */
	public static JFreeChart createChart(XYDataset xydataset)
	{
		String Pictuer_name;
		Pictuer_name="Chart";
		JFreeChart jfreechart = ChartFactory.createXYLineChart(Pictuer_name, "X", "Y", xydataset, PlotOrientation.VERTICAL, true, true, false);
		//jfreechart  圖形變量,用來裝載圖形
		return jfreechart;
	}
	public static void main(String args[])
	{
		/**
		 * 繪制正態分布圖
		 * @author cuit
		 * @return 返回正態分布圖
		 */
		String Pie_name;
		Pie_name="My Chart";
		NormalDistributionDemo1 normaldistributiondemo1 = new NormalDistributionDemo1(Pie_name);
		//normaldistributiondemo1   構造方法實例變量
		normaldistributiondemo1.pack();
		RefineryUtilities.centerFrameOnScreen(normaldistributiondemo1);
		normaldistributiondemo1.setVisible(true);
	}
}

 輸出:

6.5導致算法異常

無。

6.6代碼的算法參考

類源碼:見源程序:Panel. src. All_Pictuer. NormalDistributionDemo1

本算法是通過輸入正態分布圖的數據集來繪制出餅圖的具體實現。

類和方法調用接口

見源程序:Panel. src. All_Pictuer. NormalDistributionDemo1

NormalDistributionDemo1.java 下包含如下方法:

NormalDistributionDemo1(String s)  //構造函數,創建面板用來存放圖片

createDataset()  //獲得繪制正態分布圖所需的數據

createChart(XYDataset xydataset)   //創建正態分布圖

createDemoPanel()   //創建正態分布圖面板

7 本章總結


 7.1 基本概念

7.2 各種圖形優缺點

 

8 開源共享 


 PPT:http://yunpan.cn/cFJWt8MBFduhX  訪問密碼 ad2e

開源代碼:http://yunpan.cn/cFJW5EazGX5mz  訪問密碼 9304


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM