C# 非等间距数据的等间距点标记
这可能与以下人员有关: 我想创建一个FastLineRenderableSeries类型图表,在其中可以添加等距点标记,类似于将StrokeDashArray设置为特定线型 目前,据我在SciChart中所知,您可以基于数据系列设置点标记,以便在出现数据点的每个点上都显示一个标记。然而,这不是我想要实现的 在提供的两幅图像中,您可以看到,由于使用DashStrokeArray,虚线间距和长度保持一致,但随着我的放大,标记会展开。我知道点标记与数据系列中的数据点相关联,但是有没有任何方法可以简单地使等距点标记像可以操纵直线的虚线一样 除了使用颜色和破折号外,这将使我能够更好地区分重重叠图中的数据C# 非等间距数据的等间距点标记,c#,wpf,scichart,C#,Wpf,Scichart,这可能与以下人员有关: 我想创建一个FastLineRenderableSeries类型图表,在其中可以添加等距点标记,类似于将StrokeDashArray设置为特定线型 目前,据我在SciChart中所知,您可以基于数据系列设置点标记,以便在出现数据点的每个点上都显示一个标记。然而,这不是我想要实现的 在提供的两幅图像中,您可以看到,由于使用DashStrokeArray,虚线间距和长度保持一致,但随着我的放大,标记会展开。我知道点标记与数据系列中的数据点相关联,但是有没有任何方法可以简
非常感谢您的建议。好问题,恐怕答案是否定的,SciChart不提供开箱即用的等距数据点标记功能。正如您所指出的,它们与一个数据点相关联 然而,SciChart确实提供了绘制任意内容的能力 在上面的示例/文章中,有一些代码示例向您展示如何在自定义系列中呈现点标记 下面是CustomRenderableSeries的一个工作示例,它使用RenderContext API绘制点标记。这与我们的散点系列没有什么不同,但展示了该API如何工作的一些内部内容
公共类CustomPointRenderableSeries:CustomRenderableSeries
{
受保护的替代无效绘图(IRenderContext2D renderContext、IRenderPassData renderPassData)
{
base.Draw(renderContext、renderPassData);
//获取CustomPointRenderableSeries.PointMarker以在原始点绘制
//假设您已经在XAML或代码中声明了一个
//
//例如,CustomPointRenderableSeries.PointMarker=新的EllipsePointMarker();
//
var pointMarker=base.GetPointMarker();
if(pointMarker!=null)
{
//此渲染过程的重采样数据
var dataPointSeries=renderPassData.PointSeries;
var xCalc=renderPassData.XCoordinateCalculator;
var yCalc=renderPassData.ycCoordinateCalculator;
//开始批处理点标记绘制操作
pointMarker.BeginBatch(renderContext、pointMarker.Stroke、pointMarker.Fill);
//迭代数据
对于(int i=0;i
因此,从理论上讲,您可以修改这个示例,使X坐标以固定的间隔隔开,而不是以dataPointSeries.XValues[i]隔开
请注意,此代码在dataPointSeries.Count上循环,dataPointSeries.Count是视口中的X,Y值。如果要在数据点之间放置额外的点标记,则需要以某种方式插值Y值
对于读者来说,这是一个练习,但是如何与SciChart的库交互以创建自定义系列是可以使用上述方法实现的
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);
}
}
}