如何快速向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 & 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,删除数据点