/// <summary> /// Filters the <see cref="DataFrameBuilder.Points"/> down to just those that are /// visible if the graph has been zoomed in. /// This method only filters based on the value on the Base Axis /// (i.e. the X-Axis for most curves). /// </summary> public virtual DataFrameBuilder FilterToZoomedRange(DataFrameBuilder dataFrameBuilder) { var graphPane = dataFrameBuilder.GraphPane; var pointList = dataFrameBuilder.Points; var baseAxis = dataFrameBuilder.CurveItem.BaseAxis(graphPane); if (baseAxis.Scale.IsAnyOrdinal) { // If the Scale is either Ordinal or Text, then don't // filter the PointList, because the point values // are derived from their position in the list. return dataFrameBuilder; } Func<PointPair, double> valueOfPointFunc = ValueOfPointFuncForAxis(dataFrameBuilder, baseAxis); if (null == valueOfPointFunc) { return dataFrameBuilder; } double min = baseAxis.Scale.Min; double max = baseAxis.Scale.Max; var pointPairList = new PointPairList(); for (int i = 0; i < pointList.Count; i++) { var pointPair = pointList[i]; double value = valueOfPointFunc(pointPair); if (value < min || value > max) { continue; } pointPairList.Add(pointPair); } return dataFrameBuilder.SetPoints(pointPairList); }
/// <summary> /// Returns a <see cref="DataColumn"/> containing the values on the <paramref name="axis"/>. /// If <see cref="Scale.IsText"/> is true for the <see cref="Axis.Scale"/>, /// then the DataColumn will contain string values. /// </summary> protected virtual DataColumn GetColumnForAxis(DataFrameBuilder dataFrameBuilder, Axis axis) { if (axis == null) { return(null); } if (axis.Scale.IsText) { var textValues = new string[dataFrameBuilder.Points.Count]; Array.Copy(axis.Scale.TextLabels, 0, textValues, 0, Math.Min(textValues.Length, axis.Scale.TextLabels.Length)); return(new DataColumn <string>(axis.Title.Text, textValues)); } if (axis.Scale.IsOrdinal) { return(new DataColumn <int>(axis.Title.Text, Enumerable.Range(0, dataFrameBuilder.Points.Count))); } var values = new double[dataFrameBuilder.Points.Count]; var valueOfPoint = ValueOfPointFuncForAxis(dataFrameBuilder, axis); if (valueOfPoint != null) { for (int i = 0; i < dataFrameBuilder.Points.Count; i++) { values[i] = valueOfPoint(dataFrameBuilder.Points[i]); } } if (values.Any(value => PointPairBase.Missing == value)) { var valuesWithNull = values.Select(value => PointPairBase.Missing == value ? (double?)null : value); return(new DataColumn <double?>(axis.Title.Text, valuesWithNull)); } return(new DataColumn <double>(axis.Title.Text, values)); }
protected override DataFrameBuilder AddColumns(DataFrameBuilder dataFrameBuilder) { dataFrameBuilder = AddColumnForAxis(dataFrameBuilder, dataFrameBuilder.BaseAxis); var points = dataFrameBuilder.Points; var apexes = new double?[points.Count]; var starts = new double?[points.Count]; var fwhms = new double?[points.Count]; for (int i = 0; i < points.Count; i++) { var point = points[i]; if (point.IsMissing) { continue; } starts[i] = point.Z; var middleErrorTag = point.Tag as MiddleErrorTag; if (middleErrorTag != null) { apexes[i] = middleErrorTag.Middle; fwhms[i] = middleErrorTag.Error; } } var dataFrame = new DataFrame(dataFrameBuilder.ValueAxis.Title.Text, dataFrameBuilder.Points.Count); dataFrame = dataFrame.AddColumn(new DataColumn<double?>("Apex", apexes)); // Not L10N dataFrame = dataFrame.AddColumn(new DataColumn<double?>("Start", starts)); // Not L10N dataFrame = dataFrame.AddColumn(GetColumnForAxis(dataFrameBuilder, dataFrameBuilder.ValueAxis).SetTitle("End")); // Not L10N dataFrame = dataFrame.AddColumn(new DataColumn<double?>("FWHM", fwhms)); // Not L10N dataFrameBuilder = dataFrameBuilder.AddColumn(dataFrame); return dataFrameBuilder; }
protected override DataFrameBuilder AddColumns(DataFrameBuilder dataFrameBuilder) { dataFrameBuilder = AddColumnForAxis(dataFrameBuilder, dataFrameBuilder.BaseAxis); // Group the "High" and "Low" columns together, and put the title from the Axis on top of them var dataFrame = new DataFrame(dataFrameBuilder.ValueAxis.Title.Text, dataFrameBuilder.Points.Count); dataFrame = dataFrame.AddColumn(GetColumnForAxis(dataFrameBuilder, dataFrameBuilder.ValueAxis).SetTitle("High")); // Not L10N dataFrame = dataFrame.AddColumn(GetZAxisColumn(dataFrameBuilder.Points).SetTitle("Low")); // Not L10N dataFrameBuilder = dataFrameBuilder.SetDataFrame(dataFrameBuilder.DataFrame.AddColumn(dataFrame)); return dataFrameBuilder; }
private DataFrameBuilder(DataFrameBuilder dataFrameBuilder) { GraphPane = dataFrameBuilder.GraphPane; CurveItem = dataFrameBuilder.CurveItem; Points = dataFrameBuilder.Points; XAxis = dataFrameBuilder.XAxis; YAxis = dataFrameBuilder.YAxis; BaseAxis = dataFrameBuilder.BaseAxis; ValueAxis = dataFrameBuilder.ValueAxis; DataFrame = dataFrameBuilder.DataFrame; }
private DataFrameBuilder(DataFrameBuilder dataFrameBuilder) { GraphPane = dataFrameBuilder.GraphPane; CurveItem = dataFrameBuilder.CurveItem; Points = dataFrameBuilder.Points; XAxis = dataFrameBuilder.XAxis; YAxis = dataFrameBuilder.YAxis; BaseAxis = dataFrameBuilder.BaseAxis; ValueAxis = dataFrameBuilder.ValueAxis; DataFrame = dataFrameBuilder.DataFrame; }
/// <summary> /// Adds columns to the <see cref="DataFrameBuilder.DataFrame"/> for all /// of the data in the <see cref="DataFrameBuilder.Points"/>. /// </summary> protected virtual DataFrameBuilder AddColumns(DataFrameBuilder dataFrameBuilder) { dataFrameBuilder = AddColumnForAxis(dataFrameBuilder, dataFrameBuilder.BaseAxis); dataFrameBuilder = AddColumnForAxis(dataFrameBuilder, dataFrameBuilder.ValueAxis); if (HasZAxis(dataFrameBuilder)) { dataFrameBuilder = dataFrameBuilder.AddColumn(GetZAxisColumn(dataFrameBuilder.Points)); } dataFrameBuilder = dataFrameBuilder.AddColumn(GetTagColumn(dataFrameBuilder.Points)); return(dataFrameBuilder); }
public static GraphPaneData GetGraphPaneData(GraphPane graphPane) { var dataFrames = new List <DataFrame>(); var rowHeaderToListIndex = new Dictionary <IColumnGroup, int>(); foreach (var curveItem in graphPane.CurveList) { var curveHandler = CurveDataHandlers.FindCurveHandler(curveItem); if (curveHandler == null) { continue; } var curveData = new DataFrameBuilder(graphPane, curveItem); curveData = curveHandler.FilterToZoomedRange(curveData); curveData = curveHandler.CreateDataFrame(curveData); var dataFrame = curveData.DataFrame; if (dataFrame == null) { continue; } var rowHeader = dataFrame.RowHeader; int existingIndex; if (rowHeader != null && rowHeaderToListIndex.TryGetValue(rowHeader, out existingIndex)) { DataFrame previousFrame = dataFrames[existingIndex]; DataFrame mergedFrame; if (null == previousFrame.Title) { mergedFrame = previousFrame.AddColumn(dataFrame.RemoveRowHeader()); } else { mergedFrame = new DataFrame(null, rowHeader) .AddColumn(previousFrame.RemoveRowHeader()) .AddColumn(dataFrame.RemoveRowHeader()); } dataFrames[existingIndex] = mergedFrame; } else { if (rowHeader != null) { rowHeaderToListIndex.Add(rowHeader, dataFrames.Count); } dataFrames.Add(dataFrame); } } if (dataFrames.Count == 0) { return(null); } return(new GraphPaneData(graphPane.Title.Text, dataFrames)); }
protected override DataFrameBuilder AddColumns(DataFrameBuilder dataFrameBuilder) { dataFrameBuilder = AddColumnForAxis(dataFrameBuilder, dataFrameBuilder.BaseAxis); // Group the "High" and "Low" columns together, and put the title from the Axis on top of them var dataFrame = new DataFrame(dataFrameBuilder.ValueAxis.Title.Text, dataFrameBuilder.Points.Count); dataFrame = dataFrame.AddColumn(GetColumnForAxis(dataFrameBuilder, dataFrameBuilder.ValueAxis).SetTitle("High")); // Not L10N dataFrame = dataFrame.AddColumn(GetZAxisColumn(dataFrameBuilder.Points).SetTitle("Low")); // Not L10N dataFrameBuilder = dataFrameBuilder.SetDataFrame(dataFrameBuilder.DataFrame.AddColumn(dataFrame)); return(dataFrameBuilder); }
public static GraphPaneData GetGraphPaneData(GraphPane graphPane) { var dataFrames = new List<DataFrame>(); var rowHeaderToListIndex = new Dictionary<IColumnGroup, int>(); foreach (var curveItem in graphPane.CurveList) { var curveHandler = CurveDataHandlers.FindCurveHandler(curveItem); if (curveHandler == null) { continue; } var curveData = new DataFrameBuilder(graphPane, curveItem); curveData = curveHandler.FilterToZoomedRange(curveData); curveData = curveHandler.CreateDataFrame(curveData); var dataFrame = curveData.DataFrame; if (dataFrame == null) { continue; } var rowHeader = dataFrame.RowHeader; int existingIndex; if (rowHeader != null && rowHeaderToListIndex.TryGetValue(rowHeader, out existingIndex)) { DataFrame previousFrame = dataFrames[existingIndex]; DataFrame mergedFrame; if (null == previousFrame.Title) { mergedFrame = previousFrame.AddColumn(dataFrame.RemoveRowHeader()); } else { mergedFrame = new DataFrame(null, rowHeader) .AddColumn(previousFrame.RemoveRowHeader()) .AddColumn(dataFrame.RemoveRowHeader()); } dataFrames[existingIndex] = mergedFrame; } else { if (rowHeader != null) { rowHeaderToListIndex.Add(rowHeader, dataFrames.Count); } dataFrames.Add(dataFrame); } } if (dataFrames.Count == 0) { return null; } return new GraphPaneData(graphPane.Title.Text, dataFrames); }
/// <summary> /// Determines whether <paramref name="axis"/> is the X-Axis or the Y-Axis, /// and returns a function that returns either <see cref="PointPair.X"/> or /// <see cref="PointPair.Y"/>. /// Returns null if the axis is neither. /// </summary> protected virtual Func <PointPair, double> ValueOfPointFuncForAxis(DataFrameBuilder dataFrameBuilder, Axis axis) { if (axis is XAxis || axis is X2Axis || ReferenceEquals(axis, dataFrameBuilder.XAxis)) { return(point => point.X); } if (axis is YAxis || axis is Y2Axis || ReferenceEquals(axis, dataFrameBuilder.YAxis)) { return(point => point.Y); } Trace.TraceError("Could not determine type of axis {0}", axis); // Not L10N return(null); }
/// <summary> /// Adds the data for the <paramref name="axis"/> to the <see cref="DataFrameBuilder.DataFrame"/>. /// If <paramref name="axis"/> is the <see cref="CurveItem.BaseAxis"/> then the column /// is added as the <see cref="DataFrame.RowHeader"/>, otherwise it is added /// to <see cref="DataFrame.ColumnGroups"/>. /// The X-Axis is usually the base axis, but for bar graphs that display horizontally, /// the Y-Axis is the base axis. /// </summary> protected virtual DataFrameBuilder AddColumnForAxis(DataFrameBuilder dataFrameBuilder, Axis axis) { var column = GetColumnForAxis(dataFrameBuilder, axis); if (column == null) { return(dataFrameBuilder); } var dataFrame = dataFrameBuilder.DataFrame; if (dataFrame.RowHeader == null && ReferenceEquals(axis, dataFrameBuilder.BaseAxis)) { dataFrame = dataFrame.SetRowHeaders(column); } else { dataFrame = dataFrame.AddColumn(column); } return(dataFrameBuilder.SetDataFrame(dataFrame)); }
/// <summary> /// Filters the <see cref="DataFrameBuilder.Points"/> down to just those that are /// visible if the graph has been zoomed in. /// This method only filters based on the value on the Base Axis /// (i.e. the X-Axis for most curves). /// </summary> public virtual DataFrameBuilder FilterToZoomedRange(DataFrameBuilder dataFrameBuilder) { var graphPane = dataFrameBuilder.GraphPane; var pointList = dataFrameBuilder.Points; var baseAxis = dataFrameBuilder.CurveItem.BaseAxis(graphPane); if (baseAxis.Scale.IsAnyOrdinal) { // If the Scale is either Ordinal or Text, then don't // filter the PointList, because the point values // are derived from their position in the list. return(dataFrameBuilder); } Func <PointPair, double> valueOfPointFunc = ValueOfPointFuncForAxis(dataFrameBuilder, baseAxis); if (null == valueOfPointFunc) { return(dataFrameBuilder); } double min = baseAxis.Scale.Min; double max = baseAxis.Scale.Max; var pointPairList = new PointPairList(); for (int i = 0; i < pointList.Count; i++) { var pointPair = pointList[i]; double value = valueOfPointFunc(pointPair); if (value < min || value > max) { continue; } pointPairList.Add(pointPair); } return(dataFrameBuilder.SetPoints(pointPairList)); }
public virtual DataFrameBuilder CreateDataFrame(DataFrameBuilder dataFrameBuilder) { dataFrameBuilder = dataFrameBuilder.SetDataFrame(new DataFrame(dataFrameBuilder.CurveItem.Label.Text, dataFrameBuilder.Points.Count)); dataFrameBuilder = AddColumns(dataFrameBuilder); return(dataFrameBuilder); }
protected override DataFrameBuilder AddColumns(DataFrameBuilder dataFrameBuilder) { dataFrameBuilder = AddColumnForAxis(dataFrameBuilder, dataFrameBuilder.BaseAxis); dataFrameBuilder = AddColumnForAxis(dataFrameBuilder, dataFrameBuilder.ValueAxis); var points = dataFrameBuilder.Points; var errors = new double?[points.Count]; for (int i = 0; i < points.Count; i++) { var point = points[i]; if (point.IsMissing) { continue; } var errorTag = point.Tag as ErrorTag; if (errorTag != null) { errors[i] = errorTag.Error; } } dataFrameBuilder = dataFrameBuilder.AddColumn(new DataColumn<double?>("StdErr", errors)); // Not L10N return dataFrameBuilder; }
public virtual DataFrameBuilder CreateDataFrame(DataFrameBuilder dataFrameBuilder) { dataFrameBuilder = dataFrameBuilder.SetDataFrame(new DataFrame(dataFrameBuilder.CurveItem.Label.Text, dataFrameBuilder.Points.Count)); dataFrameBuilder = AddColumns(dataFrameBuilder); return dataFrameBuilder; }
/// <summary> /// Determines whether <paramref name="axis"/> is the X-Axis or the Y-Axis, /// and returns a function that returns either <see cref="PointPair.X"/> or /// <see cref="PointPair.Y"/>. /// Returns null if the axis is neither. /// </summary> protected virtual Func<PointPair, double> ValueOfPointFuncForAxis(DataFrameBuilder dataFrameBuilder, Axis axis) { if (axis is XAxis || axis is X2Axis || ReferenceEquals(axis, dataFrameBuilder.XAxis)) { return point => point.X; } if (axis is YAxis || axis is Y2Axis || ReferenceEquals(axis, dataFrameBuilder.YAxis)) { return point => point.Y; } Trace.TraceError("Could not determine type of axis {0}", axis); // Not L10N return null; }
/// <summary> /// Returns true if any of the values in <see cref="PointPair.Z"/> are nonzero. /// </summary> protected bool HasZAxis(DataFrameBuilder dataFrameBuilder) { return AsEnumerable(dataFrameBuilder.Points).Any(point => 0 != point.Z); }
/// <summary> /// Returns a <see cref="DataColumn"/> containing the values on the <paramref name="axis"/>. /// If <see cref="Scale.IsText"/> is true for the <see cref="Axis.Scale"/>, /// then the DataColumn will contain string values. /// </summary> protected virtual DataColumn GetColumnForAxis(DataFrameBuilder dataFrameBuilder, Axis axis) { if (axis == null) { return null; } if (axis.Scale.IsText) { var textValues = new string[dataFrameBuilder.Points.Count]; Array.Copy(axis.Scale.TextLabels, 0, textValues, 0, Math.Min(textValues.Length, axis.Scale.TextLabels.Length)); return new DataColumn<string>(axis.Title.Text, textValues); } if (axis.Scale.IsOrdinal) { return new DataColumn<int>(axis.Title.Text, Enumerable.Range(0, dataFrameBuilder.Points.Count)); } var values = new double[dataFrameBuilder.Points.Count]; var valueOfPoint = ValueOfPointFuncForAxis(dataFrameBuilder, axis); if (valueOfPoint != null) { for (int i = 0; i < dataFrameBuilder.Points.Count; i++) { values[i] = valueOfPoint(dataFrameBuilder.Points[i]); } } if (values.Any(value=>PointPairBase.Missing == value)) { var valuesWithNull = values.Select(value => PointPairBase.Missing == value ? (double?) null : value); return new DataColumn<double?>(axis.Title.Text, valuesWithNull); } return new DataColumn<double>(axis.Title.Text, values); }
/// <summary> /// Adds columns to the <see cref="DataFrameBuilder.DataFrame"/> for all /// of the data in the <see cref="DataFrameBuilder.Points"/>. /// </summary> protected virtual DataFrameBuilder AddColumns(DataFrameBuilder dataFrameBuilder) { dataFrameBuilder = AddColumnForAxis(dataFrameBuilder, dataFrameBuilder.BaseAxis); dataFrameBuilder = AddColumnForAxis(dataFrameBuilder, dataFrameBuilder.ValueAxis); if (HasZAxis(dataFrameBuilder)) { dataFrameBuilder = dataFrameBuilder.AddColumn(GetZAxisColumn(dataFrameBuilder.Points)); } dataFrameBuilder = dataFrameBuilder.AddColumn(GetTagColumn(dataFrameBuilder.Points)); return dataFrameBuilder; }
/// <summary> /// Adds the data for the <paramref name="axis"/> to the <see cref="DataFrameBuilder.DataFrame"/>. /// If <paramref name="axis"/> is the <see cref="CurveItem.BaseAxis"/> then the column /// is added as the <see cref="DataFrame.RowHeader"/>, otherwise it is added /// to <see cref="DataFrame.ColumnGroups"/>. /// The X-Axis is usually the base axis, but for bar graphs that display horizontally, /// the Y-Axis is the base axis. /// </summary> protected virtual DataFrameBuilder AddColumnForAxis(DataFrameBuilder dataFrameBuilder, Axis axis) { var column = GetColumnForAxis(dataFrameBuilder, axis); if (column == null) { return dataFrameBuilder; } var dataFrame = dataFrameBuilder.DataFrame; if (dataFrame.RowHeader == null && ReferenceEquals(axis, dataFrameBuilder.BaseAxis)) { dataFrame = dataFrame.SetRowHeaders(column); } else { dataFrame = dataFrame.AddColumn(column); } return dataFrameBuilder.SetDataFrame(dataFrame); }
/// <summary> /// Returns true if any of the values in <see cref="PointPair.Z"/> are nonzero. /// </summary> protected bool HasZAxis(DataFrameBuilder dataFrameBuilder) { return(AsEnumerable(dataFrameBuilder.Points).Any(point => 0 != point.Z)); }