首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LiveCharts -连接缺失点

LiveCharts -连接缺失点
EN

Stack Overflow用户
提问于 2019-11-12 22:32:44
回答 1查看 967关注 0票数 1

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

带间隙的电流图:

我想跨越这些差距:

如果可能的话,的目标:

MainWindow.xaml

代码语言:javascript
复制
<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

代码语言:javascript
复制
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,
                            double.NaN,
                            5,
                            2,
                            8,
                            double.NaN,
                            6
                        }
                    }, 
                    new LineSeries
                    {
                        Title = "Dataset 2",
                        Values = new ChartValues<double>
                        {
                            2,
                            3,
                            4,
                            5,
                            6,
                            3,
                            1,
                            4,
                            5,
                            3
                        }
                    }
                };

            DataContext = this;
        }

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


    }
}

有什么方法可以用LiveCharts来完成吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-14 00:59:17

这看起来更像是一个数学三角问题,在这个问题中,你必须找出缺失点的坐标,并将它们添加到SeriesCollection中,这样你就可以得到碎片之间的平面擦拭接头。

考虑以下基于您的图表的解释性图片:

XY之间,我们必须推导出两个点,AB (我们知道需要两者之间,因为我们可以从X<代码>E 211>和E 112Y<代码>E 213之间的间隔推断出这两个点,或者我们可以简单地计算初始集合中的d14s)。A,&B,,Y坐标可以用我们已经知道的和角度α很容易地推导出来。我们期待着计算出、BB‘、和_AA’\x大小(加上y与索引之间的距离,应该表示最终的A和BE 230)。

我们基本上知道的是:tan(α)= XZ‘区/区B’y=区区/区,A‘y=区区/ZY区/ZY区

为了简单起见,让我们假设X轴和Y轴中的所有间隔等于1,我将在后面再讨论这个问题。

现在我们确实知道了,xz,xz,zy,,(xz是x和y之间的区别,zy是基本上有多少NaN在其中),所以我们可以很容易地计算出,BB‘,,,。

  • |BB'| =(x_y/_~_~_

在这里,上面解释的基本实现是什么样子(代码应该是不言自明的):

代码语言:javascript
复制
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,
            double.NaN,
            5,
            2,
            8,
            double.NaN,
            6
        };
        Series = new SeriesCollection
        {
            new LineSeries
            {
                Title = "Dataset 1",
                Values = ProcessChartValues(chartValues)
            },
            new LineSeries
            {
                Title = "Dataset 2",
                Values = new ChartValues<double>
                {
                    2,
                    3,
                    4,
                    5,
                    6,
                    3,
                    1,
                    4,
                    5,
                    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; }
}

在这里,输出:

现在回到我们的区间大小,注意到由于我们的interval=1假设,碎片是如何不尖锐的,但是另一方面,这个假设给了图一些平滑性,这很可能是任何人所追求的。如果您仍然需要有清晰的片段,您可以探索LiveChart API来获得以像素为单位的间隔,我不确定它们提供的像素值(然后简单地用xz和zy大小相乘),否则您可以从图表绘制区域的ActualWidth和ActualHight中推断出它。

最后,应该对代码进行扩展,以处理边缘上的NaN点(要么忽略它们,要么定义图形应该指向的方向)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58827689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档