【程序员眼中的统计学(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

转载于:https://www.cnblogs.com/baiboy/p/tjx1.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JBoss AS 7.0.2“ Arc”发布–使用绑定选项

有关JBoss AS7方面的更多好消息。 JBoss AS 7.0.2.Final“ Arc”已经发布&#xff01; 自AS 7.0.1发布以来已经过去了一个月。 在这短时间内&#xff0c;已修复了许多错误&#xff0c;并实现了更多功能和改进。 所有这些错误修复和功能已包含在此7.0.2版本中。 此新版本主要包…

Android N 新特性 + APP开发注意事项

1. 多窗口MultiWindow 多窗口MultiWindow&#xff0c;这是Android N里对开发者影响比较大的特性&#xff0c;也是大家疑问比较多的地方。站在开发者的角度其实不必太担心这个特性会导致我们需要修改很多代码来适配系统。Google的工程师们也不希望这个特性导致很多应用出现问题&…

C语言开发笔记(六)实参和形参

举例说明 #include <stdio.h>void swap(int x, int y) {int temp 0;temp x;x y;y temp; }int main(void) {int a 1, b 2;swap(a, b);printf("a%d, b%d\n", a, b);return 0; }结果为 在函数调用时&#xff0c;a的值传给x&#xff0c;b的值传给y。执行完…

优化方案电子版_关于小区分支道路整修设计方案的讨论稿(No.2020121)

各位业主&#xff0c;大家好&#xff01; 关于绿洲比华利花园主干道翻新和次干道整修前期勘查和设计方案&#xff0c;经业委会及小区专家小组、设计单位申都设计公司工程设计人员结合本小区的实际情况进行了深入讨论&#xff0c;优化设计&#xff0c;形成如下三个独立方案&…

为什么有的开关电源需要加自举电容?

一、什么是自举电路&#xff1f; 1.1 自举的概念 首先&#xff0c;自举电路也叫升压电路&#xff0c;是利用自举升压二极管&#xff0c;自举升压电容等电子元件&#xff0c;使电容放电电压和电源电压叠加&#xff0c;从而使电压升高。有的电路升高的电压能达到数倍电源电压。…

VS2010报错 error:LINK1123:转换到COF期间失败,文件无限或损坏

右键工程-配置属性-清单工具-输入和输出&#xff0c;嵌入清单一项重新选择为否&#xff0c;如下图 修改后重新生成和运行&#xff0c;发现程序正常运行了。

springboot 整合mybatis_SpringBoot整合Mybatis、MybatisPuls

文末视频讲解SpringBoot的版本是2.2.0一、整合Mybatis1-1、引入pom文件<dependency> <groupId>mysqlgroupId> <artifactId>mysql-connector-javaartifactId> <version>8.0.19version> dependency> <dependency> &l…

为旧版代码创建存根–测试技术6

任何阅读此博客的人都可能已经意识到&#xff0c;目前我正在开发一个包含大量旧代码的项目&#xff0c;这些旧代码庞大&#xff0c;扩展且编写时从未进行过任何测试。 在使用此遗留代码时&#xff0c;有一个行为异常的类非常普遍&#xff0c;整个团队都一次又一次地犯错。 为了…

python性能解决_我们如何发现并解决Python代码中性能下降的问题

Python部落(python.freelycode.com)组织翻译&#xff0c;禁止转载&#xff0c;欢迎转发。 作者&#xff1a;Omer Lachish 最近&#xff0c;我们已经开始使用RQ库代替Celery库作为我们的任务运行引擎。第一阶段&#xff0c;我们只迁移了那些不直接进行查询工作的任务。这些任务包…

图灵机器人调用数据恢复_机器人也能撩妹?python程序员自制微信机器人,替他俘获女神芳心...

机器人也有感情还记得王传君饰演的《星语心愿之再爱》这部电影吗&#xff1f;王传君饰演的天才程序员“王鹏鹏”因工作原因不能陪伴照顾身在异地的女朋友“林亦男”&#xff0c;呆萌宅男“王鹏鹏”开发出一款以自己为原型的“王鹏鹏8.0”程序去陪伴异地恋的女友&#xff0c;后来…

Spark排错与优化

一. 运维 1. Master挂掉,standby重启也失效 Master默认使用512M内存&#xff0c;当集群中运行的任务特别多时&#xff0c;就会挂掉&#xff0c;原因是master会读取每个task的event log日志去生成spark ui&#xff0c;内存不足自然会OOM&#xff0c;可以在master的运行日志中看到…

在MySQL上使用带密码的GlassFish JDBC安全性

我在该博客上最成功的文章之一是有关在GlassFish上使用基于表单的身份验证来建立JDBC安全领域的文章 。 对这篇文章的一些评论使我意识到&#xff0c;要真正使它安全&#xff0c;应该做的还很多。 开箱即用的安全性 图片&#xff1a; TheKenChan &#xff08; CC BY-NC 2.0 &a…

利用python进行数据分析_利用python进行数据分析复现(1)

&#xfeff;一直以来&#xff0c;都想学习python数据分析相关的知识&#xff0c;总是拖拖拉拉&#xff0c;包括这次这个分享也是。《利用python进行数据分析 第2版》是一次无意之间在简书上看到的一个分享&#xff0c;我决定将很详细。一直都想着可以复现一下。但总有理由&…

C语言代码规范(七)#define

#define 宏定义的使用 #define MAX(x, y) ( ((x) > (y)) ? (x) : (y) ) #define MIN(x, y) ( ((x) < (y)) ? (x) : (y) ) 在宏定义中要把参数用括号扩起来( ((x) > (y)) ? (x) : (y) )。 因为宏只是简单的文本替换&#xff0c;如果不注意&#xff0c;很容…

http 二进制_浅谈HTTP协议

HTTP一、HTTP协议http协议&#xff0c;是超文本传输协议&#xff0c;此协议是基于TCP/IP的协议&#xff0c;是互联网上应用最为广泛的一直网络协议是一种无状态协议&#xff0c;默认端口为80,。设计HTTP的最初目的是为了提供一种发布和接受HTML页面的方法。通过HTTP或者HTTPS协…

linux redis客户端_为什么单线程Redis能那么快?

我们通常说&#xff0c;Redis 是单线程&#xff0c;主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的&#xff0c;这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能&#xff0c;比如持久化、异步删除、集群数据同步等&#xff0c;其实是由额外的线…

C语言开发笔记(七)const和指针

const修饰变量是常用的&#xff0c;不容易犯错&#xff0c;而const和指针一起使用时很容易混淆。 (一)const int *p #include <stdio.h>int main(void) {int a 10;int b 20;const int *p &a;*p b;return 0; } const在int *的左侧&#xff0c;即指针指向内容为…

ubuntu php 无法执行exec_利用webhook使php项目自动部署

php中文网最新课程每日17点准时技术干货分享1.先来讲一下自动部署的原理&#xff0c;一般在我们push代码的时候&#xff0c;可以自动请求webhook中设置的url&#xff0c;完成一次请求与响应。那么只要我们设置的url地址请求的php文件内容是执行命令行git push命令&#xff0c;则…

C语言开发笔记(八)static

在C语言中&#xff0c;static有3个作用&#xff1a; &#xff08;1&#xff09;在函数体&#xff0c;一个被声明为静态的变量在这一函数体内被调用的过程中维持其值不变。 #include <stdio.h>void test(void) {static int i 0;printf("%d\n", i); }int main…

ppt修复无法读取_移动硬盘故障分析以及建议修复方法

移动硬盘中存储了大量的重要数据&#xff0c;一旦出现什么问题&#xff0c;会让人急得焦头烂额。换个硬盘倒是件小事&#xff0c;但其中资料、数据的丢失更令人懊恼。而在硬盘使用的过程中&#xff0c;由于使用者一时的不注意&#xff0c;往往就很容易造成意外的问题。接下来&a…