}// createPlot private PlotModel createIndivsPlotModel(Anacompo pAna, int iFactorX, int iFactorY) { PlotModel model = null; var data = pAna.RecodedInds; if (data == null) { return null; } bool bLabel = this.HasLabels; bool bImage = this.HasImages; bool bPoints = this.HasPoints; if ((!bLabel) && (!bImage) && (!bPoints)) { return null; } int nr = data.GetLength(0); int nv = data.GetLength(1); if ((nv <= iFactorX) || (nv <= iFactorX) || (nr < 1)) { return null; } var inds = this.Individus.ToArray(); nr = (inds.Length < nr) ? inds.Length : nr; if (nr < 1) { return null; } double[] xx = new double[nr]; double[] yy = new double[nr]; for (int i = 0; i < nr; ++i) { xx[i] = data[i, iFactorX]; yy[i] = data[i, iFactorY]; }// i Dictionary<String, ScatterSeries> oSeries = new Dictionary<string, ScatterSeries>(); Dictionary<int, String> dict = this.CategDictionary; model = new PlotModel("Individus", String.Format("{0} / {1}", this.YAxe, this.XAxe)); model.LegendPlacement = LegendPlacement.Outside; model.Axes.Add(new LinearAxis(AxisPosition.Bottom, xx.Min(), xx.Max(), this.XAxe) { PositionAtZeroCrossing = true }); model.Axes.Add(new LinearAxis(AxisPosition.Left, yy.Min(), yy.Max(), this.YAxe) { PositionAtZeroCrossing = true }); ScatterSeries oTrash = null; double xwidth = 3.0 * (xx.Max() - xx.Min()) / nr; for (int i = 0; i < nr; ++i) { var ind = inds[i]; int index = ind.IndivIndex; double x = data[i, iFactorX]; double y = data[i, iFactorY]; if (dict.ContainsKey(index)) { String scateg = dict[index]; if (!oSeries.ContainsKey(scateg)) { oSeries[scateg] = new ScatterSeries() { MarkerType = MarkerType.Circle }; } var color = oSeries[scateg].MarkerFill; if (bImage && (this.ImagesDisctionary != null) && this.ImagesDisctionary.ContainsKey(index)) { model.Annotations.Add(new ImageAnnotation { ImageSource = this.ImagesDisctionary[index], X= new PlotLength(x,PlotLengthUnit.Data), Y= new PlotLength(y,PlotLengthUnit.Data), HorizontalAlignment=HorizontalAlignment.Center, VerticalAlignment=VerticalAlignment.Middle, Width = new PlotLength(xwidth,PlotLengthUnit.Data) }); } if (bLabel) { String name = ind.Name; if (!String.IsNullOrEmpty(name)) { model.Annotations.Add(new TextAnnotation { Position = new DataPoint(x, y), Text = name, TextColor = color, FontWeight = FontWeights.Bold,Tag = ind }); } } if (bPoints) { oSeries[scateg].Points.Add(new ScatterPoint(x, y) { Tag = ind }); } } else { if (oTrash == null) { oTrash = new ScatterSeries(); } if (bImage && (this.ImagesDisctionary != null) && this.ImagesDisctionary.ContainsKey(index)) { model.Annotations.Add(new ImageAnnotation { ImageSource = this.ImagesDisctionary[index], X = new PlotLength(x, PlotLengthUnit.Data), Y = new PlotLength(y, PlotLengthUnit.Data), HorizontalAlignment = HorizontalAlignment.Center, VerticalAlignment = VerticalAlignment.Middle, Width = new PlotLength(xwidth, PlotLengthUnit.Data) }); } if (bLabel) { String name = ind.IdString; if (!String.IsNullOrEmpty(name)) { model.Annotations.Add(new TextAnnotation { Position = new DataPoint(x, y), Text = name, FontWeight = FontWeights.Bold , Tag=ind}); } } if (bPoints) { oTrash.Points.Add(new ScatterPoint(x, y) { Tag = ind }); } } }// inds foreach (var sx in oSeries.Values) { model.Series.Add(sx); } if (oTrash != null) { model.Series.Add(oTrash); } return model; }//createIndivsPlotModel
}// RefreshVariablesValues private EigenData computeData(Anacompo p) { String prefix = this.FactorPrefix; EigenData oRet = new EigenData(); var vals = p.EigenValues; int nv = vals.Length; double sum = vals.Sum(); if (sum <= 0.0) { return null; } DisplayItemsArray vv = new DisplayItemsArray(); DisplayItems header = new DisplayItems(); header.Add(new DisplayItem("Num", true)); header.Add(new DisplayItem("Facteur", true)); header.Add(new DisplayItem("Valeur", true)); header.Add(new DisplayItem("Taux", true)); header.Add(new DisplayItem("Cummul", true)); vv.Add(header); double s = 0.0; for (int i = 0; i < nv; ++i) { DisplayItems line = new DisplayItems(); line.Add(new DisplayItem((int)(i + 1))); String sname = String.Format("{0}{1}", prefix, i + 1); line.Add(new DisplayItem(sname)); double x = vals[i]; line.Add(new DisplayItem(x)); line.Add(new DisplayItem(x / sum)); s += x; line.Add(new DisplayItem(s / sum)); vv.Add(line); }// i oRet.EigenValues = vv; // DisplayItemsArray vecs = new DisplayItemsArray(); DisplayItems hh = new DisplayItems(); hh.Add(new DisplayItem("Variable", true)); var vx = p.EigenVectors; nv = vx.GetLength(1); int nr = vx.GetLength(0); var xnames = this.CurrentVariables.ToArray(); for (int i = 0; i < nv; ++i) { String sname = String.Format("{0}{1}", prefix, i + 1); hh.Add(new DisplayItem(sname, true)); }// i vecs.Add(hh); for (int i = 0; i < nr; ++i) { DisplayItems line = new DisplayItems(); String name = xnames[i].Name; line.Add(new DisplayItem(name)); for (int j = 0; j < nv; ++j) { double x = vx[i, j]; line.Add(new DisplayItem(x)); }// j vecs.Add(line); }// i oRet.EigenVectors = vecs; // DisplayItemsArray vecsv = new DisplayItemsArray(); DisplayItems hhv = new DisplayItems(); hhv.Add(new DisplayItem("Variable", true)); var vxv = p.RecodedVars; nv = vxv.GetLength(1); nr = vxv.GetLength(0); for (int i = 0; i < nv; ++i) { String sname = String.Format("{0}{1}", prefix, i + 1); hhv.Add(new DisplayItem(sname, true)); }// i vecsv.Add(hhv); for (int i = 0; i < nr; ++i) { DisplayItems line = new DisplayItems(); String name = xnames[i].Name; line.Add(new DisplayItem(name)); for (int j = 0; j < nv; ++j) { double x = vxv[i, j]; line.Add(new DisplayItem(x)); }// j vecsv.Add(line); }// i oRet.EigenVariables = vecsv; // DisplayItemsArray vecsx = new DisplayItemsArray(); DisplayItems hhx = new DisplayItems(); hhx.Add(new DisplayItem("Num", true)); hhx.Add(new DisplayItem("Index", true)); hhx.Add(new DisplayItem("Nom", true)); hhx.Add(new DisplayItem("Photo", true)); var vxx = p.RecodedInds; nv = vxx.GetLength(1); nr = vxx.GetLength(0); for (int i = 0; i < nv; ++i) { String sname = String.Format("{0}{1}", prefix, i + 1); hhx.Add(new DisplayItem(sname, true)); }// i vecsx.Add(hhx); var inds = this.Individus.ToArray(); for (int i = 0; i < nr; ++i) { DisplayItems line = new DisplayItems(); line.Add(new DisplayItem(i+1)); var ind = inds[i]; line.Add(new DisplayItem(ind.IndivIndex)); line.Add(new DisplayItem(ind.IdString)); line.Add(new DisplayItem(ind.Name)); if ((ind.PhotoData != null) && (ind.PhotoData.Length > 1)) { line.Add(new DisplayItem(ind.PhotoData)); } else { line.Add(new DisplayItem()); } for (int j = 0; j < nv; ++j) { double x = vxx[i, j]; line.Add(new DisplayItem(x)); }// j vecsx.Add(line); }// i oRet.EigenIndivs = vecsx; return oRet; }// computeData
}// RefreshVariablesValues private Tuple<IndivDatas, Anacompo,EigenData> refreshData() { IndivDatas dx = this.Individus; Anacompo cp = null; EigenData eigen = null; try { var oAr = this.Individus.ToArray(); int nr = oAr.Length; if (nr < 2) { return new Tuple<IndivDatas, Anacompo, EigenData>(dx, cp, eigen); } int nv = oAr[0].DoubleData.Length; if (nv < 2) { return new Tuple<IndivDatas, Anacompo, EigenData>(dx, cp, eigen); } double[,] alldata = new double[nr, nv]; List<int> zinds = new List<int>(); for (int i = 0; i < nr; ++i) { var ind = oAr[i]; zinds.Add(ind.IndivIndex); double[] dd = ind.DoubleData; for (int j = 0; j < nv; ++j) { alldata[i, j] = dd[j]; }// j }// i Exception err = null; cp = new Anacompo(); if (!cp.ComputeEigen(alldata, out err)) { cp = null; } if (cp != null) { eigen = computeData(cp); } cp.Indexes = zinds.ToArray(); } catch (Exception /*ex */) { dx = null; cp = null; } return new Tuple<IndivDatas, Anacompo,EigenData>(dx, cp,eigen); }// RefreshVariablesValues
}// reateVariablesPlotModel private PlotModel createEigenValuesPlotModel(Anacompo pAna) { PlotModel model = null; var data = pAna.EigenValues; if (data == null) { return null; } if (data.Length < 1) { return null; } int n = data.Length; double[] dd = new double[n]; for (int i = 0; i < n; ++i) { double x = data[i]; if (x < 0.0) { x = 0; } dd[i] = x; }// i double somme = dd.Sum(); if (somme <= 0.0) { return null; } model = new PlotModel("Valeurs propres"); var ps = new PieSeries(); for (int i = 0; i < n; ++i) { double x = (dd[i] / somme) * 100.0 + 0.5; if (x > 100.0) { x = 100.0; } ps.Slices.Add(new PieSlice(String.Format("FACT{0}", i + 1), x) { IsExploded = true }); } ps.InnerDiameter = 0; ps.ExplodedDistance = 0.0; ps.Stroke = OxyColors.White; ps.StrokeThickness = 2.0; ps.InsideLabelPosition = 0.8; ps.AngleSpan = 360; ps.StartAngle = 0; ps.FontWeight = FontWeights.Bold; model.Series.Add(ps); return model; }//createEigenValuesPlotMode
}//createCombinedPlotModel private PlotModel createVariablesPlotModel(Anacompo pAna, int iFactorX, int iFactorY) { PlotModel model = null; var data = pAna.RecodedVars; if (data == null) { return null; } int nr = data.GetLength(0); int nv = data.GetLength(1); if ((nv < iFactorX) || (nv < iFactorY) || (nr < 1)) { return null; } model = new PlotModel("Variables", String.Format("{0} / {1}", this.YAxe, this.XAxe)); double[] yy = new double[nr]; double[] xx = new double[nr]; String[] names = new String[nr]; var col = this.CurrentVariables.ToArray(); for (int i = 0; i < nr; ++i) { yy[i] = data[i, iFactorY]; xx[i] = data[i, iFactorX]; names[i] = (i < col.Length) ? col[i].Name : ""; }// i model.Axes.Add(new LinearAxis(AxisPosition.Bottom, -1.0, 1.0, this.XAxe) { PositionAtZeroCrossing = true }); model.Axes.Add(new LinearAxis(AxisPosition.Left, -1.0, 1.0, this.YAxe) { PositionAtZeroCrossing = true }); for (int i = 0; i < nr; ++i) { double x = xx[i]; double y = yy[i]; String sname = names[i]; model.Annotations.Add(new ArrowAnnotation { StartPoint = new DataPoint(0, 0), EndPoint = new DataPoint(x, y) }); model.Annotations.Add(new TextAnnotation { Position = new DataPoint(x, y), Text = sname }); }// i return model; }// reateVariablesPlotModel
}//createIndivsPlotModel private PlotModel createCombinedPlotModel(Anacompo pAna, int iFactorX, int iFactorY) { PlotModel model = null; var data = pAna.RecodedInds; if (data == null) { return null; } int nr = data.GetLength(0); int nv = data.GetLength(1); if ((nv <= iFactorX) || (nv <= iFactorX) || (nr < 1)) { return null; } var inds = this.Individus.ToArray(); nr = (inds.Length < nr) ? inds.Length : nr; if (nr < 1) { return null; } double[] xx = new double[nr]; double[] yy = new double[nr]; for (int i = 0; i < nr; ++i) { xx[i] = data[i, iFactorX]; yy[i] = data[i, iFactorY]; }// i Dictionary<String, ScatterSeries> oSeries = new Dictionary<string, ScatterSeries>(); Dictionary<int, String> dict = this.CategDictionary; model = new PlotModel("Individus", String.Format("{0} / {1}", this.YAxe, this.XAxe)); model.LegendPlacement = LegendPlacement.Outside; model.Axes.Add(new LinearAxis(AxisPosition.Bottom, xx.Min(), xx.Max(), this.XAxe) { PositionAtZeroCrossing = true }); model.Axes.Add(new LinearAxis(AxisPosition.Left, yy.Min(), yy.Max(), this.YAxe) { PositionAtZeroCrossing = true }); var vardata = pAna.RecodedVars; var names = this.CurrentVariables.ToArray(); for (int i = 0; i < nv; ++i) { double x = vardata[i, iFactorX]; double y = vardata[i, iFactorY]; String sname = names[i].Name; model.Annotations.Add(new ArrowAnnotation { StartPoint = new DataPoint(0, 0), EndPoint = new DataPoint(x, y), LineStyle=LineStyle.DashDotDot }); model.Annotations.Add(new TextAnnotation { Position = new DataPoint(x, y), Text = sname, HorizontalAlignment=HorizontalAlignment.Center, VerticalAlignment=VerticalAlignment.Middle}); }// i bool bLabel = this.HasLabels; ScatterSeries oTrash = null; for (int i = 0; i < nr; ++i) { var ind = inds[i]; int index = ind.IndivIndex; double x = data[i, iFactorX]; double y = data[i, iFactorY]; if (dict.ContainsKey(index)) { String scateg = dict[index]; if (!oSeries.ContainsKey(scateg)) { oSeries[scateg] = new ScatterSeries() { MarkerType = MarkerType.Circle }; } var color = oSeries[scateg].MarkerFill; if (bLabel) { String name = ind.Name; if (!String.IsNullOrEmpty(name)) { model.Annotations.Add(new TextAnnotation { Position = new DataPoint(x, y), Text = name, TextColor = color, FontWeight = FontWeights.Bold, Tag = ind,HorizontalAlignment=HorizontalAlignment.Center,VerticalAlignment=VerticalAlignment.Middle }); } } else { oSeries[scateg].Points.Add(new ScatterPoint(x, y) { Tag = ind }); } } else { if (oTrash == null) { oTrash = new ScatterSeries(); } if (bLabel) { String name = ind.IdString; if (!String.IsNullOrEmpty(name)) { model.Annotations.Add(new TextAnnotation { Position = new DataPoint(x, y), Text = name, FontWeight = FontWeights.Bold, Tag = ind,HorizontalAlignment=HorizontalAlignment.Center,VerticalAlignment=VerticalAlignment.Middle }); } } else { oTrash.Points.Add(new ScatterPoint(x, y) { Tag = ind }); } } }// inds foreach (var sx in oSeries.Values) { model.Series.Add(sx); } if (oTrash != null) { model.Series.Add(oTrash); } return model; }//createCombinedPlotModel