用于非均匀间隔数据的均匀间隔点标记

时间:2018-05-24 16:12:25

标签: c# wpf scichart

这可能涉及到谁:

我想创建一个FastLineRenderableSeries类型图表,我可以添加均匀间隔的点标记,类似于将StrokeDashArray设置为特定的线条图案。

目前,据我所知,在SciChart中,您可以根据DataSeries设置PointMarkers,以便在出现数据点的每个点上显示标记。但是,这不是我想要实现的目标。

Zoomed Extents Sample - SciChart Dashed Line Styling

Zoomed In Sample - SciChart Dashed Line Styling

在提供的2张图片中,您可以看到由于使用DashStrokeArray,短划线间距和长度保持一致,但是当我放大时,标记会展开。我知道点标记与数据相关联数据系列中的点,但有没有什么方法可以简单地制作均匀间隔的点标记,就像可以操纵一条线的破折号一样?

除了使用颜色和破折号之外,这样我还可以更好地区分重叠图中的数据。

非常感谢任何建议。

1 个答案:

答案 0 :(得分:2)

很好的问题,我担心答案是否定的,SciChart没有提供开箱即用的数据点标记等间距的功能。正如您所指出的,它们与数据点相关联。

但是,SciChart确实能够create a custom series绘制你想要的任何东西。

在上面的示例/文章中,有代码示例向您展示如何在自定义系列中呈现PointMarker。

  

下面找到了一个使用RenderContext API绘制PointMarker的CustomRenderableSeries的工作示例。这与我们的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-coord而不是dataPointSeries.XValues [i]。

请注意,此代码循环遍历dataPointSeries.Count,即视口中的X,Y值。如果要在数据点之间放置额外的点标记,则需要以某种方式插入Y值。

这是对读者的练习,但是如何使用SciChart的库来创建自定义系列是可能的。

enter image description here