信息圖形化:第一印象
作者 白寧超
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。那么什么是標度呢?
標度:標度是指圖形縱軸上每段的大小。
數據:不添加任何修飾成分的原始事實與數字,比如說:對、錯;1、2、3 。
信息:是指加入了某種修飾成分的數據,比如說:這個答案是對的;這個小孩3歲 。
前面的准備工作做完了,那么我們現在來看看什么叫餅圖吧。
餅圖為圓形,被分割為幾個扇形塊,每一塊代表一個組(類),扇形塊的大小表示這類數據占總體的比例即頻數。
頻數:一個特定組中的對象數目稱為頻數。
餅圖將整個數據計划分為幾個互不相干的組。這意味着,如果把每個扇形塊的頻數加起來,結果應為100%。
請根據餅圖的定義將下面這張表格轉化為餅圖:
下面總結餅圖的優缺點及應用場景:
優點:在進行比例比較的時候,可以一眼看出哪個組具有較高的頻數。
缺點:當每種類型的比例大小相差不大時,我們很難根據扇形塊的大小來比較頻數的高低。
應用場景:根據扇形的優缺點我們可以知道,扇形只能適用於比例相差較大的情況下頻數的比較。
該算法是在給定一些數據集的情況下繪制出符合該數據集的餅圖。
- 定義:餅圖是將圓形分割為幾個扇形塊,每一塊代表一個組(類),扇形塊的大小表示這類數據占總體的比例。
- 符號解釋:無。
- 具體計算方法:該算法是利用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 條形圖算法描述
2.1 條形圖算法基本描述
條形圖
通過前面我們知道了餅圖的基本特征,那么請看看下面這張餅圖有什么問題吧。
這個餅圖的問題就在於很難一眼看出哪一類玩家的滿意度最高。用於扇形塊所占整體比例無關的百分數來標識餅圖通常也會讓人犯暈,例如,“體育”塊標示着99%,但這一塊在餅圖中所占的比例僅為20%左右。另一個問題是,我們不知道每種游戲的反饋數目是否相等,因此也無法知道用這種方式對滿意度進行比較是否公正。
餅圖的作用是對不同組(或者類)所占的比例進行比較,但在這個例子中,各個組的比例相差無幾,這就是餅圖失效的地方,那么究竟什么圖可以完成這種情況呢?那么我們就得引入條形圖了。
條形圖:條形圖是用一個一個間隔的長方形來表示的,每一個長方形代表一個特定的類,長方形的長度代表某種數值。長方形越長,數值越大,所有長方形的寬都是相等的。
垂直條形圖
條形圖分為垂直條形圖和水平條形圖兩種,下面我們就來看看垂直條形圖的具體畫法:
水平條形圖
同樣是將上面的表格轉換成水平條形圖(水平條形圖跟垂直條形圖相比,只是坐標軸調換了一下而已)
在一般情況下,我們經常用垂直條形圖,但在類名稱太長的時候,水平條形圖就有用了----你將有大量空白位置標示每個類的名稱,不用橫七豎八的進行擺布。
百分度標度:類的數目的大小是用百分數來表示的。
在使用百分度標度時,一定要設法指出頻數-----或是將頻數標在圖形中間,或是標在圖形旁邊。
頻數標度:類的數目的大小是用數字而非百分數表示的。
在使用頻數標度時,一定要小心縱軸的起點,通常縱軸的起點是從0開始,不過當使用不以0為起點的縱軸可以讓數據給人不同的第一印象。
堆積條形圖
堆積條形圖:將同一種類的不同的屬性分別用兩個相連的的長方形在一張條形圖
下面總結堆積條形圖的優缺點及應用場景: 優點:黨比表同一種類的不同屬性的頻數的時候很簡單明了。
缺點:很難看出某個類的比例和屬性的比例。
應用場景:同一個類有多個屬性而我們只需比較不同屬性之間的頻數
分段條形圖
分段條形圖:將同一種類的不同的屬性分段在一個長方形上展示
下面總結分段條形圖的優缺點及應用場景:
優點:可以很清晰的看出每個類的總和和各個屬性的比例。
缺點:不容易看出各個屬性的頻數。
應用場景:同一個類有多個屬性而我們需要比較各個類的比較或不同屬性之間的比例。
該算法是在給定一些數據集的情況下繪制出符合該數據集的條形圖。
- 定義:條形圖是用一個一個間隔的長方形來表示的,每一個長方形代表一個特定的類,長方形的長度代表某種數值。
- 符號解釋:無。
- 具體計算方法:該算法是利用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 直方圖算法描述
3.1 直方圖算法基本描述
該算法是在給定一些數據集的情況下繪制出符合該數據集的直方圖。
- 定義:直方圖是用一個一個連續的長方形來表示的,每一個長方形代表一個特定的類,長方形的長度代表某種數值。
- 符號解釋:無。
- 具體計算方法:該算法是利用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 折線圖算法描述
4.1 折線圖算法基本描述
當我們在處理存在負增長的數據時我們就不能用累計頻數圖了,因為累計頻數圖永遠都是增長的,那么這個時候我們就該用到折線圖了。
折線圖:用來體現數據型數據的發展趨勢的。
那么我們現在來看一下根據下面的這張表轉換成折線圖的畫法吧。
該算法是在給定一些數據集的情況下繪制出符合該數據集的折線圖。
- 定義:折線圖用來體現數據型數據的發展趨勢的。
- 符號解釋:無。
- 具體計算方法:該算法是利用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 箱線圖算法描述
5.1 箱線圖算法基本描述
該算法是在給定一些數據集的情況下繪制出符合該數據集的箱線圖。
- 定義:箱線圖是用來顯示數據的全距、四分位距以及中位數的圖形。
- 符號解釋:無。
- 具體計算方法:該算法是利用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 正態分布圖算法描述
6.1 正態分布圖算法基本描述
該算法是在給定一些數據集的情況下繪制出符合該數據集的正態分布圖。
- 定義:正態分布具有鍾型曲線,曲線對稱,中央部位的概率密度最大。
- 符號解釋:無。
- 具體計算方法:該算法是利用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 各種圖形優缺點