@Kingg

Как рисовать график с OxyPlot в WPF с полученными данными?

Всем доброго времени суток, замучался с этим вопросом. Имеются данные полученные из JSON по типу:
{
                "id": 17744942,
                "event_type_id": 22,
                "workshop_id": 1,
                "machine_id": 1,
                "time1": 1632993370500,
                "time2": null,
                "data": null,
                "float": 330.98,
                "enum_value": null,
                "uint32": null
            },
            {
                "id": 17744944,
                "event_type_id": 22,
                "workshop_id": 1,
                "machine_id": 1,
                "time1": 1632993371000,
                "time2": null,
                "data": null,
                "float": 329.59,
                "enum_value": null,
                "uint32": null
            },
            {
                "id": 17744946,
                "event_type_id": 22,
                "workshop_id": 1,
                "machine_id": 1,
                "time1": 1632993371500,
                "time2": null,
                "data": null,
                "float": 330.32,
                "enum_value": null,
                "uint32": null
            },

Десериализация происходит успешно благодаря созданным классам чтения и встроенной библиотеки System.Text.Json.
Данные которые мне интересны: "time1" (Это UNIX timestamp который уже перевел) и "float" (Скорость). Мне необходимо вывести полученные данные в график функции библиотекой OxyPlot для WPF где ось X - time1, ось Y - float. По документации приведенной по oxyplot привязать такие данные не могу. Примерно что я пытаюсь делать:
Func<double, double> numID = (x) => Convert.ToDouble(dateTime); //dateTime перевод времени timestamp
                    Func<double, double> Float = (x) => item.@float; // item. обращение к классу десериализации

                    MyModel.Series.Add(new FunctionSeries(numID, 0, 10, 0.0001));
                    MyModel.Series.Add(new FunctionSeries(Float, 0, 10, 0.0001));

Помогите пожалуйста!
  • Вопрос задан
  • 2200 просмотров
Решения вопроса 1
@WinnerIT
Программист и фотограф-любитель
Предлагаю воспользоваться OxyPlot.Series.LineSeries(). Я набрасал пример по Вашему Json
GraphData - это класс который я создал для десериализации.
в ViewModel пишем вот этот код
try
            {
                //мои тестовые данные
                string inputJson = "[{\"id\": 17744942,\"event_type_id\": 22,\"workshop_id\": 1,\"machine_id\": 1,\"time1\": 1632993391000,\"time2\": null,\"data\": null,\"float\": 329.10,\"enum_value\": null,\"uint32\": null},{\"id\": 17744944,\"event_type_id\": 22,\"workshop_id\": 1,\"machine_id\": 1,\"time1\": 1632993371500,\"time2\": null,\"data\": null,\"float\": 329.20,\"enum_value\": null,\"uint32\": null},{\"id\": 17744946,\"event_type_id\": 22,\"workshop_id\": 1,\"machine_id\": 1,\"time1\": 1632993372000,\"time2\": null,\"data\": null,\"float\": 329.30,\"enum_value\": null,\"uint32\": null},{\"id\": 17744948,\"event_type_id\": 22,\"workshop_id\": 1,\"machine_id\": 1,\"time1\": 1632993372500,\"time2\": null,\"data\": null,\"float\": 330.40,\"enum_value\": null,\"uint32\": null},{ \"id\": 17744950,\"event_type_id\": 22,\"workshop_id\": 1,\"machine_id\": 1,\"time1\": 1632993373000,\"time2\": null,\"data\": null,\"float\": 331.00,\"enum_value\": null,\"uint32\": null}]";                

                var plots = JsonSerializer.Deserialize<List<GraphData>>(inputJson);

                // определяем линию: цвет толщину и легенду
                var line1 = new OxyPlot.Series.LineSeries()
                {
                    Title = $"Series 1",
                    Color = OxyPlot.OxyColors.Blue,
                    StrokeThickness = 1,
                };

                this.MyModel = new PlotModel { Title = "Example 1" };

                foreach (var item in plots)
                {

                    //добавляем точки на линию из наших данных
//у меня нет Вашей функции dateTime  поэтому я пользуюсь прямо UNIX timestamp
                    line1.Points.Add(new OxyPlot.DataPoint(item.time1, item.@float));
                    
                }
                this.MyModel.Series.Add(line1);
            }
            catch (Exception)
            {
                throw;
            }

XAML
<Window x:Class="OxyPlotTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:OxyPlotTest"
        mc:Ignorable="d"
        xmlns:oxy="http://oxyplot.org/wpf"
        xmlns:viewModel="clr-namespace:OxyPlotTest.ViewModel"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <viewModel:MainViewModel/>
    </Window.DataContext>
    <Grid>
        <oxy:PlotView Model="{Binding MyModel}"/>
    </Grid>
</Window>

Данные были сгенерированы слуйчайным образом по- этому кривая такая странная
61680aa28ab88263834536.png
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы