Равномерно распределенные точечные маркеры для неравномерно распределенных данных - PullRequest
0 голосов
/ 24 мая 2018

Для кого это может касаться:

Я хотел бы создать диаграмму типов FastLineRenderableSeries, в которой я могу добавить равномерно распределенный точечный маркер, аналогично установке StrokeDashArray для определенного шаблона линии.

В настоящее время, насколько я знаю в SciChart, вы можете установить PointMarkers на основе DataSeries, чтобы маркер появлялся в каждой точке, где встречается точка данных.Однако это не то, чего я пытаюсь достичь.

Zoomed Extents Sample - SciChart Dashed Line Styling

Zoomed In Sample - SciChart Dashed Line Styling

ВНа двух изображениях видно, что расстояние и длина штрихов остаются неизменными из-за использования DashStrokeArray, но маркеры растягиваются при увеличении масштаба. Мне известно, что маркеры точек привязаны к точкам данных в серии данных, но есть ли способ просто сделать равномерно расположенные точечные маркеры, как если бы можно было манипулировать штрихами линии?

Это позволило бы мне лучше различать данные на сильно наложенных графиках, помимо использования цветов и штрихов.

Любые предложения приветствуются.

1 Ответ

0 голосов
/ 25 мая 2018

Отличный вопрос, я боюсь, что ответ - нет, SciChart не предоставляет возможности одинакового разнесения маркеров точек данных из коробки.Как вы указали, они привязаны к точке данных.

Однако SciChart предоставляет возможность создавать собственные серии для рисования, что вы хотите.

В приведенном выше примере / статье есть примеры кода, показывающие, как визуализировать PointMarker в пользовательской серии.

Ниже приведен рабочий пример для CustomRenderableSeries, который рисует PointMarker с помощью API RenderContext.Это не отличается от нашей серии Scatter, но показывает некоторые из внутренних принципов того, как этот API работает

public class CustomPointRenderableSeries : CustomRenderableSeries
{
    protected override void Draw(IRenderContext2D renderContext, IRenderPassData renderPassData)
    {
        base.Draw(renderContext, renderPassData);

        // Get the CustomPointRenderableSeries.PointMarker to draw at original points
        // Assumes you have declared one in XAML or code
        //
        // e.g. CustomPointRenderableSeries.PointMarker = new EllipsePointMarker();
        //
        var pointMarker = base.GetPointMarker();
        if (pointMarker != null)
        {
            // The resampled data for this render pass
            var dataPointSeries = renderPassData.PointSeries;

            var xCalc = renderPassData.XCoordinateCalculator;
            var yCalc = renderPassData.YCoordinateCalculator;

            // Begin a batched PointMarker draw operation
            pointMarker.BeginBatch(renderContext, pointMarker.Stroke, pointMarker.Fill);

            // Iterate over the data
            for (int i = 0; i < dataPointSeries.Count; i++)
            {
                // Convert data to coords
                double xCoord = xCalc.GetCoordinate(dataPointSeries.XValues[i]);
                double yCoord = yCalc.GetCoordinate(dataPointSeries.YValues[i]);
                int dataIndex = dataPointSeries.Indexes[i];

                // Draw at current location
                pointMarker.MoveTo(renderContext, xCoord, yCoord, dataIndex);
            }

            // End the batch
            // Note: To change point color, start a new batch
            pointMarker.EndBatch(renderContext);
        }
    }
}

Таким образом, вы можете теоретически изменить этот пример, чтобы разместить X-координату на фиксированнойинтервал, в отличие от dataPointSeries.XValues ​​[i].

Обратите внимание, что этот код зацикливается на dataPointSeries.Count, который является значениями X, Y в области просмотра.Если вы хотите поместить дополнительные маркеры точек между точками данных, вам нужно будет как-то интерполировать значения Y.

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

enter image description here

...