如何快速向WPF图表添加数据点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何快速向WPF图表添加数据点相关的知识,希望对你有一定的参考价值。

您好我有一个大型数据库,我从中获取1500个值,以便在图表中显示。

我的问题是显示所有点需要很长时间,我认为是因为动画设置。

如何更改动画的速度,还是有办法更快地显示点?

<UserControl x:Class="Ipte.UI.Pages.StatisticsPage"
        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:gcl="clr-namespace:GuiControlLibrary;assembly=GuiControlLibrary"
        xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
             xmlns:time="clr-namespace:Ipte.UI"
        xmlns:chartToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit"
        mc:Ignorable="d"
        Height="800" Width="1200">
    <UserControl.Resources>
        <Style x:Key="Scater" TargetType="chartToolkit:ScatterDataPoint">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="chartToolkit:ScatterDataPoint">
                        <Viewbox x:Name="viewbox">
                            <!--<Ellipse Width="1" Height="1" Fill="Black"/>-->
                        </Viewbox>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="Width" Value="4"/>
            <Setter Property="Height" Value="4"/>
        </Style>
    </UserControl.Resources>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid x:Name="filterGrid" Grid.Column="0" Margin="4">
            <StackPanel>
                <TextBlock Text="" Margin="2"/>
                <toolkit:DatePicker x:Name="dpStartDate" Margin="2" />
                <time:TimePicker x:Name="tpStartTime" Margin="2"/>             
                <TextBlock Text="End date &amp; time:" Margin="2"/>
                <toolkit:DatePicker x:Name="dpEndDate" Margin="2"/>
                <time:TimePicker x:Name="tpEndTime" Margin="2"/>

                <gcl:GuiGroupBox Header="Select router" BorderBrush="LightGray">
                    <UniformGrid Rows="2" Columns="2">
                        <CheckBox x:Name="cbEr11" Content="ER 1.1" Margin="2"/>
                        <CheckBox x:Name="cbEr12" Content="ER 1.2" Margin="2"/>
                        <CheckBox x:Name="cbEr21" Content="ER 2.1" Margin="2"/>
                        <CheckBox x:Name="cbEr22" Content="ER 2.1" Margin="2"/>
                    </UniformGrid>
                </gcl:GuiGroupBox>
                <TextBlock Text="" Margin="2"/>
                <ComboBox x:Name="cmbGoodBad" Margin="2"/>
                <TextBlock Text="" Margin="2"/>
                <TextBox x:Name="" Margin="2"/>
                <TextBlock Text="" Margin="2"/>
                <TextBox x:Name="" Margin="2"/>
                <gcl:GuiGroupBox Header="Select value" BorderBrush="LightGray">
                    <StackPanel>
                        <RadioButton x:Name="combValueA" Content="Value A" Margin="2"/>
                        <RadioButton x:Name="combValueB" Content="Value B" Margin="2"/>
                        <RadioButton x:Name="combValueC" Content="Value C" Margin="2"/>
                    </StackPanel>
                </gcl:GuiGroupBox>
                <Button x:Name="btnResetFilters" Content="Reset filters" Margin="2 10 2 2" Click="ResetFilters_Click"/>
                <Button x:Name="btnUpdateChart" Content="Update Chart" Margin="2 2 2 2" Click="UpdateChartAndFilters_Click"/>
                <Button x:Name="btnLoadFile" Content="Load file..." Grid.Column="0" VerticalAlignment="Top" Margin="2" Visibility="Visible" Click="OpenFile_Click"/>
            </StackPanel>
            <Button x:Name="deleteDatabase" Content="Delete database" Grid.Column="0" VerticalAlignment="Bottom" Margin="2" Click="deleteDatabase_Click"/>
        </Grid>
        <chartToolkit:Chart Grid.Column="1" x:Name="dataChart">
            <chartToolkit:Chart.Series>
                <chartToolkit:ScatterSeries x:Name="scatterSeries"
                                        ItemsSource="{Binding}"
                                        DependentValueBinding="{Binding Path=Value}"
                                        IndependentValueBinding="{Binding Path=Key}" 
                                        IsSelectionEnabled="False"
                                           AnimationSequence="Simultaneous">
                    <chartToolkit:ScatterSeries.IndependentAxis>
                        <chartToolkit:DateTimeAxis Orientation="X" Title="Time"/>
                    </chartToolkit:ScatterSeries.IndependentAxis>
                    <chartToolkit:ScatterSeries.DependentRangeAxis>
                        <chartToolkit:LinearAxis Orientation="Y" Title="Points" x:Name="yAxis"/>
                    </chartToolkit:ScatterSeries.DependentRangeAxis>
                </chartToolkit:ScatterSeries>
                <chartToolkit:LineSeries x:Name="lineSeriesMax"
                                         Title="Maximum"
                                         ItemsSource="{Binding}"
                                         DependentValueBinding="{Binding Path=Value}"
                                         IndependentValueBinding="{Binding Path=Key}">
                </chartToolkit:LineSeries>
                <chartToolkit:LineSeries x:Name="lineSeriesMin"
                                         Title="Minimum"
                                         ItemsSource="{Binding}"
                                         DependentValueBinding="{Binding Path=Value}"
                                         IndependentValueBinding="{Binding Path=Key}">
                </chartToolkit:LineSeries>
                <chartToolkit:LineSeries x:Name="lineSeriesAvg"
                                         Title="Average"
                                         ItemsSource="{Binding}"
                                         DependentValueBinding="{Binding Path=Value}"
                                         IndependentValueBinding="{Binding Path=Key}">
                </chartToolkit:LineSeries>
            </chartToolkit:Chart.Series>
        </chartToolkit:Chart>
    </Grid>
</UserControl>

这是我的点数显示方式:

答案

该帖子已由其所有者自愿删除。

另一答案

我知道这是一个较老的问题,但我想分享我对WPF中的图表的想法,这不仅仅是绘制几个条形或散点或线。

可能每个人都同意库存WPF库没有构建,并且打算在图表方面处理数千甚至数百万的数据点。无论我尝试过哪些变通方法,例如数据采样,我都对用WPF图表功能不太满意。如果您正在努力绘制数据而不仅仅是一次性原型设计追求,我强烈建议您查看专业的WPF图表库。

我特别使用Scichart,一个第三方供应商WPF库,多年来并不能说它的能力。我经常绘制数十万,有时数百万的分散数据点,最近还渲染了大量数据的3D图表,并发现Scichart具有高性能。它的成本超过“​​免费”,但我发现投资超过了它的价值(因为我试着在这里加入你的问题):

  • 2D和3D库是坚如磐石的,我的意思是渲染性能是恒星,绑定只是工作,几乎任何东西都可以定制,完整的MVVM支持
  • 文档和支持论坛可能是Scichart提供的最佳部分。大多数问题,甚至更棘手的问题都已得到解决,如果无法找到某些问题,那么其他用户或支持团队会及时做出回应。
  • 特别是对于您的问题,使用Scichart,您只需通过绑定或直接将数据集一次性添加为数组,并在几毫秒内呈现。如果您需要逐个添加数据点,它的实时功能也是惊人的。

我强烈建议你试一试,他们提供试用许可证。我尝试使用DevExpress绘图,我也拥有许可证,他们的图表功能超出了一些数据点,他们的图表更适合于数据点很少的仪表板。我也尝试并使用Arction's lightningchart库一段时间,虽然原始性能与Scichart相当,但它们的样式绝对可怕,它们的MVVM功能几乎不存在,事实上当你看一下他们的文档时,你会看到一个很多解决问题的解决方案建议都在代码背后。他们的支持论坛和Q&A存储库也非常稀少,这通常会让我失望,因为在某些时候,每个开发人员都会遇到他/她需要查找解决方案的问题。

说实话,如果您只查看1500个数据点并获得DevExpress许可证,那么请使用它们,因为我认为它们仍然可以处理1500点,但更多可能会变得棘手。但是,如果你看到需要更大数据集的图表功能,那么我就不能高度谈论Scichart。为什么?因为我从早期版本1.3.x.xxxx开始使用该库。我真的相信它们是WPF空间中最好的图表库。

另一答案

如果您的主要优先级是折线图并考虑切换到第三方组件供应商,您可以将DevExpress ChartControl视为合适的选项。

例如,最新版本的DevExpress组件附带“大数据源”演示模块,可以显示多达500K点,而不会出现性能下降(这包括滚动和缩放等交互操作)。

以上是关于如何快速向WPF图表添加数据点的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 UIBezierPath 创建带有数据点的曲线图?

Google Visualization Annotated Time Line,删除数据点

添加数据点对 SVM 与 SVM 损失的影响软最大

wpf有没有好用的chart控件?

如何在 Plotly 中添加跟踪,并为沿 x 轴的每个数据点设置自定义顺序?

LightningChartJS网页图表代码示例--Lineseries线性图