c# - 如何从特定 X 值的所有系列中获取 Y 值(OxyPlot)
问题描述
我正在使用 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 个点,这就是为什么我不能遍历所有点来找到我想要的值。这样做最有效的方法是什么?
解决方案
您可以使用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);
};
推荐阅读
- java - Jackson:将一个值反序列化为两个 java 字段
- r - R按未显示的变量对克利夫兰点图进行排序
- retrofit - Retrofit 或 OkHttp 是否限制并行请求的数量?
- laravel - Livewire 和 CKEditor
- kubernetes - helm:在 Chart.yaml 中找到,但在 charts/ 目录中缺少:postgresql,
- python - ProgrammingError at / relation "products_product" 不存在 LINE 1: ...votes_total", "products_product"."hunter_id" FROM "products_
- stm32 - Cortex-M4 上的 Systick 定时器:它的预分频器是什么?
- vue.js - worker-loader 重启后无法正常工作
- java - 大十进制修剪到小数点后两位
- python - 如何使用 SQLalchemy 正确设置关联表