在SPC分析中,正态分布图是使用较为频繁的图表。
本文介绍一下如何在Thingworx中绘制正态分布图。
如图所示,我们可以看到图表中包含:数据的分布情况(每个数据区间的数量),和参考正态分布曲线。
1.
绘图工具和注意项
我们可以用Label Chart工具来绘制图形。
注意不要选中“SingleDataSource”,这样我们可以引用两个数据源。
第1个数据源引用自数据分布集,SeriesType1=Bar。
第2个数据源引用自正态分布集,SeriesType2=Line。
两个数据集的X值应一致。
启用“YAxisAutoscale”,因为两个数据集的Y值是不一样的,自动缩放后数据会落到相同区间。
2.
数据分布计算
我们可以根据平均值和标准差来计算数据的分布。
标准差(σ)的计算可参考我的文章《Thingworx中的SPC计算工具》。
为了简化计算,我们选取常用的±3σ这个范围。
计算很简单,但是要注意一点:柱状图的X轴显示的是引用范围的起始值,但是我们在正态分布图中参考的是范围平均值,因此在最后,我们要把柱状图X轴加上0.5σ。
下面是代码:
------------------------------------------------------------------------------
// To generate Histogram dataset for SPC
// Developed by Tallrain, Dec 2019
// Input
//
avg = Average
//
sd = Standard Deviation
//
spcTable = SPC data, with field of SPC1 for data value
// Output
//
infoTable, with fields of value and count
var bar1 = avg-3*sd;
var bar2 = avg-2*sd;
var bar3 = avg-1*sd;
var bar4 = avg;
var bar5 = avg+1*sd;
var bar6 = avg+2*sd;
var bar7 = avg+3*sd;
var v1 = 0;
var v2 = 0;
var v3 = 0;
var v4 = 0;
var v5 = 0;
var v6 = 0;
//var v7 = 0;
var tableLength = spcTable.rows.length;
for (var x=0; x < tableLength; x++) {
var row = spcTable.rows[x];
var v = row.SPC1;
if(v>=bar1 && v
if(v>=bar2 && v
if(v>=bar3 && v
if(v>=bar4 && v
if(v>=bar5 && v
if(v>=bar6 && v
}
bar1 = bar1 + sd*0.5;
bar2 = bar2 + sd*0.5;
bar3 = bar3 + sd*0.5;
bar4 = bar4 + sd*0.5;
bar5 = bar5 + sd*0.5;
bar6 = bar6 + sd*0.5;
bar7 = bar7 + sd*0.5;
// Output data
var params = {
infoTableName : "InfoTable",
dataShapeName : "DS_SPC_Histogram"
};
//CreateInfoTableFromDataShape(infoTableName:STRING("InfoTable"),
dataShapeName:STRING):INFOTABLE(DS_SPC_CPK_OUT)
var spcOut =
Resources["InfoTableFunctions"].CreateInfoTableFromDataShape(params);
spcOut.AddRow({value:bar1, count:v1});
spcOut.AddRow({value:bar2, count:v2});
spcOut.AddRow({value:bar3, count:v3});
spcOut.AddRow({value:bar4, count:v4});
spcOut.AddRow({value:bar5, count:v5});
spcOut.AddRow({value:bar6, count:v6});
//spcOut.AddRow({value:bar7, count:0});
var result = spcOut;
------------------------------------------------------------------------------
3.
正态分布计算
算法可参考WIKI。
在这里为了和柱状图契合,我们按照每0.5σ为基础单位进行计算。
要说明的是,正态分布公式的值并不是概率,X区间和曲线相交的面积才是概率。
具体的值和平均值、标准差相关,所以在绘制图表时要允许Y轴自动绽放,这样两个图才能匹配。
下面是代码:
------------------------------------------------------------------------------
// Generate SPC Normal Distribution
// Developed by Tallrain, Nov 2019
// Input
//
u = Average
//
sd = Standard Deviation
// Output
//
infoTable, with field of x and np
// Create temp InfoTable for output
var params = {
infoTableName : "InfoTable",
dataShapeName : "DS_Normal_Distrib"
};
//
CreateInfoTableFromDataShape(infoTableName:STRING("InfoTable"),
dataShapeName:STRING):INFOTABLE(DS_Normal_Distrib)
var tempInfoTable =
Resources["InfoTableFunctions"].CreateInfoTableFromDataShape(params);
// calculate normal distribution data
var e = Math.E; //2.71828182846;
var pi = Math.PI; // 3.14159265359;
for (var i=1; i <= 13; i++) {
var x = (i-7)/2;
x
= u + x*sd;
var dividend = Math.pow(e,
0-((x-u)*(x-u)/(2*sd*sd)));
var divisor = sd*Math.sqrt(2*pi);
var np = dividend/divisor;
//const dividend = Math.E ** -((value - this.mean) ** 2 / (2 *
this.standardDeviation ** 2));
//const divisor = this.standardDeviation * Math.sqrt(2 * Math.PI);
//var np = 0-(x-u)*(x-u)/(2*sd*sd);
//logger.info('np='+np);
//np = Math.pow(e,np);
//var np2 = sd*Math.sqrt(2*pi);
//np = np/np2;
//logger.info('np='+np);
tempInfoTable.AddRow({x:x, np:np});
}
var result = tempInfoTable;
//var result = Math.pow(3,2);
------------------------------------------------------------------------------