я скину часть моего приложения, там считаются всякие вещи
мне нужно строить графики
для этого код у меня есть, однако нужно наполнить его фунциями
я хочу чтобы на любом графике можно было выбрать точку и удалить ее, при этом когда все ненужные точки будут удалены нужно нажать кнопку применить, и должен создатся новый файл учитывая удаленные точки

<!-- GraphWindow.xaml -->
<Window x:Class="TxtProcessorApp.GraphWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:oxy="http://oxyplot.org/wpf"
        Title="Графики" Height="800" Width="1200">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <!-- График 1: .txt Time UTC vs BASE-1 -->
        <GroupBox Header=".txt Time UTC vs BASE-1" Grid.Row="0" Grid.Column="0" Margin="10">
            <oxy:PlotView x:Name="TxtBase1Plot" Model="{Binding TxtBase1Model}" />
        </GroupBox>

        <!-- График 2: .txt Time UTC vs Noise -->
        <GroupBox Header=".txt Time UTC vs Noise" Grid.Row="0" Grid.Column="1" Margin="10">
            <oxy:PlotView x:Name="TxtNoisePlot" Model="{Binding TxtNoiseModel}" />
        </GroupBox>

        <!-- График 3: .magnete Долгота UTM vs Широта UTM (Альтитуда) -->
        <GroupBox Header=".magnete Долгота UTM vs Широта UTM (Альтитуда)" Grid.Row="1" Grid.Column="0" Margin="10">
            <oxy:PlotView x:Name="MagneteAltitudePlot" Model="{Binding MagneteAltitudeModel}" />
        </GroupBox>

        <!-- График 4: .magnete Долгота UTM vs Широта UTM (Shark) -->
        <GroupBox Header=".magnete Долгота UTM vs Широта UTM (Shark)" Grid.Row="1" Grid.Column="1" Margin="10">
            <oxy:PlotView x:Name="MagneteSharkPlot" Model="{Binding MagneteSharkModel}" />
        </GroupBox>
    </Grid>
</Window>


// GraphWindow.xaml.cs
using OxyPlot;
using OxyPlot.Axes;
using OxyPlot.Series;
using System;
using System.Data;
using System.Linq;
using System.Windows;

namespace TxtProcessorApp
{
    public partial class GraphWindow : Window
    {
        public PlotModel TxtBase1Model { get; private set; }
        public PlotModel TxtNoiseModel { get; private set; }
        public PlotModel MagneteAltitudeModel { get; private set; }
        public PlotModel MagneteSharkModel { get; private set; }

        public GraphWindow(DataTable txtData, DataTable magneteData)
        {
            InitializeComponent();
            InitializePlotModels(txtData, magneteData);
            this.DataContext = this;
        }

        private void InitializePlotModels(DataTable txtData, DataTable magneteData)
        {
            // График 1: .txt Time UTC vs BASE-1
            TxtBase1Model = new PlotModel { Title = ".txt Time UTC vs BASE-1" };
            TxtBase1Model.Axes.Add(new DateTimeAxis
            {
                Position = AxisPosition.Bottom,
                StringFormat = "HH:mm:ss",
                Title = "Time UTC",
                IntervalType = DateTimeIntervalType.Hours,
                MinorIntervalType = DateTimeIntervalType.Minutes
            });
            TxtBase1Model.Axes.Add(new LinearAxis
            {
                Position = AxisPosition.Left,
                Title = "BASE-1"
            });
            var txtBase1Series = new LineSeries { Title = "BASE-1" };
            foreach (DataRow row in txtData.Rows)
            {
                if (DateTime.TryParse(row["Time UTC"].ToString(), out DateTime timeUtc) &&
                    double.TryParse(row["BASE-1"].ToString(), out double base1))
                {
                    txtBase1Series.Points.Add(DateTimeAxis.CreateDataPoint(timeUtc, base1));
                }
            }
            TxtBase1Model.Series.Add(txtBase1Series);

            // График 2: .txt Time UTC vs Noise
            TxtNoiseModel = new PlotModel { Title = ".txt Time UTC vs Noise" };
            TxtNoiseModel.Axes.Add(new DateTimeAxis
            {
                Position = AxisPosition.Bottom,
                StringFormat = "HH:mm:ss",
                Title = "Time UTC",
                IntervalType = DateTimeIntervalType.Hours,
                MinorIntervalType = DateTimeIntervalType.Minutes
            });
            TxtNoiseModel.Axes.Add(new LinearAxis
            {
                Position = AxisPosition.Left,
                Title = "Noise"
            });
            var txtNoiseSeries = new LineSeries { Title = "Noise" };
            foreach (DataRow row in txtData.Rows)
            {
                if (DateTime.TryParse(row["Time UTC"].ToString(), out DateTime timeUtc) &&
                    double.TryParse(row["Noise"].ToString(), out double noise))
                {
                    txtNoiseSeries.Points.Add(DateTimeAxis.CreateDataPoint(timeUtc, noise));
                }
            }
            TxtNoiseModel.Series.Add(txtNoiseSeries);

            // График 3: .magnete Долгота UTM vs Широта UTM (Альтитуда)
            MagneteAltitudeModel = new PlotModel { Title = ".magnete Долгота UTM vs Широта UTM (Альтитуда)" };
            MagneteAltitudeModel.Axes.Add(new LinearAxis
            {
                Position = AxisPosition.Bottom,
                Title = "Долгота UTM"
            });
            MagneteAltitudeModel.Axes.Add(new LinearAxis
            {
                Position = AxisPosition.Left,
                Title = "Широта UTM"
            });
            var magneteAltitudeSeries = new ScatterSeries { Title = "Альтитуда", MarkerType = MarkerType.Circle };
            foreach (DataRow row in magneteData.Rows)
            {
                if (double.TryParse(row["Долгота UTM"].ToString(), out double longitudeUTM) &&
                    double.TryParse(row["Широта UTM"].ToString(), out double latitudeUTM) &&
                    double.TryParse(row["Альтитуда"].ToString(), out double altitude))
                {
                    magneteAltitudeSeries.Points.Add(new ScatterPoint(longitudeUTM, latitudeUTM, 5, altitude));
                }
            }
            MagneteAltitudeModel.Axes.Add(new LinearColorAxis
            {
                Position = AxisPosition.Right,
                Palette = OxyPalettes.Jet(500),
                Title = "Альтитуда"
            });
            MagneteAltitudeModel.Series.Add(magneteAltitudeSeries);

            // График 4: .magnete Долгота UTM vs Широта UTM (Shark)
            MagneteSharkModel = new PlotModel { Title = ".magnete Долгота UTM vs Широта UTM (Shark)" };
            MagneteSharkModel.Axes.Add(new LinearAxis
            {
                Position = AxisPosition.Bottom,
                Title = "Долгота UTM"
            });
            MagneteSharkModel.Axes.Add(new LinearAxis
            {
                Position = AxisPosition.Left,
                Title = "Широта UTM"
            });
            var magneteSharkSeries = new ScatterSeries { Title = "Shark", MarkerType = MarkerType.Circle };
            foreach (DataRow row in magneteData.Rows)
            {
                if (double.TryParse(row["Долгота UTM"].ToString(), out double longitudeUTM) &&
                    double.TryParse(row["Широта UTM"].ToString(), out double latitudeUTM) &&
                    double.TryParse(row["Shark"].ToString(), out double shark))
                {
                    magneteSharkSeries.Points.Add(new ScatterPoint(longitudeUTM, latitudeUTM, 5, shark));
                }
            }
            MagneteSharkModel.Axes.Add(new LinearColorAxis
            {
                Position = AxisPosition.Right,
                Palette = OxyPalettes.Jet(500),
                Title = "Shark"
            });
            MagneteSharkModel.Series.Add(magneteSharkSeries);
        }
    }
}