Живые графики WPF должны всегда показывать жестко закодированные шаги по оси X - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь сделать что-то, что, по моему мнению, должно быть легким. Я хочу, чтобы значения от 1 до 30 были равномерно распределены, потому что я выполняю серию данных, представляющих 30 минут данных. Иногда есть 500 точек данных, но иногда есть тысячи (хотя я могу легко определить количество точек).

По сути, мой код для Xaxis выглядит следующим образом, но он не делает то, что я хочу. Ниже кода скриншот того, что происходит, а ниже скриншот того, что я хочу.

        cartChart.AxisX.Add(new Axis
        {
            // TODO fix this to acutally show real time
            Title = "Minutes",
            //Labels= { "1", "2", "4", "6", "8", "10", "12", "14", "16", "18", "20", "22", "24", "26", "28", "30" },
            Separator = new LiveCharts.Wpf.Separator
            {
                Step = listOfChartValues[i].Count / 30 > 0 ? listOfChartValues[i].Count / 30 : 1, // this is making the assumtion that data arrivals follow uniform distribution
                IsEnabled = false
            }
        });

Текущий график ошибок (пытается поставить минутную метку для каждой точки данных) Bug Chart Нужны только 30-минутные метки (возможно, мой алгоритм для расчета шага нуждается в корректировке, в настоящее время я делю общее количество точек данных на 30) Desired Я посмотрел на эти два поста, но это другая проблема LiveChart не показывает все метки на оси x WPF

Заставить все метки оси показывать

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Это было решением проблемы, но ответ Каспара был образовательным и помог мне прийти к этому решению. Поэтому я принял его ответ, так как он заслуживает похвалы.

Способ, которым я решил эту проблему, заключался в следующем: при создании диаграмм я связывался с listOfLableValues; после создания диаграмм я бы отредактировал add в этот список, как показано в нижнем цикле моего кода:

private List<string> listOfLableValues = new List<string>();

//... other WPF code
// loop through all charts and to create them
       SeriesCollection = new SeriesCollection
       {
            new StepLineSeries
            {
                Values = listOfChartValues[i],
                PointGeometry = null,
                // Fill = Brushes.Transparent
             },
       };
//... other Livecharts code

        int lableCount = 1;
        for (int i = 0; i < listOfChartValues.Count; i++)
        {
            listOfChartValues[i].AddRange(de.ListOfListPlottedAmpData[i]);


            if (0 == i % (listOfChartValues[i].Count / 30))
                listOfLableValues.Add(lableCount++.ToString());
            else
                listOfLableValues.Add("");
        }
0 голосов
/ 25 января 2019

Проблема заключается в том, что для каждой метки точек создается график в реальном времени, а количество меток должно быть числом точек. Есть два решения этой проблемы.

Сначала вы меняете ChartValues<double> to ChartValues<ObservablePoint>

chart.Series = new LiveCharts.SeriesCollection()
{
    new LineSeries()
    {
        Title = "Some series",
        Values = new ChartValues<ObservablePoint>
        {
            new ObservablePoint(1,5),
            new ObservablePoint(1.5,7.6),
            new ObservablePoint(2,21),
            new ObservablePoint(5,25),
            new ObservablePoint(10,30),
            new ObservablePoint(17,30),
            new ObservablePoint(19.6,30),
            new ObservablePoint(30,40),

        }
    }
};
chart.AxisX = new LiveCharts.Wpf.AxesCollection()
{
    new LiveCharts.Wpf.Axis()
    {
        Title= "Minutes",
        Separator = new LiveCharts.Wpf.Separator()
        {
            Step = 1.0,
            IsEnabled = false
        }

    }
};

Обратите внимание, что в видимой точке вы указываете X и Y. Точка может иметь разное расстояние между собой (нерегулярные интервалы)

Второе решение может заключаться в том, что вы определяете массив меток следующим образом, поэтому вы делаете массив меток таким же большим, как и количество точек, но объявляете, что у вас есть только 30 элементов, остальные из них пусты.

chart.AxisX.First().Labels = new List<string>() { "1", "","2","","","3",.... "30" };
...