Ejemplo n.º 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));
            }
        }
        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));
            }
        }