Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/06/15 15:01:05 (9 years ago)
Author:
ascheibe
Message:

#2351 merged r12134,r12135,r12139,r12140,r12143,r12145 into stable

Location:
stable
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • stable

  • stable/HeuristicLab.Analysis.Views

  • stable/HeuristicLab.Analysis.Views/3.3/HistogramControl.cs

    r12009 r12154  
    3131  public partial class HistogramControl : UserControl {
    3232    protected static readonly string SeriesName = "Histogram";
    33 
     33    protected static readonly decimal bandwidthMin = 0.0000000000001m;
    3434    protected Dictionary<string, List<double>> points;
     35    protected bool suppressUpdate;
     36
    3537    public int NumberOfBins {
    3638      get { return (int)binsNumericUpDown.Value; }
     
    123125    }
    124126
    125     protected void UpdateHistogram() {
     127    protected void UpdateHistogram(double bandwith = double.NaN) {
    126128      if (InvokeRequired) {
    127         Invoke((Action)UpdateHistogram, null);
     129        Invoke((Action<double>)UpdateHistogram, bandwith);
    128130        return;
    129131      }
     
    134136
    135137      chart.Series.Clear();
    136 
    137138      foreach (var point in points) {
    138139        if (!point.Value.Any()) continue;
     
    140141        Series histogramSeries = new Series(point.Key);
    141142        chart.Series.Add(histogramSeries);
    142 
    143143        double minValue = point.Value.Min();
    144144        double maxValue = point.Value.Max();
     
    165165        histogramSeries["PointWidth"] = "1";
    166166
    167         CalculateDensity(histogramSeries, point.Value);
    168 
    169167        overallMax = Math.Max(overallMax, maxValue);
    170168        overallMin = Math.Min(overallMin, minValue);
    171169      }
    172170
     171      chart.ApplyPaletteColors();
     172
     173      int i = 0;
     174      foreach (var point in points) {
     175        if (!point.Value.Any()) continue;
     176
     177        var histogramSeries = chart.Series[i];
     178        CalculateDensity(histogramSeries, point.Value, bandwith);
     179
     180        i++;
     181      }
     182
     183
    173184      ChartArea chartArea = chart.ChartAreas[0];
     185      // don't show grid lines for second y-axis
     186      chartArea.AxisY2.MajorGrid.Enabled = false;
     187      chartArea.AxisY2.MinorGrid.Enabled = false;
    174188      chartArea.AxisY.Title = "Frequency";
    175189
     
    182196    }
    183197
    184     protected void CalculateDensity(Series series, List<double> row) {
     198    protected void CalculateDensity(Series series, List<double> row, double bandwidth = double.NaN) {
    185199      string densitySeriesName = "Density " + series.Name;
    186200      double stepWidth = series.Points[1].XValue - series.Points[0].XValue;
     201      var rowArray = row.ToArray();
    187202
    188203      if (chart.Series.Any(x => x.Name == densitySeriesName)) {
     
    191206      }
    192207
    193       var density = NormalDistribution.Density(row.ToArray(), row.Count, stepWidth);
     208      if (double.IsNaN(bandwidth)) {
     209        bandwidth = KernelDensityEstimator.EstimateBandwidth(rowArray);
     210        decimal bwDecimal = (decimal)bandwidth;
     211        if (bwDecimal < bandwidthMin) {
     212          bwDecimal = bandwidthMin;
     213          bandwidth = decimal.ToDouble(bwDecimal);
     214        }
     215        suppressUpdate = true;
     216        bandwidthNumericUpDown.Value = bwDecimal;
     217      }
     218      var density = KernelDensityEstimator.Density(rowArray, rowArray.Length, stepWidth, bandwidth);
    194219
    195220      Series newSeries = new Series(densitySeriesName);
     221      newSeries.Color = series.Color;
    196222      newSeries.ChartType = SeriesChartType.FastLine;
    197223      newSeries.BorderWidth = 2;
     
    200226      }
    201227
     228      // densities should be plotted on the second axis (different scale)
     229      newSeries.YAxisType = AxisType.Secondary;
    202230      chart.Series.Add(newSeries);
    203231    }
     
    221249      UpdateHistogram();
    222250    }
     251
     252    private void bandwidthNumericUpDown_ValueChanged(object sender, EventArgs e) {
     253      if (!suppressUpdate) {
     254        UpdateHistogram(decimal.ToDouble(bandwidthNumericUpDown.Value));
     255      }
     256      suppressUpdate = false;
     257    }
    223258  }
    224259}
Note: See TracChangeset for help on using the changeset viewer.