bucket-sort logo bucket-sort

プログラミングとインフラエンジニアリングの覚え書き

  • Posts
  • About
  • Contact
  1. Home
  2. All Posts
  3. [C#] LiveChartsCoreで折れ線グラフを表示する(基本からレンジ切替まで)

[C#] LiveChartsCoreで折れ線グラフを表示する(基本からレンジ切替まで)

Jan 26, 2026 C# , .NET bucket-sort

LiveChartsCore を使ったグラフ表示をアプリケーションに組み込みました。

LiveChartsCore の折れ線グラフ表示例

LiveChartsCore の使い方を簡単な覚え書きとして残します。

LiveChartsCore とは?

LiveChartsCore は、.NET 向けのオープンソースのグラフ描画ライブラリです。

WPF / WinForms / Avalonia / MAUI など複数のUIフレームワークに対応しており、

  • 折れ線グラフ
  • 棒グラフ
  • 円グラフ
  • ヒートマップ

などを簡単に描画できます。

.NET 標準にも System.Windows.Forms.DataVisualization などのグラフ機能は存在しますが、

  • API が古い
  • スタイリングがやや扱いにくい
  • MVVMとの相性があまり良くない

といった面があります。

その点、LiveChartsCore は

  • モダンなAPI設計
  • バインディングベースの構成
  • アニメーション対応
  • クロスプラットフォーム

といった特徴があり、現在よく使われているグラフライブラリの一つです。

インストール方法(WPFの場合)

NuGet からインストールします。

Package Manager Console

Install-Package LiveChartsCore.SkiaSharpView.WPF

または

dotnet CLI

dotnet add package LiveChartsCore.SkiaSharpView.WPF

これで LiveChartsCore と SkiaSharp が一緒に導入されます。

XAML では以下の名前空間を追加します。

xmlns:lvc="clr-namespace:LiveChartsCore.SkiaSharpView.WPF;assembly=LiveChartsCore.SkiaSharpView.WPF"

1. まずは最小構成(固定データ)

まずは「とにかく折れ線グラフを表示する」最小構成です。

XAML

<Window x:Class="Keys.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:lvc="clr-namespace:LiveChartsCore.SkiaSharpView.WPF;assembly=LiveChartsCore.SkiaSharpView.WPF"
        Title="LiveCharts Sample" Height="450" Width="800">

    <Grid>
        <lvc:CartesianChart
            Series="{Binding Series}"
            XAxes="{Binding XAxes}"
            YAxes="{Binding YAxes}" />
    </Grid>
</Window>

C# コード(最小構成)

using LiveChartsCore;
using LiveChartsCore.SkiaSharpView;
using System.Linq;
using System.Windows;

namespace Keys;

public partial class MainWindow : Window
{
    public ISeries[] Series { get; set; }
    public Axis[] XAxes { get; set; }
    public Axis[] YAxes { get; set; }

    public MainWindow()
    {
        InitializeComponent();

        var values = new long[] { 1200, 1350, 1280, 1600, 1420, 1500, 1700 };

        Series =
        [
            new LineSeries<long>
            {
                Values = values,
                GeometrySize = 6
            }
        ];

        XAxes =
        [
            new Axis
            {
                Labels = new[] { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" }
            }
        ];

        YAxes = [ new Axis() ];

        DataContext = this;
    }
}

ここでのポイント

LiveChartsCore の基本は次の3つです。

  • Series … 実際のデータ
  • XAxes … 横軸の設定
  • YAxes … 縦軸の設定

データは LineSeries<T> に Values として渡します。

2. レンジ切替を追加する

次に、表示範囲を切り替えられるようにしてみます。

UIに ComboBox を追加

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <ComboBox Grid.Row="0"
              Width="150"
              SelectedIndex="0"
              SelectionChanged="RangeCombo_SelectionChanged">
        <ComboBoxItem Content="Last 7 days"/>
        <ComboBoxItem Content="Last 30 days"/>
        <ComboBoxItem Content="Last 90 days"/>
    </ComboBox>

    <lvc:CartesianChart Grid.Row="1"
                        Series="{Binding Series}"
                        XAxes="{Binding XAxes}"
                        YAxes="{Binding YAxes}" />
</Grid>

C# 側を少し拡張

private readonly long[] _allValues =
{
    1000,1100,1050,1200,1300,1250,1400,
    1350,1500,1600,1550,1700,1800,1750
};

private void LoadRange(int days)
{
    var values = _allValues.TakeLast(days).ToArray();

    Series =
    [
        new LineSeries<long>
        {
            Values = values,
            GeometrySize = 6
        }
    ];

    XAxes =
    [
        new Axis
        {
            Labels = Enumerable.Range(1, values.Length)
                               .Select(i => $"Day {i}")
                               .ToArray()
        }
    ];

    YAxes = [ new Axis() ];

    DataContext = null;
    DataContext = this;
}

private void RangeCombo_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
    var days = ((System.Windows.Controls.ComboBox)sender).SelectedIndex switch
    {
        0 => 7,
        1 => 14,
        _ => _allValues.Length
    };

    LoadRange(days);
}

ここで分かること

  • Series を差し替えればグラフは更新される
  • バインディング経由でUIに反映される
  • 軸ラベルも動的に変更できる

まとめ

LiveChartsCore では、

  • データは LineSeries<T> に渡す
  • 軸は Axis で定義する
  • Series を更新すれば再描画される

という非常にシンプルな構造になっています。

まずは最小構成で動かし、次に動的変更を追加する。

この順番で理解すると、LiveChartsCore はとても扱いやすいライブラリです。

C# .NET WPF LiveChartsCore Code Snippet
← [C#] グローバルフックとキーボードフックを理解する - SetWindowsHookExの使い方 RDSのステータスがoptimizing / storage-optimizationのまま長時間続くのは何をしているのか? →

Related Posts

  • [C#] グローバルフックとキーボードフックを理解する - SetWindowsHookExの使い方 Jan 25, 2026
  • [C#] .NETが用意しているアプリケーションの設定クラスを試す - ConfigurationBuilder Jan 20, 2026
  • [C#] アプリケーションの設定をJSON形式で保存する - JsonSerializer Jan 19, 2026
  • [C#] アプリケーションのデータをJSONにシリアライズする - JsonSerializer Jan 18, 2026

Table of Contents

  • LiveChartsCore とは?
  • インストール方法(WPFの場合)
    • Package Manager Console
    • dotnet CLI
  • 1. まずは最小構成(固定データ)
    • XAML
    • C# コード(最小構成)
    • ここでのポイント
  • 2. レンジ切替を追加する
    • UIに ComboBox を追加
    • C# 側を少し拡張
    • ここで分かること
  • まとめ

Recent Posts

  • Laravel の Event / Listener で Pub/Sub を実装する Apr 2, 2026
  • [C#] delegate と event の仕組みを整理する Apr 1, 2026
  • Pub/Sub パターンとは何か Mar 31, 2026
  • PHP/Laravel で値の状態を判定するヘルパ関数まとめ Mar 30, 2026
  • Filament の dehydrated メソッドとは何か Mar 29, 2026

Categories

  • AWS27
  • C#22
  • .NET20
  • Laravel16
  • Linux12
  • Apache8
  • MySQL8
  • PHP8
  • DynamoDB6
  • Nginx5
  • WordPress4
  • インフラ4
  • Hugo3
  • セキュリティ3
  • .NET Framework1
  • Aurora1
  • Filament1
  • Git1
  • SQS1

Tags

  • AWS
  • C#
  • .NET
  • Laravel
  • PHP
  • MySQL
  • セキュリティ
  • Linux
  • Apache
  • Code Snippet
  • DynamoDB
  • NoSQL
  • PHP-FPM
  • RDS
  • DoS
  • Nginx
  • Windows
  • WordPress
  • パフォーマンス
  • 監視
  • Amazon Linux 2023
  • CMS
  • Docker
  • Ipset
  • Iptables
  • OPCache
  • Webサーバー
  • 認可
  • Aurora
  • Blade
Powered by Hugo & Explore Theme.