教你用MSChart控件绘制正态分布图形
一年多的“潜伏”也算是深资“特务”了,长时间看别人的博客,自己却没有写点东东,对不起那些园中劳碌的人。今天终于可以“洗牌”了做正常劳苦大众。那也得感谢是项目交付期,有了“空挡”可以写点什么,让大家拍砖。
今天主讲是的绘制正态分布图形所用的质量指标公式的,不注重讲MSChart图形控件的用法,MSChart图形控件博园中有很多实例。正态分布图形所用的质量指标如下: USL(下规格线简称:下限)、USL(上限)、SIGMA(西格玛)、XBAR(平均值)、SAMPLE DATA(样本数据)、Zoom Multiple(缩放倍数)、Most Precision(最大精度)。
- Most Precision:最大精度,即小数点后面的位数长度。
View Code
1 /// <summary> 2 /// 获取数据序列的最大精度 (即小数点后面的位数长度) 3 /// </summary> 4 /// <param name="sampleData">样本数据</param> 5 /// <returns></returns> 6 public static int GetMostPrecision(List<decimal> sampleData) 7 { 8 if (sampleData == null || sampleData.Count == 0) 9 { 10 return 0; 11 } 12 13 int mostPrecision = 0; 14 int tempValue = 0; 15 16 foreach (decimal value in sampleData) 17 { 18 string data = Math.Abs(value).ToString(); 19 int dateLength = data.Length; 20 int dotIndex = data.IndexOf("."); 21 22 if (dotIndex > 0) 23 { 24 tempValue = dateLength - (dotIndex + 1); 25 } 26 27 if (tempValue > mostPrecision) //取更大的精度 28 { 29 mostPrecision = tempValue; 30 } 31 } 32 33 return mostPrecision; 34 }
- Zoom Multiple:缩放倍数,为了增加图形边沿线的平滑度。
View Code
1 /// <summary> 2 /// 缩放倍数 3 /// </summary> 4 /// <param name="mostPrecision"></param> 5 /// <returns></returns> 6 private static decimal ZoomMultiple(ref int mostPrecision) 7 { 8 decimal zoomMultiple = (decimal)Math.Pow(10, mostPrecision - 1); 9 10 if (mostPrecision <= 2) //保证精度大于二的数据序列图形的平滑 11 { 12 mostPrecision = 4; 13 zoomMultiple = 100; 14 } 15 16 return zoomMultiple; 17 }
- SAMPLE DATA:样本数据是概率运算里的一个概念。随机抽取的部分用于计算出性能优良的数量。
- XBAR:这个大家好理解,也很好计算。即是所有样本数据之和的平均值。
View Code
1 double xbar = Math.Round(sampleData.Average(), mostPrecision);
- SIGMA:是一个希腊字母σ的中文译音,在统计学中,代表标准偏差,用来对过程变异进行测量。
View Code
1 /// <summary> 2 /// 计算Sigma 3 /// </summary> 4 /// <param name="sampleData">样本数据</param> 5 /// <param name="xbar">平均值</param> 6 /// <returns></returns> 7 public static double CalculateSigma(List<decimal> sampleData, double xbar) 8 { 9 double sigma = 0; 10 int sampleCount = sampleData.Count; 11 double powSum = 0; 12 13 if (sampleData == null || sampleCount <= 2 14 ) //样本个数大于2计算才有意思 15 { 16 return sigma; 17 } 18 19 foreach (double value in sampleData) 20 { 21 powSum += Math.Pow(value - xbar, 2); //样本值减去均值2的次幂相加。 22 } 23 24 sigma = Math.Sqrt(powSum / (sampleCount - 1)); 25 26 return sigma; 27 }
- USL和LSL一般是抽样人员事先设置好的,也可以用公式得到:
View Code
1 double usl = xbar + 3 * sigma;//均值加3sigma 2 double lsl = xbar - 3 * sigma;//均值减3sigma
上面是正态分布图所用到的指标计算公式或方法,公式的解析详情http://zhidao.baidu.com/question/86348249.html?an=0&si=5 下面该介绍正态分布的公式或方法,至于MSChart样式设置略讲,如有需要联系我 kingzheng@yeah.net
首先清除图表Series集合上的数据点:
1 chart.Series[serieIndex].Points.Clear();
X轴正、负界限以及正态公式系数:
1 int positiveLimit = (int)((xbar + 6 * sigma) * zoomMultiple); //X轴的正界限 2 int minusLimit = (int)((xbar - 6 * sigma) * zoomMultiple); //X轴的负界限 3 double coefficient = Math.Round(1 / Math.Sqrt(2 * Math.PI) / sigma, mostPrecision); //系数;如果计算需要精确,就不要四舍五入;建议:为了提高运算效率要四舍五入。
根据公式生成正态图形所需要的数据点:
1 List<double> xValues = new List<double>(); 2 List<double> yValues = new List<double>(); 3 4 for (int x = minusLimit; x <= positiveLimit; x++) 5 { 6 //x轴缩小zoomMultiple倍x每隔1/zoomMultiple变化曲线变平滑 7 double xValue = x / zoomMultiple; 8 double yValue = coefficient * Math.Exp(Math.Pow((xValue - xbar), 2) / (-2 * Math.Pow(sigma, 2))); 9 xValue = Math.Round(xValue, mostPrecision); 10 yValue = Math.Round(yValue, mostPrecision); 11 if (yValue > 0.0001)//可设为yValue > 0 12 { 13 xValues.Add(xValue); 14 yValues.Add(yValue); 15 } 16 } 17 18 //为MSChart绑定数据值 19 chart.Series[serieIndex].Points.DataBindXY(xValues, yValues);
为了确保图形显示完全,调整X和Y轴的最大值和最小值刻度:
1 if (yValues.Count > 0) 2 { 3 yAxisMax = 0; 4 return; 5 6 } 7 //将Y轴最大值放大倍作为 8 double yMax = Math.Round(yValues.Max() * 1.1, args.MostPrecision); 9 double xMin = xValues.Min(); 10 double xMax = xValues.Max(); 11 double yMin = yValues.Min(); 12 yAxisMax = yValues.Max(); 13 14 if (xMin > lsl) 15 { 16 xMin = lsl; 17 } 18 if (xMax < usl) 19 { 20 xMax = usl; 21 } 22 //设置轴值x轴加减极大极小值的1/zoomMultiple倍是为了图形能全部绘制出来 23 chart.ChartAreas[0].AxisX.Minimum = (double)Math.Round(xMin - xMin * 1 / zoomMultiple, mostPrecision); 24 chart.ChartAreas[0].AxisX.Maximum = (double)Math.Round(xMax + xMax * 1 / zoomMultiple, mostPrecision); 25 chart.ChartAreas[0].AxisY.Minimum = (double)Math.Round(yMin, mostPrecision); 26 chart.ChartAreas[0].AxisY.Maximum = (double)Math.Round(yMax, mostPrecision);
分别添加XBAR、USL、LSL阈值限函数如下:
1 /// <summary> 2 /// 添加阈值线 3 /// </summary> 4 /// <param name="chartArea">图形Area</param> 5 /// <param name="lineName">在线显示的名子</param> 6 /// <param name="lineOffset">线在图上的位置</param> 7 /// <param name="lineWidth">线宽</param> 8 /// <param name="lineColor">线的颜色</param> 9 public void AddStripLine(ChartArea chartArea, string lineName, double lineOffset, double lineWidth, Color lineColor) 10 { 11 StripLine stripLine = new StripLine 12 { 13 BackColor = lineColor, 14 StripWidth = lineWidth, 15 BackHatchStyle = ChartHatchStyle.DarkVertical, 16 Text = lineName, 17 TextAlignment = StringAlignment.Far, 18 TextLineAlignment = StringAlignment.Center, 19 IntervalOffset = lineOffset 20 }; 21 22 chartArea.AxisY.StripLines.Add(stripLine); 23 }
最后是根据样本值重置X轴的最大和最小刻度
1 /// <summary> 2 /// 根据sampleData的最大和最小值重设X轴的最大和最小刻度 3 /// </summary> 4 /// <param name="queueValue"></param> 5 public static void ResetAxisBySampleData(List<decimal> sampleData, Chart chart) 6 { 7 if (sampleData == null || sampleData.Count <= 0) 8 { 9 SwapValue(chart); 10 return; 11 } 12 13 double max = (double) sampleData.Max(); 14 double min = (double) sampleData.Min(); 15 double xMax = chart.ChartAreas[0].AxisX.Maximum; 16 double xMin = chart.ChartAreas[0].AxisX.Minimum; 17 18 if (xMin > xMax) 19 { 20 chart.ChartAreas[0].AxisX.Minimum = min; 21 chart.ChartAreas[0].AxisX.Maximum = max; 22 } 23 }
以上是正态分布图所用到的指标和函数,正态直方图所用到的指标和函数下次再讲,时间仓促,写的不细。如有不明的请发邮件,我们一起探讨。Mail:kingzheng@yeah.net 如要转发,请注明出处!
教你用MSChart控件绘制正态分布图形相关推荐
- 利用MsChart控件绘制多曲线图表 z
在.Net4.0框架中,微软已经将Mschart控件集成了进来,以前一直在web下面用过,原来winform下的Mschart控件更加简单更加方便,今天我们用mschart绘制一个多曲线图,话不多说, ...
- 基于mschart控件,绘制工控采集类曲线,可对图像进行缩放,拖动滚动条显示放大后的图像
基于mschart控件,绘制工控采集类曲线,可对图像进行缩放,拖动滚动条显示放大后的图像,并动态显示曲线上的数值点 在工控.采集.测试类项目中经常需要对采集接收回来的数据进行图像.曲线显示,本人在项目 ...
- C# mschart 控件的基本使用和图表控件Series的概念
使用sharpdevelop: 此工具默认没有mschart控件:把如下dll添加到引用: 工具箱里面把控件加出来:sharpdevelop加控件到工具箱见此: https://blog.csdn.n ...
- 解决找不到MSchart 控件Microsoft Chart Control, version 6.0
最近用VC在做网站,需要将捕捉到的数据进行处理,就是绘制一个心电. 结果在添加这个MSchart 控件的时候 步骤:网站->添加引用->COM组件-> 却郁闷的找不到Microsof ...
- 解决 MSChart控件 X轴坐标显示不全的问题
前一阵子做开发用到微软的MSChart控件,功能虽然强大,但是从来没用过,一直处在摸索之中,一个小问题花了半天时间去研究.终于把X轴坐标显示不全的问题给解决了,当然也在网上找了很多的资料才搞定的,今天 ...
- C# mschart 控件 框选 删除部分数据 及游标CursorX CursorY 使用
C# mschart 控件 框选 删除部分数据 实现功能 : 1.鼠标框选,选中chart控件中部分数据: 2.将选中的数据标红显示: 3.删除选中的红色数据: demo源码下载:https://gi ...
- 使用.net 的Chart控件绘制曲线图
System.Windows.Forms.DataVisualization.Charting 命名空间 System.Windows.Forms.DataVisualization.Charting ...
- MsChart控件在VC++中的使用
关于MsChart控件的注册: 32位系统之下 1.将mschrt20.ocx放在windows/system32目录下.注意,这个文件名中的没有字母a,即没有写chart中的字母a,就是这一细节让我 ...
- c# 使用dotnetbar 控件绘制曲线图形
废话不说,直接上过程 加载dotnetbar库后,将chartcontrol控件拖动到界面上,选择line polt 增加一个按钮,绘制曲线功能 private void buttonX26_Clic ...
- Android源码解析:UI绘制流程之控件绘制
带着问题看源码 再接再厉,我们来分析UI绘制流程最后一步绘制流程 入口ViewRootImpl.performDraw()方法 private void performDraw() {//...try ...
最新文章
- SQL Relay开源的数据库池连接代理服务器
- Flink Forward Asia 2020 - Keynote 总结
- JObject 用法 、JProperty 用法、JArray 用法 Linq 转 Json
- “数据中台”是什么?
- 1.7 编程基础之字符串 34 回文子串 python
- c调用python代码找不到模块_构建 Python C 扩展模块
- RDD Join 性能调优
- 第一次当项目经理压力大_项目经理不想被甩锅,你要这样做进度管理
- 利用搜索引擎实现关键词爬取内容
- RSA加解密VS加签与验签
- MyBatis学习笔记(2)-MyBatis入门
- ppt母版的神奇用法
- 2进制原码反码补码,2进制加减乘除原理
- 计算机两个硬盘如何区分,双硬盘电脑怎么设置主从盘?
- mysql slave 1062_mysql主从同步slave错误1062
- 夸克浏览器网页版入口网址分享
- 55-经典问题分析四
- 打工妹变身董事长,是早有预谋还是认知使然——解密《天道》肖亚文逆袭之路
- python期末复习提纲
- 读书笔记 - -《Python网络编程》重点
热门文章
- 三菱PLC-GXWorks2程序下载
- 《精通开关电源设计》笔记
- 海康威视多路播放开发步骤及参考代码
- ArcPad 10 的安装和部署
- 计算机怎么格式化硬盘,如何格式化硬盘
- 某中学校校园网络方案设计(课程设计)
- 联合密度函数求期望_已知(X,Y)的联合概率密度,分别求X,Y的期望、方差
- scrollTop、clientHeight、 scrollHeight...学完真的理解了
- Hadoop The Definitive Guide:Hadoop权威指南-PART 1
- 全屏轮播代码淘宝店铺装修天-猫装修店铺装修代码全屏