bearrito
bearrito

Reputation: 21

Rescale X across all plots in ZedGraph

I can successfully zoom x-only across all plots using the following code:

zg1.IsEnableHZoom = true;  
zg1.IsEnableVZoom = false;  
zg1.IsSynchronizeXAxes = true;  

foreach (GraphPane gp in zg1.MasterPane.paneList)  
{  
   > //What code can I put here?  
}  

My problem is that using this code, the Y-axis remains at a max and min based on the original view of the data. I want the Y-axis to autoscale so that the max and min is ONLY based on the data visible due to the x-axis zoom (per graph pane, of course). Is there some command, or brute force method, that I can use on each of the graph panes in the for loop shown above? Thanks ahead of time for anyone's help.

Upvotes: 2

Views: 1481

Answers (2)

Larry
Larry

Reputation: 18031

You can use this in the loop (assuming X Axis scale MinAuto and MaxAuto are false)

foreach (GraphPane gp in zg1.MasterPane.paneList)  
{
    gp.YAxis.Scale.MinAuto = true;
    gp.YAxis.Scale.MaxAuto = true;

    // This will force ZedGraph to calculate the Min and the Max of the Y axis
    // based on the X axis visible range
    gp.IsBoundedRanges = true;
}

zg1.MasterPane.AxisChange();

Upvotes: 1

PeskyGnat
PeskyGnat

Reputation: 2464

I had the same problem before and could not find a way other than to inspect all the curve points.

I added an event handler to the Paint event to do this, I'm sure there are ways this can be optimized.

Something like this:

  private void graph_Paint(object sender, PaintEventArgs e)
  {
    double min = Double.MaxValue;
    double max = Double.MinValue;

    CurveItem curve = graph.GraphPane.CurveList[0];
    for (int i = 0; i < curve.Points.Count; i++)
    {
      if (curve.Points[i].X > graph.GraphPane.XAxis.Scale.Min &&
          curve.Points[i].X < graph.GraphPane.XAxis.Scale.Max)
      {
        min = Math.Min(curve.Points[i].Y, min);
        max = Math.Max(curve.Points[i].Y, max);
      }
    }

    if (min != Double.MaxValue)
    {
      graph.GraphPane.XAxis.Scale.Min = min;
      graph.GraphPane.XAxis.Scale.Max = max;
    }
  }

Upvotes: 0

Related Questions