Changeset 14008


Ignore:
Timestamp:
07/06/16 14:50:17 (14 months ago)
Author:
bburlacu
Message:

#2594: Added chart util method to calculate the "optimal" axis interval (reducing the number of fractional digits to make it look nice). Modified the regression solution line chart and scatter plot to use the new scaling method.

Location:
trunk/sources
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionLineChartView.cs

    r12012 r14008  
    2626using System.Windows.Forms.DataVisualization.Charting;
    2727using HeuristicLab.MainForm;
     28using HeuristicLab.Visualization.ChartControlsExtensions;
    2829
    2930namespace HeuristicLab.Problems.DataAnalysis.Views {
     
    9697        this.ToggleSeriesData(this.chart.Series[ESTIMATEDVALUES_ALL_SERIES_NAME]);
    9798
     99        // set the y-axis bounds
     100        var axisY = this.chart.ChartAreas[0].AxisY;
     101        double min = double.MaxValue, max = double.MinValue;
     102        foreach (var point in chart.Series.SelectMany(x => x.Points)) {
     103          if (!point.YValues.Any() || double.IsInfinity(point.YValues[0]) || double.IsNaN(point.YValues[0]))
     104            continue;
     105          var y = point.YValues[0];
     106          if (y < min)
     107            min = y;
     108          if (y > max)
     109            max = y;
     110        }
     111
     112        double axisMin, axisMax, axisInterval;
     113        ChartUtil.CalculateOptimalAxisInterval(min, max, out axisMin, out axisMax, out axisInterval);
     114        axisY.Minimum = axisMin;
     115        axisY.Maximum = axisMax;
     116        axisY.Interval = axisInterval;
     117
    98118        UpdateCursorInterval();
    99119        this.UpdateStripLines();
  • trunk/sources/HeuristicLab.Problems.DataAnalysis.Views/3.4/Regression/RegressionSolutionScatterPlotView.cs

    r13958 r14008  
    171171
    172172        double axisMin, axisMax, axisInterval;
    173         ChartUtil.CalculateAxisInterval(min, max, 5, out axisMin, out axisMax, out axisInterval);
     173        ChartUtil.CalculateOptimalAxisInterval(min, max, out axisMin, out axisMax, out axisInterval);
    174174        this.chart.ChartAreas[0].AxisX.Maximum = axisMax;
    175175        this.chart.ChartAreas[0].AxisX.Minimum = axisMin;
  • trunk/sources/HeuristicLab.Visualization.ChartControlsExtensions/3.3/ChartUtil.cs

    r14007 r14008  
    4343    }
    4444
     45    // this method tries to find an axis interval with as few fractional digits as possible (because it looks nicer)
     46    // we only try between 3 and 5 ticks (inclusive) because it wouldn't make sense to exceed this interval
     47    public static void CalculateOptimalAxisInterval(double min, double max, out double axisMin, out double axisMax, out double axisInterval) {
     48      CalculateAxisInterval(min, max, 5, out axisMin, out axisMax, out axisInterval);
     49      int bestLsp = int.MaxValue;
     50      for (int ticks = 3; ticks <= 5; ++ticks) {
     51        double aMin, aMax, aInterval;
     52        CalculateAxisInterval(min, max, ticks, out aMin, out aMax, out aInterval);
     53        var x = aInterval;
     54        int lsp = 0; // position of the least significant fractional digit
     55        while (x - Math.Floor(x) > 0) {
     56          ++lsp;
     57          x *= 10;
     58        }
     59        if (lsp <= bestLsp) {
     60          axisMin = aMin;
     61          axisMax = aMax;
     62          axisInterval = aInterval;
     63          bestLsp = lsp;
     64        }
     65      }
     66    }
     67
    4568    private static int Decimals(this double x) {
    4669      if (x.IsAlmost(0) || double.IsInfinity(x) || double.IsNaN(x))
     
    4871
    4972      var v = Math.Abs(x);
    50       int d = 0;
     73      int d = 1;
    5174      while (v < 1) {
    5275        v *= 10;
Note: See TracChangeset for help on using the changeset viewer.