Example #1
0
        /// <summary>
        /// Returns the range for the data points of the series.
        /// </summary>
        /// <param name="rangeConsumer">Consumer of the range.</param>
        /// <returns>Range of values.</returns>
        protected override Range <IComparable> IRangeProviderGetRange(IRangeConsumer rangeConsumer)
        {
            if (rangeConsumer == ActualDependentAxis)
            {
                IEnumerable <Range <double> > dependentValueRangesByIndependentValue = IndependentValueDependentValues
                                                                                       .Select(g => g.Where(d => ValueHelper.CanGraph(d)))
                                                                                       .Select(g => g.Scan(0.0, (s, t) => s + t).Skip(1).GetRange())
                                                                                       .DefaultIfEmpty(new Range <double>(0, 0))
                                                                                       .ToArray();
                double minimum = dependentValueRangesByIndependentValue.Min(r => r.Minimum);
                double maximum = dependentValueRangesByIndependentValue.Max(r => r.Maximum);

                if (IsStacked100)
                {
                    minimum = Math.Min(minimum, 0);
                    maximum = Math.Max(maximum, 0);
                }

                return(new Range <IComparable>(minimum, maximum));
            }
            else
            {
                return(base.IRangeProviderGetRange(rangeConsumer));
            }
        }
 /// <summary>
 /// Update axes when a data point's effective independent value changes.
 /// </summary>
 private void UpdateActualIndependentAxis()
 {
     if (InternalActualIndependentAxis != null)
     {
         ICategoryAxis categoryAxis = InternalActualIndependentAxis as ICategoryAxis;
         if (categoryAxis != null)
         {
             IDataProvider categoryInformationProvider = (IDataProvider)this;
             categoryAxis.DataChanged(categoryInformationProvider, categoryInformationProvider.GetData(categoryAxis));
         }
         IRangeConsumer rangeAxis = InternalActualIndependentAxis as IRangeConsumer;
         if (rangeAxis != null)
         {
             IRangeProvider rangeInformationProvider = (IRangeProvider)this;
             rangeAxis.RangeChanged(rangeInformationProvider, rangeInformationProvider.GetRange(rangeAxis));
         }
     }
 }
        /// <summary>
        /// Returns the actual range of data for a given axis.
        /// </summary>
        /// <param name="consumer">The axis to retrieve the range for.</param>
        /// <returns>The actual range of data.</returns>
        protected virtual Range <IComparable> GetRange(IRangeConsumer consumer)
        {
            if (consumer == null)
            {
                throw new ArgumentNullException("consumer");
            }

            if (consumer == InternalActualDependentAxis)
            {
                if (this.DataPointsByActualDependentValue.Count > 0)
                {
                    return(this.DataPointsByActualDependentValue.GetKeyRange());
                }
            }

            IAxis axis = consumer as IAxis;

            return((axis != null)
                ? ActiveDataPoints.Select(dataPoint => (IComparable)GetActualDataPointAxisValue(dataPoint, axis)).GetRange()
                : new Range <IComparable>());
        }
 /// <summary>
 /// Returns the data range.
 /// </summary>
 /// <param name="rangeConsumer">The consumer requesting the range.</param>
 /// <returns>The data range.</returns>
 Range <IComparable> IRangeProvider.GetRange(IRangeConsumer rangeConsumer)
 {
     return(GetRange(rangeConsumer));
 }
        /// <summary>
        /// Returns the range for the data points of the series.
        /// </summary>
        /// <param name="rangeConsumer">Consumer of the range.</param>
        /// <returns>Range of values.</returns>
        protected override Range<IComparable> IRangeProviderGetRange(IRangeConsumer rangeConsumer)
        {
            if (rangeConsumer == ActualDependentAxis)
            {
                IEnumerable<Range<double>> dependentValueRangesByIndependentValue = IndependentValueDependentValues
                    .Select(g => g.Where(d => ValueHelper.CanGraph(d)))
                    .Select(g => g.Scan(0.0, (s, t) => s + t).Skip(1).GetRange())
                    .DefaultIfEmpty(new Range<double>(0, 0))
                    .ToArray();
                double minimum = dependentValueRangesByIndependentValue.Min(r => r.Minimum);
                double maximum = dependentValueRangesByIndependentValue.Max(r => r.Maximum);

                if (IsStacked100)
                {
                    minimum = Math.Min(minimum, 0);
                    maximum = Math.Max(maximum, 0);
                }

                return new Range<IComparable>(minimum, maximum);
            }
            else
            {
                return base.IRangeProviderGetRange(rangeConsumer);
            }
        }
 /// <summary>
 /// Returns the range for the data points of the series.
 /// </summary>
 /// <param name="rangeConsumer">Consumer of the range.</param>
 /// <returns>Range of values.</returns>
 protected virtual Range<IComparable> IRangeProviderGetRange(IRangeConsumer rangeConsumer)
 {
     if (rangeConsumer == ActualIndependentAxis)
     {
         if (ActualIndependentAxis.CanPlot(0.0))
         {
             return IndependentValueGroups
                 .Select(g => ValueHelper.ToDouble(g.IndependentValue))
                 .Where(d => ValueHelper.CanGraph(d))
                 .DefaultIfEmpty()
                 .CastWrapper<IComparable>()
                 .GetRange();
         }
         else
         {
             return IndependentValueGroups
                 .Select(g => ValueHelper.ToDateTime(g.IndependentValue))
                 .DefaultIfEmpty()
                 .CastWrapper<IComparable>()
                 .GetRange();
         }
     }
     throw new NotSupportedException();
 }
 /// <summary>
 /// Returns the range for the data points of the series.
 /// </summary>
 /// <param name="rangeConsumer">Consumer of the range.</param>
 /// <returns>Range of values.</returns>
 Range<IComparable> IRangeProvider.GetRange(IRangeConsumer rangeConsumer)
 {
     return IRangeProviderGetRange(rangeConsumer);
 }
 /// <summary>
 /// If data is found returns the minimum and maximum dependent numeric
 /// values. 
 /// </summary>
 /// <param name="rangeConsumer">IRangeConsumer that needs the data.</param>
 /// <returns>
 /// The range of values or empty if no data is present.
 /// </returns>
 public Range<IComparable> GetRange(IRangeConsumer rangeConsumer)
 {
     // Use an empty range so we only plot over the area used by other
     // axes.
     return new Range<IComparable>();
 }
        protected override Range<IComparable> IRangeProviderGetRange(IRangeConsumer rangeConsumer)
        {
            if (rangeConsumer == ActualDependentAxis)
            {
                var dependentValuesByIndependentValue = IndependentValueDependentValues.Select(e => e.ToArray()).ToArray();

                var mostNegative = dependentValuesByIndependentValue
                    .Select(g => g.Where(v => v < 0)
                        .Sum())
                    .Where(v => v < 0)
                    .ToArray();
                var leastNegative = dependentValuesByIndependentValue
                    .Select(g => g.Where(v => v <= 0)
                        .DefaultIfEmpty(1.0)
                        .First())
                    .Where(v => v <= 0)
                    .ToArray();
                var mostPositive = dependentValuesByIndependentValue
                    .Select(g => g.Where(v => 0 < v)
                        .Sum())
                    .Where(v => 0 < v)
                    .ToArray();
                var leastPositive = dependentValuesByIndependentValue
                    .Select(g => g.Where(v => 0 <= v)
                        .DefaultIfEmpty(-1.0)
                        .First())
                    .Where(v => 0 <= v)
                    .ToArray();

                // Compute minimum
                double minimum = 0;
                if (mostNegative.Any())
                {
                    minimum = mostNegative.Min();
                }
                else if (leastPositive.Any())
                {
                    minimum = leastPositive.Min();
                }

                // Compute maximum
                double maximum = 0;
                if (mostPositive.Any())
                {
                    maximum = mostPositive.Max();
                }
                else if (leastNegative.Any())
                {
                    maximum = leastNegative.Max();
                }

                if (IsStacked100)
                {
                    minimum = Math.Min(minimum, 0);
                    maximum = Math.Max(maximum, 0);
                }

                return new Range<IComparable>(minimum, maximum);
            }
            else if (rangeConsumer == ActualIndependentAxis)
            {
                // Using a non-ICategoryAxis for the independent axis
                // Need to specifically adjust for slot size of bars/columns so they don't overlap
                // Note: Calculation for slotSize is not perfect, but it's quick, close, and errs on the safe side
                Range<IComparable> range = base.IRangeProviderGetRange(rangeConsumer);
                int count = Math.Max(IndependentValueGroups.Count(), 1);
                if (ActualIndependentAxis.CanPlot(0.0))
                {
                    double minimum = ValueHelper.ToDouble(range.Minimum);
                    double maximum = ValueHelper.ToDouble(range.Maximum);
                    double slotSize = (maximum - minimum) / count;
                    return new Range<IComparable>(minimum - slotSize, maximum + slotSize);
                }
                else
                {
                    DateTime minimum = ValueHelper.ToDateTime(range.Minimum);
                    DateTime maximum = ValueHelper.ToDateTime(range.Maximum);
                    TimeSpan slotSize = TimeSpan.FromTicks((maximum - minimum).Ticks / count);
                    return new Range<IComparable>(minimum - slotSize, maximum + slotSize);
                }
            }
            else
            {
                return base.IRangeProviderGetRange(rangeConsumer);
            }
        }
 /// <summary>
 /// If data is found returns the minimum and maximum dependent numeric
 /// values.
 /// </summary>
 /// <param name="rangeConsumer">IRangeConsumer that needs the data.</param>
 /// <returns>
 /// The range of values or empty if no data is present.
 /// </returns>
 public Range <IComparable> GetRange(IRangeConsumer rangeConsumer)
 {
     // Use an empty range so we only plot over the area used by other
     // axes.
     return(new Range <IComparable>());
 }
        /// <summary>
        /// Returns the actual range of data for a given axis.
        /// </summary>
        /// <param name="consumer">The axis to retrieve the range for.</param>
        /// <returns>The actual range of data.</returns>
        protected virtual Range<IComparable> GetRange(IRangeConsumer consumer)
        {
            if (consumer == null)
            {
                throw new ArgumentNullException("consumer");
            }

            if (consumer == InternalActualDependentAxis)
            {
                if (this.DataPointsByActualDependentValue.Count > 0)
                {
                    return this.DataPointsByActualDependentValue.GetKeyRange();
                }
            }

            IAxis axis = consumer as IAxis;
            return (axis != null)
                ? ActiveDataPoints.Select(dataPoint => (IComparable)GetActualDataPointAxisValue(dataPoint, axis)).GetRange() 
                : new Range<IComparable>();
        }
        protected override Range <IComparable> IRangeProviderGetRange(IRangeConsumer rangeConsumer)
        {
            if (rangeConsumer == ActualDependentAxis)
            {
                var dependentValuesByIndependentValue = IndependentValueDependentValues.Select(e => e.ToArray()).ToArray();

                var mostNegative = dependentValuesByIndependentValue
                                   .Select(g => g.Where(v => v < 0)
                                           .Sum())
                                   .Where(v => v < 0)
                                   .ToArray();
                var leastNegative = dependentValuesByIndependentValue
                                    .Select(g => g.Where(v => v <= 0)
                                            .DefaultIfEmpty(1.0)
                                            .First())
                                    .Where(v => v <= 0)
                                    .ToArray();
                var mostPositive = dependentValuesByIndependentValue
                                   .Select(g => g.Where(v => 0 < v)
                                           .Sum())
                                   .Where(v => 0 < v)
                                   .ToArray();
                var leastPositive = dependentValuesByIndependentValue
                                    .Select(g => g.Where(v => 0 <= v)
                                            .DefaultIfEmpty(-1.0)
                                            .First())
                                    .Where(v => 0 <= v)
                                    .ToArray();

                // Compute minimum
                double minimum = 0;
                if (mostNegative.Any())
                {
                    minimum = mostNegative.Min();
                }
                else if (leastPositive.Any())
                {
                    minimum = leastPositive.Min();
                }

                // Compute maximum
                double maximum = 0;
                if (mostPositive.Any())
                {
                    maximum = mostPositive.Max();
                }
                else if (leastNegative.Any())
                {
                    maximum = leastNegative.Max();
                }

                if (IsStacked100)
                {
                    minimum = Math.Min(minimum, 0);
                    maximum = Math.Max(maximum, 0);
                }

                return(new Range <IComparable>(minimum, maximum));
            }
            else if (rangeConsumer == ActualIndependentAxis)
            {
                // Using a non-ICategoryAxis for the independent axis
                // Need to specifically adjust for slot size of bars/columns so they don't overlap
                // Note: Calculation for slotSize is not perfect, but it's quick, close, and errs on the safe side
                Range <IComparable> range = base.IRangeProviderGetRange(rangeConsumer);
                int count = Math.Max(IndependentValueGroups.Count(), 1);
                if (ActualIndependentAxis.CanPlot(0.0))
                {
                    double minimum  = ValueHelper.ToDouble(range.Minimum);
                    double maximum  = ValueHelper.ToDouble(range.Maximum);
                    double slotSize = (maximum - minimum) / count;
                    return(new Range <IComparable>(minimum - slotSize, maximum + slotSize));
                }
                else
                {
                    DateTime minimum  = ValueHelper.ToDateTime(range.Minimum);
                    DateTime maximum  = ValueHelper.ToDateTime(range.Maximum);
                    TimeSpan slotSize = TimeSpan.FromTicks((maximum - minimum).Ticks / count);
                    return(new Range <IComparable>(minimum - slotSize, maximum + slotSize));
                }
            }
            else
            {
                return(base.IRangeProviderGetRange(rangeConsumer));
            }
        }