使用实时图表创建 WPF C# 图表

Create a WPF C# chart with Live Chart

我使用实时图表。 SeriesCollection 传递一个线系列,其中值 = 图表值。在xaml的Binding中,我通过了SeriesCollection。我知道只传输 y 点(默认情况下我不做任何更改)。如何传输x点?按索引在 ChartValue 中尝试,发誓索引为空。即使您最初设置了图表值的大小,图表上未填充的单元格也会填充为 Y = 0。请帮助,已经三天了。

GenerateChart.cs:

public ChartValues<double> Points { get; set; }
        double[] arraySeries = new double[30];
        double[] array = new double[20];
        public LineSeries GenerateSeries(string axis)
        {
            Random randomSeries = new Random();
            ChartValues<double> series = new ChartValues<double>(new double[20]);

            if (axis == "Y")
            {
                for (int i = 0; i < 5; i++)
                {
                    double randomValue = randomSeries.Next(1, 20);
                    if (!array.Contains(randomValue))
                    {
                        array[i] = randomValue;
                    }
                    else
                    {
                        i--;
                    }
                }

                for (int i = 0; i < 5; i++)
                {
                    double randomValue = randomSeries.Next(1, 20);
                    if (!arraySeries.Contains(randomValue))
                    {
                        int index = Convert.ToInt32(array[i]);
                        arraySeries[index] = randomValue;
                    }
                    else
                    {
                        i--;
                    }
                }

                for (int i = 0; i < 20; i++)
                {
                    if (arraySeries[i] != 0)
                    {
                        series.Insert(i, arraySeries[i]);
                    }
                }
                //series.AddRange(arraySeries);

            }
            Points = series;
            var testSeries = new LineSeries
            {
                Title = "Test",
                Values = series
            };

            return testSeries;
        }

RandomSeries.cs:

public SeriesCollection Series { get; private set; }

        public SeriesCollection SeriesX { get; private set; }

        public ChartValues<double> Points { get; private set; }
        double[] arraySeries = new double[30];
        double[] array = new double[20];
        public SeriesCollection BuidChart()
        {
            Random randomSeries = new Random();
            var generateChart = new GenerateChart();

            Series = new SeriesCollection 
            {
                generateChart.GenerateSeries("Y")
            };
            Points = generateChart.Points;
            return Series;
        } 

ModelView.cs:

public SeriesCollection SeriesCollection { get; set; }
        public ChartValues<double> Points { get; set; }
        public RandomSeries randomSeries;
        public Func<double, string> YFormatter { get; set; }
        public string[] Labels { get; set; }
        public SeriesCollection SeriesCollectionX { get; set; }
        public void BuildFunction()
        {
            //Points.Clear();
            //SeriesCollection.Clear();
            randomSeries = new RandomSeries();
            SeriesCollection = new SeriesCollection();
            Points = new ChartValues<double>();
            SeriesCollection.AddRange(randomSeries.BuidChart());
            //Points.AddRange(randomSeries.Points);
            //SeriesCollection.AddRange(randomSeries.BuidChart());
            //Points.AddRange(randomSeries.Points);
            Labels = new[] { "Jan", "Feb", "Mar", "Apr", "May", "Jan1", "Feb1", "Mar1", "Apr1", "May1" };
        }

MainWindow.xaml:

<Window.DataContext>
        <local:ModelView/>
    </Window.DataContext>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="257*"/>
            <ColumnDefinition Width="536*"/>
        </Grid.ColumnDefinitions>
        <lvc:CartesianChart Series="{Binding SeriesCollection}" LegendLocation="Right" Grid.ColumnSpan="2" Margin="0,0,-0.4,0" >
            <!--<lvc:CartesianChart.AxisY>
                <lvc:Axis Title="Y" LabelFormatter="{Binding YFormatter}"></lvc:Axis>
            </lvc:CartesianChart.AxisY>-->
            <lvc:CartesianChart.AxisX>
                <lvc:Axis Title="X" Labels="{Binding Labels}"></lvc:Axis>
            </lvc:CartesianChart.AxisX>
        </lvc:CartesianChart>
    </Grid>

Result program: enter image description here

好的,在 LiveChart 中可以使用代表图表中 X、Y 位置的 ObservablePoint。

您需要添加适当的命名空间才能使用这些

using LiveCharts.Defaults;

我在你的函数中修改了两件事,首先我将 ChartValues 的定义和初始化更改为空和 ObservablePoint 的类型,因此稍后我们将动态填充这些。您还需要将 Points 对象更改为 ObservablePoint

类型
ChartValues<ObservablePoint> series = new ChartValues<ObservablePoint>();

并且还修改了这些系列对象的填充以仅添加非零:

for (int i = 0; i < 20; i++)
{
    if (arraySeries[i] != 0)
    {
        series.Add(new ObservablePoint(i, arraySeries[i]));
    }
 }

它不会在非零之间绘制零点。