我正在使用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,
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来完成吗?
发布于 2019-11-14 00:59:17
这看起来更像是一个数学三角问题,在这个问题中,你必须找出缺失点的坐标,并将它们添加到SeriesCollection中,这样你就可以得到碎片之间的平面擦拭接头。
考虑以下基于您的图表的解释性图片:

在X和Y之间,我们必须推导出两个点,A和B (我们知道需要两者之间,因为我们可以从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/_~_~_在这里,上面解释的基本实现是什么样子(代码应该是不言自明的):
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点(要么忽略它们,要么定义图形应该指向的方向)。
https://stackoverflow.com/questions/58827689
复制相似问题