LiveCharts-连接缺失点

我正在使用LiveCharts在同一张图上绘制多个折线图。一些图表缺少数据点。

当前带有差距的图形:

LiveCharts-连接缺失点

我想跨越这些差距:

目标(如果可能):

LiveCharts-连接缺失点

MainWindow.xaml

<Window x:Class="LiveChartsTest.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:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <lvc:CartesianChart Series="{Binding Series}">
            <lvc:CartesianChart.AxisX>
                <lvc:Axis Title="Date" Labels="{Binding Labels}"/>
            </lvc:CartesianChart.AxisX>
        </lvc:CartesianChart>
    </Grid>
</Window>

MainWindow.xaml.cs

using LiveCharts;
using LiveCharts.Wpf;
using System;
using System.Windows;

namespace LiveChartsTest
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            // Create date labels
            Labels = new string[10];
            for (int i = 0; i < Labels.Length; i++)
            {
                Labels[i] = DateTime.Now.Add(TimeSpan.FromDays(i)).ToString("dd MMM yyyy");
            }

            Series = new SeriesCollection
                {
                    new Lineseries
                    {
                        Title = "Dataset 1",Values = new Chartvalues<double>
                        {
                            4,5,7,double.NaN,2,8,6
                        }
                    },new Lineseries
                    {
                        Title = "Dataset 2",Values = new Chartvalues<double>
                        {
                            2,3,4,6,1,3
                        }
                    }
                };

            DataContext = this;
        }

        public SeriesCollection Series { get; set; }
        public string[] Labels { get; set; }


    }
}

有什么办法可以通过LiveCharts做到这一点?

wangzhenhxy 回答:LiveCharts-连接缺失点

这看起来更像是一个数学三角学问题,您必须找出缺失点的坐标并将其添加到SeriesCollection中,以便最终可以找到碎片之间的扁平接头。

请根据您的图表考虑以下解释性图片:

enter image description here

X Y 之间,我们必须推断出两个点: A B (我们知道我们之间需要两个,因为我们可以从 X Y 之间的间隔推论得出,或者我们可以简单地计算初始集合中的NaN个。 A B 可以使用我们已知的知识和角度α轻松推导出Y坐标。 我们希望计算 | BB'| | AA'| 大小(加到 y 与索引之间的距离中)最后 A B

我们基本上知道: tan(α)= | BB'| / | B'Y | = | AA'| / | A'Y | = | XZ | // ZY |

为简单起见,现在我们假设 X轴 Y轴的所有间隔都等于1,我将在稍后再讨论。

现在我们知道 | XZ | / | ZY | ,( xz 是x和y之差,而 zy 基本上是介于两者之间的NaN),因此我们可以轻松地计算 | BB'| | AA'|

  • | BB'| =(|| XZ | // | ZY |)* | B'Y | (请注意,由于 | B'Y | 等于一个单位间隔,因此等于1)
  • | AA'| =(|| XZ | // | ZY |)* | A'Y | (请注意, | A'Y | 等于两个单位的间隔)

以下是上述基本实现的样子(代码应该是不言自明的):

public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();
        // Create date labels
        Labels = new string[10];
        for (int i = 0; i < Labels.Length; i++)
        {
            Labels[i] = DateTime.Now.Add(TimeSpan.FromDays(i)).ToString("dd MMM yyyy");
        }

        var chartValues = new ChartValues<double>
        {
            4,5,7,double.NaN,2,8,6
        };
        Series = new SeriesCollection
        {
            new LineSeries
            {
                Title = "Dataset 1",Values = ProcessChartValues(chartValues)
            },new LineSeries
            {
                Title = "Dataset 2",Values = new ChartValues<double>
                {
                    2,3,4,6,1,3
                }
            }
        };

        DataContext = this;
    }

    private ChartValues<double> ProcessChartValues(ChartValues<double> chartValues)
    {
        var tmpChartValues = new ChartValues<double>();
        double bornLeft =0,bornRight=0;
        double xz = 0,zy = 0,xy = 0;
        bool gapFound = false;
        foreach (var point in chartValues)
        {
            if (!double.IsNaN(point))
            {
                if (gapFound)
                {
                    // a gap was found and it needs filling 
                    bornRight = point;
                    xz = Math.Abs(bornLeft - bornRight);
                    for (double i = zy; i >0; i--)
                    {
                        tmpChartValues.Add((xz / zy) * i + Math.Min(bornLeft,bornRight));
                    }

                    tmpChartValues.Add(point);
                    gapFound = false;
                    zy = 0;
                }
                else
                {
                    tmpChartValues.Add(point);
                    bornLeft = point;
                }
            }
            else if(gapFound)
            {
                zy += 1;
            }
            else
            {
                zy += 1;
                gapFound = true;
            }
        }
        return tmpChartValues;
    }

    public SeriesCollection Series { get; set; }
    public string[] Labels { get; set; }
}

这里是输出:

enter image description here

现在回到间隔大小,请注意由于我们的 interval = 1 假设而导致片段不锐利,但是另一方面,该假设为图形提供了最大程度的平滑度可能有人会追随。如果您仍然需要锐利的片段,可以探索LiveChart API以获取不确定的像素间隔(我不确定它们提供的间隔)(然后只需乘以 xz zy 大小),否则您可以从图表绘制区域的ActualWidthActualHight推导出来。

最后一点,应该扩展代码以处理边缘上的NaN点(您必须忽略它们或定义图形应遵循的方向)。

本文链接:https://www.f2er.com/3113888.html

大家都在问