Index: trunk/sources/HeuristicLab.Common/3.3/EnumerableStatisticExtensions.cs
===================================================================
--- trunk/sources/HeuristicLab.Common/3.3/EnumerableStatisticExtensions.cs	(revision 4651)
+++ trunk/sources/HeuristicLab.Common/3.3/EnumerableStatisticExtensions.cs	(revision 4652)
@@ -87,4 +87,24 @@
       return ((m_n > 1) ? m_newS / (m_n - 1) : 0.0);
     }
+
+    /// <summary>
+    /// Calculates the pth percentile of the values.
+    /// </summary
+    public static double Percentile(this IEnumerable<double> values, double p) {
+      if (values.Count() == 0) throw new InvalidOperationException("Enumeration contains no elements.");
+      if (values.Count() == 1) return values.ElementAt(0);
+
+      double[] sortedValues = values.ToArray();
+      Array.Sort(sortedValues);
+
+      int n = sortedValues.Length;
+      if (p.IsAlmost(0.0)) return sortedValues[0];
+      if (p.IsAlmost(1.0)) return sortedValues[n - 1];
+
+      double t = p * (n - 1);
+      int index = (int)Math.Floor(t);
+      double percentage = t - index;
+      return sortedValues[index] * (1 - percentage) + sortedValues[index + 1] * percentage;
+    }
   }
 }
Index: trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs
===================================================================
--- trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs	(revision 4651)
+++ trunk/sources/HeuristicLab.Data.Views/3.3/StringConvertibleMatrixView.cs	(revision 4652)
@@ -23,4 +23,5 @@
 using System.Collections.Generic;
 using System.ComponentModel;
+using System.Drawing;
 using System.Linq;
 using System.Text;
@@ -51,6 +52,18 @@
     }
 
+    private bool showRowsAndColumnsTextBox;
+    public bool ShowRowsAndColumnsTextBox {
+      get { return showRowsAndColumnsTextBox; }
+      set {
+        if (value != showRowsAndColumnsTextBox) {
+          showRowsAndColumnsTextBox = value;
+          UpdateVisibilityOfTextBoxes();
+        }
+      }
+    }
+
     public StringConvertibleMatrixView() {
       InitializeComponent();
+      showRowsAndColumnsTextBox = true;
       errorProvider.SetIconAlignment(rowsTextBox, ErrorIconAlignment.MiddleLeft);
       errorProvider.SetIconPadding(rowsTextBox, 2);
@@ -99,5 +112,4 @@
 
     private void UpdateData() {
-
       rowsTextBox.Text = Content.Rows.ToString();
       rowsTextBox.Enabled = true;
@@ -472,4 +484,16 @@
       new ColumnsVisibilityDialog(this.dataGridView.Columns.Cast<DataGridViewColumn>()).ShowDialog();
     }
+
+    private void UpdateVisibilityOfTextBoxes() {
+      rowsTextBox.Visible = columnsTextBox.Visible = showRowsAndColumnsTextBox;
+      rowsLabel.Visible = columnsLabel.Visible = showRowsAndColumnsTextBox;
+
+      int headerSize = columnsTextBox.Location.Y + columnsTextBox.Size.Height +
+        columnsTextBox.Margin.Bottom + dataGridView.Margin.Top;
+
+      int offset = showRowsAndColumnsTextBox ? headerSize : 0;
+      dataGridView.Location = new Point(0, offset);
+      dataGridView.Size = new Size(Size.Width, Size.Height - offset);
+    }
   }
 }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionBoxPlotView.Designer.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionBoxPlotView.Designer.cs	(revision 4651)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionBoxPlotView.Designer.cs	(revision 4652)
@@ -45,4 +45,5 @@
     /// </summary>
     private void InitializeComponent() {
+      this.components = new System.ComponentModel.Container();
       System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
       System.Windows.Forms.DataVisualization.Charting.Series series1 = new System.Windows.Forms.DataVisualization.Charting.Series();
@@ -51,7 +52,15 @@
       this.yAxisLabel = new System.Windows.Forms.Label();
       this.yAxisComboBox = new System.Windows.Forms.ComboBox();
-      this.chart = new System.Windows.Forms.DataVisualization.Charting.Chart();
+      this.chart = new HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart();
       this.noRunsLabel = new System.Windows.Forms.Label();
+      this.splitContainer = new System.Windows.Forms.SplitContainer();
+      this.statisticsGroupBox = new System.Windows.Forms.GroupBox();
+      this.statisticsMatrixView = new HeuristicLab.Data.Views.StringConvertibleMatrixView();
+      this.tooltip = new System.Windows.Forms.ToolTip(this.components);
       ((System.ComponentModel.ISupportInitialize)(this.chart)).BeginInit();
+      this.splitContainer.Panel1.SuspendLayout();
+      this.splitContainer.Panel2.SuspendLayout();
+      this.splitContainer.SuspendLayout();
+      this.statisticsGroupBox.SuspendLayout();
       this.SuspendLayout();
       // 
@@ -60,5 +69,5 @@
       this.xAxisLabel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
       this.xAxisLabel.AutoSize = true;
-      this.xAxisLabel.Location = new System.Drawing.Point(306, 294);
+      this.xAxisLabel.Location = new System.Drawing.Point(298, 256);
       this.xAxisLabel.Name = "xAxisLabel";
       this.xAxisLabel.Size = new System.Drawing.Size(15, 13);
@@ -72,5 +81,5 @@
       this.xAxisComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       this.xAxisComboBox.FormattingEnabled = true;
-      this.xAxisComboBox.Location = new System.Drawing.Point(327, 290);
+      this.xAxisComboBox.Location = new System.Drawing.Point(319, 253);
       this.xAxisComboBox.Name = "xAxisComboBox";
       this.xAxisComboBox.Size = new System.Drawing.Size(221, 21);
@@ -81,5 +90,5 @@
       // 
       this.yAxisLabel.AutoSize = true;
-      this.yAxisLabel.Location = new System.Drawing.Point(3, 7);
+      this.yAxisLabel.Location = new System.Drawing.Point(3, 6);
       this.yAxisLabel.Name = "yAxisLabel";
       this.yAxisLabel.Size = new System.Drawing.Size(15, 13);
@@ -92,5 +101,5 @@
       this.yAxisComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
       this.yAxisComboBox.FormattingEnabled = true;
-      this.yAxisComboBox.Location = new System.Drawing.Point(24, 4);
+      this.yAxisComboBox.Location = new System.Drawing.Point(24, 3);
       this.yAxisComboBox.Name = "yAxisComboBox";
       this.yAxisComboBox.Size = new System.Drawing.Size(221, 21);
@@ -105,5 +114,5 @@
       chartArea1.Name = "ChartArea1";
       this.chart.ChartAreas.Add(chartArea1);
-      this.chart.Location = new System.Drawing.Point(3, 28);
+      this.chart.Location = new System.Drawing.Point(6, 30);
       this.chart.Name = "chart";
       series1.ChartArea = "ChartArea1";
@@ -112,11 +121,11 @@
       series1.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;
       series1.Name = "DataSeries";
-      series1.YValuesPerPoint = 1;
+      series1.YValuesPerPoint = 6;
       this.chart.Series.Add(series1);
-
-      this.chart.Size = new System.Drawing.Size(546, 258);
+      this.chart.Size = new System.Drawing.Size(534, 217);
       this.chart.TabIndex = 17;
       this.chart.Text = "chart";
       this.chart.AxisViewChanged += new System.EventHandler<System.Windows.Forms.DataVisualization.Charting.ViewEventArgs>(this.chart_AxisViewChanged);
+      this.chart.MouseMove += new System.Windows.Forms.MouseEventHandler(this.chart_MouseMove);
       // 
       // noRunsLabel
@@ -124,5 +133,5 @@
       this.noRunsLabel.Anchor = System.Windows.Forms.AnchorStyles.None;
       this.noRunsLabel.AutoSize = true;
-      this.noRunsLabel.Location = new System.Drawing.Point(200, 134);
+      this.noRunsLabel.Location = new System.Drawing.Point(212, 122);
       this.noRunsLabel.Name = "noRunsLabel";
       this.noRunsLabel.Size = new System.Drawing.Size(138, 13);
@@ -130,4 +139,52 @@
       this.noRunsLabel.Text = "No runs could be displayed.";
       // 
+      // splitContainer
+      // 
+      this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.splitContainer.Location = new System.Drawing.Point(0, 0);
+      this.splitContainer.Name = "splitContainer";
+      this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal;
+      // 
+      // splitContainer.Panel1
+      // 
+      this.splitContainer.Panel1.Controls.Add(this.xAxisLabel);
+      this.splitContainer.Panel1.Controls.Add(this.noRunsLabel);
+      this.splitContainer.Panel1.Controls.Add(this.yAxisLabel);
+      this.splitContainer.Panel1.Controls.Add(this.xAxisComboBox);
+      this.splitContainer.Panel1.Controls.Add(this.yAxisComboBox);
+      this.splitContainer.Panel1.Controls.Add(this.chart);
+      // 
+      // splitContainer.Panel2
+      // 
+      this.splitContainer.Panel2.Controls.Add(this.statisticsGroupBox);
+      this.splitContainer.Size = new System.Drawing.Size(543, 416);
+      this.splitContainer.SplitterDistance = 277;
+      this.splitContainer.TabIndex = 23;
+      // 
+      // statisticsGroupBox
+      // 
+      this.statisticsGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+                  | System.Windows.Forms.AnchorStyles.Left)
+                  | System.Windows.Forms.AnchorStyles.Right)));
+      this.statisticsGroupBox.Controls.Add(this.statisticsMatrixView);
+      this.statisticsGroupBox.Location = new System.Drawing.Point(3, 3);
+      this.statisticsGroupBox.Name = "statisticsGroupBox";
+      this.statisticsGroupBox.Size = new System.Drawing.Size(534, 129);
+      this.statisticsGroupBox.TabIndex = 1;
+      this.statisticsGroupBox.TabStop = false;
+      this.statisticsGroupBox.Text = "Statistics";
+      // 
+      // statisticsMatrixView
+      // 
+      this.statisticsMatrixView.Caption = "StringConvertibleMatrix View";
+      this.statisticsMatrixView.Content = null;
+      this.statisticsMatrixView.Dock = System.Windows.Forms.DockStyle.Fill;
+      this.statisticsMatrixView.Location = new System.Drawing.Point(3, 16);
+      this.statisticsMatrixView.Name = "statisticsMatrixView";
+      this.statisticsMatrixView.ReadOnly = true;
+      this.statisticsMatrixView.ShowRowsAndColumnsTextBox = false;
+      this.statisticsMatrixView.Size = new System.Drawing.Size(528, 110);
+      this.statisticsMatrixView.TabIndex = 0;
+      // 
       // RunCollectionBoxPlotView
       // 
@@ -136,15 +193,14 @@
       this.BackColor = System.Drawing.SystemColors.Window;
       this.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
-      this.Controls.Add(this.noRunsLabel);
-      this.Controls.Add(this.chart);
-      this.Controls.Add(this.xAxisLabel);
-      this.Controls.Add(this.xAxisComboBox);
-      this.Controls.Add(this.yAxisLabel);
-      this.Controls.Add(this.yAxisComboBox);
+      this.Controls.Add(this.splitContainer);
       this.Name = "RunCollectionBoxPlotView";
-      this.Size = new System.Drawing.Size(552, 316);
+      this.Size = new System.Drawing.Size(543, 416);
       ((System.ComponentModel.ISupportInitialize)(this.chart)).EndInit();
+      this.splitContainer.Panel1.ResumeLayout(false);
+      this.splitContainer.Panel1.PerformLayout();
+      this.splitContainer.Panel2.ResumeLayout(false);
+      this.splitContainer.ResumeLayout(false);
+      this.statisticsGroupBox.ResumeLayout(false);
       this.ResumeLayout(false);
-      this.PerformLayout();
 
     }
@@ -156,6 +212,10 @@
     private System.Windows.Forms.Label yAxisLabel;
     private System.Windows.Forms.ComboBox yAxisComboBox;
-    private System.Windows.Forms.DataVisualization.Charting.Chart chart;
+    private HeuristicLab.Visualization.ChartControlsExtensions.EnhancedChart chart;
     private System.Windows.Forms.Label noRunsLabel;
+    private System.Windows.Forms.SplitContainer splitContainer;
+    private Data.Views.StringConvertibleMatrixView statisticsMatrixView;
+    private System.Windows.Forms.GroupBox statisticsGroupBox;
+    private System.Windows.Forms.ToolTip tooltip;
   }
 }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionBoxPlotView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionBoxPlotView.cs	(revision 4651)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionBoxPlotView.cs	(revision 4652)
@@ -25,4 +25,5 @@
 using System.Windows.Forms;
 using System.Windows.Forms.DataVisualization.Charting;
+using HeuristicLab.Common;
 using HeuristicLab.Core;
 using HeuristicLab.Data;
@@ -50,4 +51,5 @@
       this.chart.Series.Clear();
       this.chart.ChartAreas.Add(BoxPlotChartAreaName);
+      this.chart.CustomizeAllChartAreas();
     }
 
@@ -168,4 +170,5 @@
           this.chart.Series.Add(s);
 
+        UpdateStatistics();
         if (seriesCache.Count > 0) {
           Series boxPlotSeries = CreateBoxPlotSeries();
@@ -176,4 +179,45 @@
       }
       UpdateNoRunsVisibleLabel();
+    }
+
+    private void UpdateStatistics() {
+      DoubleMatrix matrix = new DoubleMatrix(6, seriesCache.Count);
+      matrix.SortableView = false;
+      List<string> columnNames = new List<string>();
+      foreach (Series series in seriesCache.Values) {
+        DataPoint datapoint = series.Points.FirstOrDefault();
+        if (datapoint != null) {
+          IRun run = (IRun)datapoint.Tag;
+          string selectedAxis = (string)xAxisComboBox.SelectedItem;
+          IItem value = null;
+
+          if (Enum.IsDefined(typeof(AxisDimension), selectedAxis)) {
+            AxisDimension axisDimension = (AxisDimension)Enum.Parse(typeof(AxisDimension), selectedAxis);
+            switch (axisDimension) {
+              case AxisDimension.Color: value = new StringValue(run.Color.ToString());
+                break;
+            }
+          } else value = Content.GetValue(run, selectedAxis);
+          string columnName = string.Empty;
+          if (value is DoubleValue || value is IntValue)
+            columnName = selectedAxis + ": ";
+          columnName += value.ToString();
+          columnNames.Add(columnName);
+        }
+      }
+      matrix.ColumnNames = columnNames;
+      matrix.RowNames = new string[] { "Mean", "Median", "Standard deviation", "Variance", "25th percentile", "75th percentile" };
+
+      for (int i = 0; i < seriesCache.Count; i++) {
+        Series series = seriesCache.ElementAt(i).Value;
+        double[] seriesValues = series.Points.Select(p => p.YValues[0]).OrderBy(d => d).ToArray();
+        matrix[0, i] = seriesValues.Average();
+        matrix[1, i] = seriesValues.Median();
+        matrix[2, i] = seriesValues.StandardDeviation();
+        matrix[3, i] = seriesValues.Variance();
+        matrix[4, i] = seriesValues.Percentile(0.25);
+        matrix[5, i] = seriesValues.Percentile(0.75);
+      }
+      statisticsMatrixView.Content = matrix;
     }
 
@@ -214,4 +258,5 @@
         Series series = seriesCache[xValue.Value];
         DataPoint point = new DataPoint(xValue.Value, yValue.Value);
+        point.Tag = run;
         series.Points.Add(point);
       }
@@ -293,4 +338,8 @@
       SetCustomAxisLabels(xAxis, xAxisComboBox.SelectedIndex - axisDimensionCount);
       SetCustomAxisLabels(yAxis, yAxisComboBox.SelectedIndex - axisDimensionCount);
+      if (xAxisComboBox.SelectedItem != null)
+        xAxis.Title = xAxisComboBox.SelectedItem.ToString();
+      if (yAxisComboBox.SelectedItem != null)
+        yAxis.Title = yAxisComboBox.SelectedItem.ToString();
     }
 
@@ -340,5 +389,19 @@
       }
     }
+
+    private void chart_MouseMove(object sender, MouseEventArgs e) {
+      string newTooltipText = string.Empty;
+      string oldTooltipText;
+      HitTestResult h = this.chart.HitTest(e.X, e.Y);
+      if (h.ChartElementType == ChartElementType.AxisLabels) {
+        newTooltipText = ((CustomLabel)h.Object).ToolTip;
+      }
+
+      oldTooltipText = this.tooltip.GetToolTip(chart);
+      if (newTooltipText != oldTooltipText)
+        this.tooltip.SetToolTip(chart, newTooltipText);
+    }
     #endregion
+
   }
 }
Index: trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionBubbleChartView.cs
===================================================================
--- trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionBubbleChartView.cs	(revision 4651)
+++ trunk/sources/HeuristicLab.Optimization.Views/3.3/RunCollectionBubbleChartView.cs	(revision 4652)
@@ -131,4 +131,5 @@
         AddDataPoint(run);
       UpdateCursorInterval();
+      chart.ChartAreas[0].RecalculateAxesScale();
 
 
