oxyplot-图表两侧的Y轴

问题描述

我正在使用oxyplot lib创建时间序列图。我正在尝试创建一个两侧都具有相同y轴的图,只要我不与该图进行缩放或平移交互,它就可以正常工作,这是我的代码

      model.Axes.Add(new Linearaxis()
      {
        MajorStep = 0.1,Minimum = 0,Maximum = 1,Position = AxisPosition.Left,Title = "Title Axis",AxisTitledistance = 10
      });

      model.Axes.Add(new Linearaxis()
      {
        Key = "RightYAxis"
        MajorStep = 0.1,Position = AxisPosition.Right
      });

      DateTimeAxis dta = new DateTimeAxis()
      {
        Key = "DateTimeAxis",IntervalType = SetDateTimeIntervalType(minDate,maxDate),StringFormat = "dd/MM/yyyy",Position = AxisPosition.Bottom,Minimum = DateTimeAxis.Todouble(minDate),Maximum = DateTimeAxis.Todouble(maxDate),Title = "Date",AxisTitledistance = 10
      };
      dta.AxisChanged += new EventHandler<AxisChangedEventArgs>(AxisChanged);
      model.Axes.Add(dta);

当我与绘图交互时,只有左y轴和底轴会适当缩放。当我在左侧y轴之前添加右侧y轴时,底部和右侧轴将缩放。

我需要设置什么设置,以相应地缩放两个y轴,而不仅仅是一个

解决方法

我认为没有内置设置。过去我也遇到过类似的问题,也曾寻找过这样的功能,但没有找到。在OxyPlot演示浏览器中也没有这样的示例。直截了当但不是很优雅的方式是将事件处理程序也附加到左轴,该事件处理程序将最小和最大值设置为右一个。您的示例将如下所示:

  Axis leftAxis = new LinearAxis()
  {
    MajorStep = 0.1,Minimum = 0,Maximum = 1,Position = AxisPosition.Left,Title = "Title Axis",AxisTitleDistance = 10
  });

  leftAxis.AxisChanged += LeftAxis_AxisChanged;
  model.Axes.Add(leftAxis);

  model.Axes.Add(new LinearAxis()
  {
    Key = "RightYAxis"
    MajorStep = 0.1,Position = AxisPosition.Right
  });

  DateTimeAxis dta = new DateTimeAxis()
  {
    Key = "DateTimeAxis",IntervalType = SetDateTimeIntervalType(minDate,maxDate),StringFormat = "dd/MM/yyyy",Position = AxisPosition.Bottom,Minimum = DateTimeAxis.ToDouble(minDate),Maximum = DateTimeAxis.ToDouble(maxDate),Title = "Date",AxisTitleDistance = 10
  };
  dta.AxisChanged += new EventHandler<AxisChangedEventArgs>(AxisChanged);
  model.Axes.Add(dta);

事件处理程序看起来像

    private void LeftAxis_AxisChanged(object sender,AxisChangedEventArgs e)
    {
        Axis leftAxis = sender as Axis;
        Axis rightAxis = leftAxis.PlotModel.Axes.First(a => a.Position == AxisPosition.Right);

        rightAxis.Maximum = leftAxis.ActualMaximum;
        rightAxis.Minimum = leftAxis.ActualMinimum;
    }