【问题标题】:oxyplot - Y axis on both sides of chartoxyplot - 图表两侧的 Y 轴
【发布时间】:2020-10-30 10:40:59
【问题描述】:

我正在使用 oxyplot 库来创建时间序列图表。我正在尝试创建一个两侧具有相同 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,
        Minimum = 0,
        Maximum = 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 轴,而不仅仅是一个?

【问题讨论】:

    标签: c# zooming axis oxyplot pan


    【解决方案1】:

    我认为没有内置设置。我过去遇到过类似的问题,也寻找过这样的功能,但没有找到。 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,
        Minimum = 0,
        Maximum = 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;
        }
    

    【讨论】:

    • 声明axisChanged函数的额外步骤是可悲的,尤其是在我有多个具有相同行为的图表时,但它仍然有效,谢谢
    • 遗憾的是,仅与右轴的交互不起作用,需要额外的事件...
    • 对,有了两个事件处理程序,代码变得非常丑陋。我什至需要布尔标志来避免两个事件处理程序相互调用并导致 StackOverflowException。此外,我必须用rightAxis.Zoom(leftAxis.ActualMaximum, leftAxis.ActualMinimum); 替换事件处理程序的最后两行以使其工作。如果需要,我可以使用该更改更新我的答案。
    • 另外,如果您的应用程序中有多个此类图,我建议将所有内容包装到一个类中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    相关资源
    最近更新 更多