Edited at

Visual Studio | WPF > グラフ > LiveCharts > 折れ線グラフ描画のパフォーマンス > 1000点: zoomingとpanningが重い | 1万点: 表示されない

More than 1 year has passed since last update.


動作環境

Windows 8.1 Pro (64bit)

Microsoft Visual Studio 2017 Community
Sublime Text 2


関連

c++ builder > TeeChart > 1つのグラフ:データ数20万件で固まる / 複数のグラフ: トータルデータ数20万件で固まる

C++ Builderでは20万件でのデータポイントでグラフが固まった。

WPF+LiveChartsではどうか。


動作環境

Windows 8.1 pro (64bit)

Core i7-6700 3.40GHz
4.0GB RAM


code


MainWindow.xaml

<Window x:Class="_171127_t1200_tooManyPoints.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:local="clr-namespace:_171127_t1200_tooManyPoints"
xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel>
<lvc:CartesianChart Series="{Binding seriesCollection}" Height="250"
LegendLocation="Right"
Zoom="Xy"/>
</StackPanel>
</Grid>
</Window>


MainWindow.xaml.cs

using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
// 以下を追加した
using LiveCharts;
using LiveCharts.Wpf;

namespace _171127_t1200_tooManyPoints
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
graph_init();
}

private void graph_init()
{
gd = new GraphData();

var sc = new SeriesCollection {
new LineSeries
{
Title = "napier",
Values = new ChartValues<double> { 2, 7, 1, 8, 2, 8, 1, 8 }
}
};

graph_add_series(sc);
gd.seriesCollection = sc;
this.DataContext = gd;
}

static readonly int kNumPoint = 1000; /****************************/

private void graph_add_series(SeriesCollection sc)
{
var lnsr1 = new LineSeries();
lnsr1.Title = "pi";
lnsr1.Values = new ChartValues<double> { };
lnsr1.Fill = Brushes.Transparent;
lnsr1.PointGeometry = null;
//
var gen = new System.Random();
for (int idx = 0; idx < kNumPoint; idx++)
{
var tmp = gen.NextDouble() * 10.0;
lnsr1.Values.Add(tmp);
}
sc.Add(lnsr1);
}

GraphData gd;
public class GraphData
{
public SeriesCollection seriesCollection { get; set; }
}
}
}



結果


1000点

描画はされる。

zoomingやpanningの動作が重く感じる。

qiita.png


1万点

30秒程度待ったが描画される気配はない。

最適な描画方法は別途あるのだろうか。

30 Series 10k points each

を見ると、もっと軽快な感じではないかと思うが何が違うのだろうか。

Geared(68.9 USD)を使わないと無理なのだろうか。

https://lvcharts.net/licensing/pricing


and plot millions of points in practically no time,


30 Series 10k points eachでは下記の処理で描画点数を減らしているように思う。

Values = values.AsGearedValues().WithQuality(Quality.Low)


パフォーマンスチューニング

Improve Performance