ArcGISPortalViewer.Popup.Primitives.Charting.BarChart.GetLabelValues C# (CSharp) Method

GetLabelValues() static private method

static private GetLabelValues ( Range dataRange, double maxLabel ) : IEnumerable
dataRange Range
maxLabel double
return IEnumerable
        internal static IEnumerable<double> GetLabelValues(Range dataRange, double maxLabel)
        {
            double maxValue = Math.Max(-dataRange.Min, dataRange.Max);
            if (maxValue <= 0.0) // all values equal to 0
            {
                yield return 0.0;
            }
            else
            {
                double nbDigit = Math.Ceiling(Math.Log10(maxValue / maxLabel));
                double step = Math.Pow(10, nbDigit); // increment the label by a power of 10

                if (step * 1.5 > maxValue)
                    step /= 2; // label 5 by 5 else only one label that may be far and thus inelegant

                for (double current = 0.0; current <= dataRange.Max + step / 2.0; current += step)
                {
                    yield return current;
                }
                for (double current = -step; current >= dataRange.Min - step / 2.0; current -= step)
                {
                    yield return current;
                }
            }
        }

Usage Example

        private Grid _series;         // grid for series of points

        /// <summary>
        /// Generates the column chart.
        /// </summary>
        protected override void GenerateChart()
        {
            RootElement.Children.Clear();
            var data = ItemsSource;

            if (data != null && data.Any())
            {
                double max       = Math.Max(0, data.Values.Max());
                double min       = Math.Min(0, data.Values.Min());
                Range  dataRange = new Range(min, max);

                // Get the label values
                var labels = BarChart.GetLabelValues(dataRange, MaxLabel).ToArray();

                // The label might be out of the current range (e.g if max value = '99', there will be a label '100')
                // Extend the range to include the labels
                dataRange.Min = Math.Min(dataRange.Min, labels.Min());
                dataRange.Max = Math.Max(dataRange.Max, labels.Max());

                // Create chart main structure
                GenerateChartStructure();

                // Generate the labels
                foreach (double val in labels)
                {
                    GenerateLabel(val, dataRange);
                }

                // Generate data points
                foreach (var kvp in data)
                {
                    GenerateDataPoint(kvp, dataRange);
                }
            }
        }