 <p>To allow nice zooming you should add this line to the two you show:</p> <pre><code>chart1.ChartAreas["ChartArea1"].AxisX.ScaleView.Zoomable = true; </code></pre> <p>Here is a function to calculate an average of the visible points' 1st YValues:</p> <pre><code>private void chart1_AxisViewChanged(object sender, ViewEventArgs e) { // for a test the result is shown in the Form's title Text = "AVG:" + GetAverage(chart1, chart1.Series[0], e); } double GetAverage(Chart chart, Series series, ViewEventArgs e) { ChartArea CA = e.ChartArea; // short.. Series S = series; // references DataPoint pt0 = S.Points.Select(x =&gt; x) .Where(x =&gt; x.XValue &gt;= CA.AxisX.ScaleView.ViewMinimum) .DefaultIfEmpty(S.Points.First()).First(); DataPoint pt1 = S.Points.Select(x =&gt; x) .Where(x =&gt; x.XValue &lt;= CA.AxisX.ScaleView.ViewMaximum) .DefaultIfEmpty(S.Points.Last()).Last(); double sum = 0; for (int i = S.Points.IndexOf(pt0); i &lt; S.Points.IndexOf(pt1); i++) sum += S.Points[i].YValues[0]; return sum / (S.Points.IndexOf(pt1) - S.Points.IndexOf(pt0) + 1); } </code></pre> <p>Note that the <code>ViewEventArgs</code> parameter is providing the values of the position and size of the View, but these are just the <code>XValues</code> of the datapoints and not their indices; so we need to search the <code>Points</code> from the left for the 1st and from right for the last point.</p> <p><strong>Update</strong> Sometimes the zooming runs into a special problem: When the data are more finely grained than the default <code>CursorX.IntervalType</code> it just won't let you zoom. In such a case you simply have to adapt to the scale of your data, e.g. like this: <code>CA.CursorX.IntervalType = DateTimeIntervalType.Milliseconds;</code></p>