【问题标题】:How do I get Y values from all series at a particular X value (OxyPlot)如何从特定 X 值的所有系列中获取 Y 值(OxyPlot)
【发布时间】:2020-02-09 16:39:30
【问题描述】:

我正在使用 OxyPlot。我有一个带有 PlotModel 的 PlotView。有 2 个轴:yAxis 是 LinearAxis,xAxis 是 DateTimeAxis。我有多个 LineSeries。这是一个示例程序:

public MainWindow()
        {
            InitializeComponent();

            PlotModel plotModel = new PlotModel();
            plotView.Model = plotModel;

            plotModel.Axes.Clear();
            var yAxis = new LinearAxis();
            var xAxis = new DateTimeAxis();
            yAxis.IsZoomEnabled = false;
            yAxis.AbsoluteMinimum = -50;
            yAxis.AbsoluteMaximum = 450;
            yAxis.MajorGridlineStyle = LineStyle.Solid;
            xAxis.MajorGridlineStyle = LineStyle.Solid;
            xAxis.AbsoluteMinimum = DateTimeAxis.ToDouble(DateTime.Today);
            xAxis.AbsoluteMaximum = DateTimeAxis.ToDouble(DateTime.Today.AddDays(1));
            yAxis.IsPanEnabled = false;
            yAxis.IsZoomEnabled = false;
            plotModel.Axes.Add(yAxis);
            plotModel.Axes.Add(xAxis);

            var series1 = new LineSeries();
            series1.Points.Add(new DataPoint(DateTimeAxis.ToDouble(DateTime.Today), 0));
            series1.Points.Add(new DataPoint(DateTimeAxis.ToDouble(DateTime.Today.AddHours(4)), 100));
            series1.Points.Add(new DataPoint(DateTimeAxis.ToDouble(DateTime.Today.AddHours(8)), 150));
            series1.Points.Add(new DataPoint(DateTimeAxis.ToDouble(DateTime.Today.AddHours(12)), 50));
            series1.Points.Add(new DataPoint(DateTimeAxis.ToDouble(DateTime.Today.AddHours(16)), 200));
            series1.Points.Add(new DataPoint(DateTimeAxis.ToDouble(DateTime.Today.AddHours(20)), 150));
            series1.Points.Add(new DataPoint(DateTimeAxis.ToDouble(DateTime.Today.AddHours(24)), 300));
            plotModel.Series.Add(series1);

            var series2 = new LineSeries();
            series2.Points.Add(new DataPoint(DateTimeAxis.ToDouble(DateTime.Today), 0));
            series2.Points.Add(new DataPoint(DateTimeAxis.ToDouble(DateTime.Today.AddHours(4)), 200));
            series2.Points.Add(new DataPoint(DateTimeAxis.ToDouble(DateTime.Today.AddHours(8)), 200));
            series2.Points.Add(new DataPoint(DateTimeAxis.ToDouble(DateTime.Today.AddHours(12)), 150));
            series2.Points.Add(new DataPoint(DateTimeAxis.ToDouble(DateTime.Today.AddHours(16)), 300));
            series2.Points.Add(new DataPoint(DateTimeAxis.ToDouble(DateTime.Today.AddHours(20)), 50));
            series2.Points.Add(new DataPoint(DateTimeAxis.ToDouble(DateTime.Today.AddHours(24)), 100));
            plotModel.Series.Add(series2);
        }

当我按住左键时,我只能从我当前悬停的 LineSeries 中看到 Y 值。我想获取与鼠标指针当前所在的 X 值相对应的所有 Y 值。我不需要自定义跟踪器,我想在绘图旁边的标签中显示值。还值得注意的是,这只是一个示例程序;在我的主程序中,每个 LineSeries 包含大约 50k 个点,这就是为什么我不能遍历所有点来找到我想要的值的原因。最有效的方法是什么?

【问题讨论】:

    标签: c# charts oxyplot


    【解决方案1】:

    您可以对每个系列使用 GetNearestPoint 来获取给定 X 的 Y 值。例如,

            PlotModel.TrackerChanged += (sender, eventArgs) =>
            {
                if (eventArgs.HitResult != null)
                {
                    var currentPoint = eventArgs.HitResult.Position;
                    var allYValuesForX = PlotModel.Series.Select(x => x.GetNearestPoint(currentPoint, true).DataPoint.Y);
                    CurrentTrackerValue = $"X = {currentPoint.X}, Y ={string.Join(",", allYValuesForX)}";
                }
    
                UpdateLabel(CurrentTrackerValue);
            };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多