C# Chart入門:グラフ表示の基本から実装サンプル・おすすめライブラリまで徹底解説

はじめに

C#で業務アプリや分析ツールを作っていると、「売上推移を折れ線グラフで見たい」「センサー値をリアルタイムに表示したい」「CSVデータを読み込んで棒グラフにしたい」といった場面がよくあります。こうしたデータ可視化を実現する代表的な方法が、C# Chartを使ったグラフ表示です。

C# Chartといっても、WinForms標準のChartコントロールだけを指すわけではありません。WPF、ASP.NET Core、Blazor、.NET 6以降のデスクトップアプリでは、ScottPlot、LiveCharts2、OxyPlot、SciChart、LightningChartなど、用途に応じてさまざまなChartライブラリを選択できます。

この記事では、C# Chartの基本概念から、WinFormsでの実装サンプル、グラフのカスタマイズ、リアルタイム更新、大量データ表示、よくあるエラー、ライブラリ比較、実務での選び方までを体系的に解説します。

1. C# Chartとは?グラフ表示でできること

1-1. C# Chartの基本:データを視覚化する仕組み

C# Chartとは、C#アプリケーション内で数値データやカテゴリデータをグラフとして表示するための仕組みです。たとえば、配列、List、DataTable、CSV、データベース、APIレスポンスなどから取得したデータを、折れ線グラフ、棒グラフ、円グラフ、散布図などに変換して画面に表示できます。

WinFormsの標準Chartコントロールでは、Chart本体の中にSeriesとChartAreaを配置します。Seriesは表示するデータ系列、ChartAreaはグラフを描画する領域や軸を管理する要素です。MicrosoftのChartクラスの説明でも、Seriesは表示データと属性を保持し、ChartAreasは軸を使って1つ以上のグラフを描画する領域として説明されています。

1-2. C#で作成できる主なグラフの種類

C# Chartで作成できる代表的なグラフには、次のようなものがあります。

グラフ種類主な用途
折れ線グラフ売上推移、温度変化、アクセス数の時系列表示
棒グラフ月別売上、カテゴリ別件数、比較データ
円グラフ構成比、割合、アンケート結果
散布図相関分析、測定値の分布、実験データ
面グラフ累積推移、時系列のボリューム表現
レーダーチャート評価項目、スキル分析、性能比較
ローソク足チャート株価、為替、金融データ
ヒートマップ密度、温度分布、マトリクスデータ

初心者が最初に学ぶなら、折れ線グラフ、棒グラフ、円グラフ、散布図の4つを押さえるのがおすすめです。この4種類を理解すれば、多くの業務アプリで必要なC# Chart表示を実装できます。

1-3. WinForms・WPF・ASP.NET・BlazorでのChart表示の違い

C# Chartの実装方法は、アプリケーションの種類によって大きく変わります。

WinFormsでは、標準のChartコントロールをフォームに配置して使う方法が定番です。Visual Studioのデザイナーから配置でき、コードも比較的シンプルなので、C# Chart入門に向いています。

WPFでは、標準で高機能なChartコントロールが用意されているわけではないため、LiveCharts2、OxyPlot、ScottPlotなどのライブラリを使うケースが多くなります。MVVM構成との相性を考えるなら、データバインディングしやすいライブラリを選ぶことが重要です。

ASP.NET CoreやBlazorでは、サーバー側のC#だけで完結させるというより、JavaScriptのChart.js、ApexCharts、EChartsなどをラップしたコンポーネントや、Blazor対応のChartライブラリを利用することが多いです。LiveCharts2はWPF、WinForms、Blazor WebAssemblyなど複数のUIフレームワークに対応していることが公式サイトでも案内されています。

1-4. C# Chartを使う場面とよくある開発ニーズ

C# Chartは、以下のような開発ニーズでよく使われます。

開発ニーズ具体例
業務データの可視化売上、在庫、受注、問い合わせ件数
製造・計測データの表示温度、圧力、電流、センサー値
監視アプリCPU使用率、メモリ使用量、通信量
分析ツールCSV分析、統計処理、相関分析
レポート画面月次レポート、KPIダッシュボード
リアルタイム表示IoT、設備監視、ログ監視

単に数値を表に並べるだけでは、変化や傾向を直感的に把握しにくい場合があります。C# Chartを使うことで、ユーザーは異常値、増減傾向、比較結果、周期性などを視覚的に理解しやすくなります。

2. C#でChartを実装する前に知っておきたい基礎知識

2-1. Chartコントロール・Series・ChartAreaの役割

WinFormsのChartコントロールでは、主に次の3要素を理解することが重要です。

要素役割
Chartグラフ全体を管理するコントロール
Series実際に表示するデータ系列
ChartAreaグラフの描画領域、X軸、Y軸を管理
Legend凡例を表示
Titleグラフタイトルを表示

たとえば、1つのChartに「売上」と「利益」の2本の折れ線を表示したい場合、Seriesを2つ作成します。一方、同じ画面内で上段に売上グラフ、下段に在庫グラフを別々の軸で表示したい場合は、ChartAreaを複数作成します。

2-2. X軸・Y軸・凡例・タイトル・ラベルの基本構成

C# Chartの見やすさは、データそのものだけでなく、軸やラベルの設計にも左右されます。

X軸は、時刻、日付、月、カテゴリ名などを表すことが多く、Y軸は数値を表すことが一般的です。凡例は複数系列の意味を説明し、タイトルはグラフ全体の内容を一目で伝えます。データラベルは各点や棒の値を直接表示するために使います。

グラフを作るときは、「何を比較したいのか」「時間変化を見たいのか」「割合を見たいのか」を先に決めることが大切です。目的があいまいなままChartを作ると、装飾は多いのに読み取りにくいグラフになってしまいます。

2-3. 静的データと動的データの表示方法の違い

静的データとは、アプリ起動時やボタン押下時に一度だけ読み込んで表示するデータです。たとえば、月別売上CSVを読み込んで棒グラフにするようなケースです。

一方、動的データは、一定間隔で新しい値が追加されるデータです。たとえば、1秒ごとにCPU使用率を取得して折れ線グラフに追加するようなケースです。

静的データでは、Series.Points.Clear()で既存データを消してからまとめて追加する方法がシンプルです。動的データでは、既存のSeriesに1点ずつ追加し、古いデータを削除しながら表示範囲を保つ実装が必要になります。

2-4. .NET Frameworkと.NET 6以降での注意点

WinFormsの標準Chartコントロールは、.NET Framework時代の業務アプリではよく使われてきました。Microsoft Learnでは、ChartクラスはSystem.Windows.Forms.DataVisualization.Charting名前空間にあり、System.Windows.Forms.DataVisualization.dllに含まれるクラスとして説明されています。

一方、.NET 6以降で新規開発する場合は注意が必要です。Windows Forms自体はWindowsデスクトップアプリ向けのUIフレームワークとして提供されていますが、標準Chartコントロールに依存した実装をそのまま移行できるとは限りません。Microsoft Learnでも、Windows FormsはWindowsデスクトップアプリを構築するためのUIフレームワークとして説明されています。

そのため、.NET 6以降の新規開発では、標準Chartコントロールにこだわらず、ScottPlot、LiveCharts2、OxyPlotなどのライブラリを検討するのが現実的です。

3. WinFormsのChartコントロールでグラフを表示する基本手順

3-1. Visual StudioでChartコントロールを追加する方法

.NET FrameworkのWinFormsアプリでChartコントロールを使う基本手順は次のとおりです。

  1. Visual Studioで「Windows フォーム アプリケーション(.NET Framework)」を作成する

  2. フォームデザイナーを開く

  3. ツールボックスから「Chart」を探す

  4. フォームにドラッグ&ドロップする

  5. プロパティでNameをchart1などに設定する

  6. Form_Loadイベントなどでデータを設定する

ツールボックスにChartが表示されない場合は、参照設定や対象フレームワークを確認します。特に.NET 6以降のプロジェクトでは、標準Chartコントロールが前提通りに使えない場合があるため、プロジェクトテンプレートの種類を確認しましょう。

3-2. System.Windows.Forms.DataVisualizationの参照設定

コードでChartを扱う場合は、次の名前空間を使用します。

C#
using System.Windows.Forms.DataVisualization.Charting;

.NET FrameworkのWinFormsプロジェクトで参照が不足している場合は、参照設定からSystem.Windows.Forms.DataVisualizationを追加します。

コード上でChartSeriesChartAreaSeriesChartTypeなどが認識されない場合は、名前空間のusing漏れ、参照設定漏れ、またはプロジェクト種別の違いを確認してください。

3-3. 折れ線グラフを表示するC#サンプルコード

以下は、WinFormsのForm_Loadで折れ線グラフを表示する基本サンプルです。

C#
using System;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
chart1.Series.Clear();
chart1.ChartAreas.Clear();
chart1.Titles.Clear();

ChartArea area = new ChartArea("MainArea");
chart1.ChartAreas.Add(area);

Series series = new Series("売上");
series.ChartType = SeriesChartType.Line;
series.BorderWidth = 3;

series.Points.AddXY("1月", 120);
series.Points.AddXY("2月", 150);
series.Points.AddXY("3月", 180);
series.Points.AddXY("4月", 160);
series.Points.AddXY("5月", 210);

chart1.Series.Add(series);
chart1.Titles.Add("月別売上推移");
}
}

ポイントは、ChartAreaを追加してからSeriesを作成し、SeriesChartType.Lineを指定することです。X軸には月、Y軸には売上値を指定しています。

3-4. 棒グラフ・円グラフ・散布図の実装サンプル

棒グラフにする場合は、ChartTypeをColumnに変更します。

C#
series.ChartType = SeriesChartType.Column;

円グラフにする場合は、Pieを指定します。

C#
series.ChartType = SeriesChartType.Pie;

散布図にする場合は、Pointを指定します。

C#
series.ChartType = SeriesChartType.Point;
series.MarkerSize = 8;

Chartコントロールでは、同じSeriesに対してChartTypeを変えるだけで基本的なグラフ種類を切り替えられます。ただし、円グラフではX軸・Y軸という考え方が薄くなり、カテゴリ名と値の組み合わせを割合として見せることが中心になります。

3-5. CSVや配列データをChartに反映する方法

配列データをChartに反映する例は次のとおりです。

C#
string[] months = { "1月", "2月", "3月", "4月", "5月" };
int[] sales = { 120, 150, 180, 160, 210 };

series.Points.Clear();

for (int i = 0; i < months.Length; i++)
{
series.Points.AddXY(months[i], sales[i]);
}

CSVを読み込む場合は、1行ずつ分割してChartに追加します。

C#
foreach (string line in File.ReadLines("sales.csv"))
{
string[] columns = line.Split(',');
string month = columns[0];
double value = double.Parse(columns[1]);

series.Points.AddXY(month, value);
}

実務では、CSVのヘッダー行、空行、数値変換エラー、文字コードにも注意が必要です。安全に実装するなら、double.TryParseを使って不正な値をスキップする処理を入れましょう。

4. C# Chartのカスタマイズ方法

4-1. グラフタイトル・軸ラベル・凡例を設定する

グラフの内容を分かりやすくするには、タイトル、軸ラベル、凡例を設定します。

C#
chart1.Titles.Clear();
chart1.Titles.Add("月別売上推移");

ChartArea area = chart1.ChartAreas[0];
area.AxisX.Title = "月";
area.AxisY.Title = "売上(万円)";

chart1.Legends.Clear();
chart1.Legends.Add(new Legend("凡例"));

タイトルには「何のグラフか」、X軸には「何を並べているか」、Y軸には「単位を含む数値の意味」を書くと読みやすくなります。

4-2. 線の色・太さ・マーカー・背景を変更する

折れ線グラフでは、線の太さやマーカーを調整すると視認性が上がります。

C#
series.Color = Color.Blue;
series.BorderWidth = 3;
series.MarkerStyle = MarkerStyle.Circle;
series.MarkerSize = 8;
series.MarkerColor = Color.Red;

chart1.BackColor = Color.White;
chart1.ChartAreas[0].BackColor = Color.AliceBlue;

複数系列を表示する場合は、系列ごとに色やマーカーを変えると比較しやすくなります。ただし、色を増やしすぎると逆に読みにくくなるため、業務画面では3〜5系列程度に抑えると扱いやすいです。

4-3. X軸・Y軸の範囲や目盛りを調整する

軸の範囲や目盛りは、ChartAreaのAxisX、AxisYで設定します。

C#
ChartArea area = chart1.ChartAreas[0];

area.AxisY.Minimum = 0;
area.AxisY.Maximum = 300;
area.AxisY.Interval = 50;

area.AxisX.Interval = 1;
area.AxisX.MajorGrid.Enabled = false;

Y軸の最小値を0にするかどうかは、グラフの目的によって変わります。棒グラフでは0始まりが基本ですが、折れ線グラフで微小な変化を見たい場合は、最小値をデータ範囲に合わせることもあります。

4-4. 複数系列のデータを1つのChartに表示する

売上と利益を同じグラフに表示する例です。

C#
Series sales = new Series("売上")
{
ChartType = SeriesChartType.Line,
BorderWidth = 3
};

Series profit = new Series("利益")
{
ChartType = SeriesChartType.Line,
BorderWidth = 3
};

sales.Points.AddXY("1月", 120);
sales.Points.AddXY("2月", 150);
sales.Points.AddXY("3月", 180);

profit.Points.AddXY("1月", 30);
profit.Points.AddXY("2月", 45);
profit.Points.AddXY("3月", 60);

chart1.Series.Clear();
chart1.Series.Add(sales);
chart1.Series.Add(profit);

複数系列では、単位が同じかどうかに注意します。売上と利益は同じ金額単位なので同じY軸で比較できますが、売上金額とアクセス数のように単位が異なる場合は、別軸や別グラフに分けた方が分かりやすくなります。

4-5. ツールチップやデータラベルで見やすくする

データ点にマウスを合わせたときに値を表示したい場合は、ToolTipを設定します。

C#
series.ToolTip = "#VALX : #VALY";

グラフ上に値を直接表示したい場合は、IsValueShownAsLabelを使います。

C#
series.IsValueShownAsLabel = true;
series.LabelFormat = "0";

すべての点にラベルを表示すると混雑する場合があります。データ数が多い折れ線グラフではツールチップ、棒グラフや円グラフではデータラベル、というように使い分けるとよいでしょう。

5. リアルタイム更新・大量データ表示の実装ポイント

5-1. タイマーを使ってChartをリアルタイム更新する

WinFormsでリアルタイムChartを作る場合は、Timerを使って一定間隔でデータを追加します。

C#
private Random random = new Random();
private int time = 0;

private void timer1_Tick(object sender, EventArgs e)
{
double value = random.Next(0, 100);

Series series = chart1.Series["センサー値"];
series.Points.AddXY(time, value);

time++;
}

TimerのIntervalを1000にすれば1秒ごと、100にすれば0.1秒ごとに更新されます。ただし、更新頻度を上げすぎると描画負荷が増えるため、必要以上に短い間隔にしないことが重要です。

5-2. データ追加・削除時のSeries更新方法

リアルタイム表示では、データを追加し続けるとSeries内の点が増え続けます。そのまま放置すると、描画が重くなりメモリ使用量も増えます。

一定件数を超えたら古い点を削除します。

C#
int maxPoints = 100;

series.Points.AddXY(time, value);

if (series.Points.Count > maxPoints)
{
series.Points.RemoveAt(0);
}

chart1.ChartAreas[0].AxisX.Minimum = Math.Max(0, time - maxPoints);
chart1.ChartAreas[0].AxisX.Maximum = time;

このように表示対象を最新100件などに制限すると、リアルタイム監視画面でも動作が安定しやすくなります。

5-3. 大量データ表示で重くなる原因

C# Chartで大量データを表示すると重くなる主な原因は次のとおりです。

原因内容
点数が多すぎる数万点以上をそのまま描画している
更新頻度が高すぎる10msごとなど過剰に再描画している
ラベルが多すぎる全点に値ラベルを表示している
マーカーが多い折れ線の全点にマーカーを付けている
毎回全データを再作成しているClearして全点追加を繰り返している
UIスレッドをブロックしているデータ取得と描画を同じ処理で実行している

特にリアルタイムChartでは、「データ取得」「データ加工」「描画更新」を同じタイミングで重く実行しないように設計することが大切です。

5-4. 描画速度を改善するための実装テクニック

描画速度を改善するには、次のような方法があります。

改善策効果
表示点数を制限する描画負荷を下げる
更新間隔を広げるUIの再描画回数を減らす
マーカーを非表示にする点描画の負荷を下げる
データを間引く大量データを見やすくする
ラベルを必要最小限にする文字描画の負荷を下げる
BeginInit / EndInitを使うまとめて更新しやすくする
高性能ライブラリを使う大量データや高速描画に対応しやすい

たとえば、10万点の時系列データを画面幅1000pxに表示する場合、すべての点を描画しても見た目では判別できないことがあります。その場合は、画面幅やズーム範囲に応じてデータを間引く方が実用的です。

5-5. リアルタイム監視アプリでのChart活用例

リアルタイム監視アプリでは、C# Chartを次のように活用できます。

監視対象グラフ例
CPU使用率折れ線グラフ
メモリ使用量面グラフ
温度センサー折れ線グラフ
生産数棒グラフ
通信量複数系列の折れ線グラフ
異常発生件数時系列棒グラフ

実務では、単にグラフを表示するだけでなく、しきい値を超えたら線色を変える、アラートを表示する、ログに記録する、といった処理を組み合わせると監視ツールとして使いやすくなります。

6. C# Chartでよくあるエラーと解決方法

6-1. Chartコントロールが表示されない場合の確認点

Chartが画面に表示されない場合は、次の点を確認します。

確認項目対処
フォームに追加されているかControls.Addされているか確認
サイズが0になっていないかWidth、Height、Dockを確認
ChartAreaがあるかchart.ChartAreas.Addを確認
Seriesがあるかchart.Series.Addを確認
データ点があるかseries.Points.Countを確認
VisibleがfalseでないかVisibleプロパティを確認

コードでChartを生成する場合は、フォームに追加し忘れることがあります。

C#
Chart chart = new Chart();
chart.Dock = DockStyle.Fill;
this.Controls.Add(chart);

6-2. DataVisualizationが見つからないエラーの原因

System.Windows.Forms.DataVisualizationが見つからない場合、よくある原因は次のとおりです。

原因対処
usingが不足しているusing System.Windows.Forms.DataVisualization.Charting;を追加
参照設定が不足している参照にDataVisualizationを追加
プロジェクト種別が違う.NET Framework WinFormsか確認
.NET 6以降で標準Chart前提にしている代替ライブラリを検討

標準Chartコントロールを使う場合は、対象プロジェクトが対応しているかを先に確認しましょう。新規開発で迷う場合は、ScottPlotやLiveCharts2などのNuGetライブラリを使う方がスムーズなこともあります。

6-3. グラフにデータが反映されないときの対処法

データが反映されない場合は、次のようにSeries名やChartArea名の指定ミスを確認します。

C#
Console.WriteLine(chart1.Series.Count);
Console.WriteLine(chart1.ChartAreas.Count);
Console.WriteLine(chart1.Series[0].Points.Count);

また、データ追加後に別の処理でSeries.Clear()Points.Clear()を呼んでいないかも確認します。デザイナーで追加したSeriesとコードで追加したSeriesが混在している場合も、意図しないSeriesにデータを追加していることがあります。

6-4. 軸や凡例が意図通りに表示されない場合

軸や凡例が意図通りに表示されない場合は、次の点を確認します。

症状原因例
X軸ラベルが重なるデータ数が多い、Intervalが小さい
Y軸の範囲が合わないMinimum、Maximumの固定値が不適切
凡例が表示されないLegend未追加、Series名未設定
円グラフのラベルが出ないLabelやIsValueShownAsLabel未設定
目盛りが細かすぎるInterval未調整

X軸ラベルが多い場合は、ラベルの角度を変える方法もあります。

C#
chart1.ChartAreas[0].AxisX.LabelStyle.Angle = -45;

6-5. .NET Core・.NET 6以降でChartを使う際の代替策

.NET Core、.NET 6以降でC# Chartを実装する場合は、次のような代替策があります。

用途代替候補
WinFormsで簡単にグラフ表示ScottPlot
WPFでMVVMと組み合わせたいLiveCharts2、OxyPlot
BlazorでWebグラフ表示LiveCharts2、Chart.js系ラッパー
大量データ・高速描画ScottPlot、SciChart、LightningChart
商用業務アプリSyncfusion、SciChart、LightningChart

ScottPlotは、.NET向けの無料・オープンソースのプロットライブラリで、大規模データセットのインタラクティブ表示を簡単に行えることを公式サイトで説明しています。

7. C#で使えるおすすめChartライブラリ比較

7-1. 標準Chartコントロールの特徴と向いている用途

標準Chartコントロールは、.NET FrameworkのWinFormsアプリで手軽にグラフを表示したい場合に便利です。Visual Studioのデザイナーで配置でき、折れ線、棒、円、散布図など基本的なグラフを簡単に作成できます。

向いている用途は次のとおりです。

向いている用途理由
.NET Frameworkの既存業務アプリ既存資産と相性がよい
簡単な集計グラフ実装がシンプル
社内ツール追加ライブラリなしで使いやすい
小〜中規模データ基本機能で十分対応可能

一方で、.NET 6以降の新規開発、高度なデザイン、大量データ、高速リアルタイム表示には、専用ライブラリを検討した方がよい場合があります。

7-2. ScottPlotの特徴・メリット・実装例

ScottPlotは、C#で手軽に高性能なグラフを描画したい場合に人気のあるライブラリです。公式サイトでは、.NET向けの無料・オープンソースのプロットライブラリで、折れ線、棒、円、散布図などを数行のコードで作成できると説明されています。

ScottPlotのメリットは次のとおりです。

メリット内容
導入が簡単NuGetで追加しやすい
高速大量データの描画に向いている
WinForms/WPF対応デスクトップアプリで使いやすい
APIが分かりやすい少ないコードで描画できる
無料・OSS個人開発や社内ツールにも使いやすい

ScottPlotのイメージコードは次のようになります。

C#
double[] xs = { 1, 2, 3, 4, 5 };
double[] ys = { 10, 15, 13, 18, 20 };

formsPlot1.Plot.Add.Scatter(xs, ys);
formsPlot1.Refresh();

標準ChartよりもモダンなAPIで書きたい場合や、大量データを扱う場合に候補になります。

7-3. LiveCharts2の特徴・メリット・実装例

LiveCharts2は、アニメーションや見た目の美しさ、クロスプラットフォーム対応を重視したChartライブラリです。公式サイトでは、.NET向けのデータ可視化ライブラリで、複数のデバイスやフレームワークで動作し、MITライセンスの無料版と有料パッケージがあると説明されています。

LiveCharts2のメリットは次のとおりです。

メリット内容
見た目がきれいアニメーション表現に強い
WPFと相性がよいMVVMで使いやすい
複数UIに対応WinForms、WPF、Blazorなどに対応
コードが直感的Series定義が分かりやすい
ダッシュボード向き業務画面をリッチにしやすい

LiveCharts2のイメージコードは次のようになります。

C#
Series = new ISeries[]
{
new LineSeries<double>
{
Values = new double[] { 10, 20, 15, 30, 25 }
}
};

見た目のよいC# Chartを短時間で作りたい場合や、WPFのダッシュボード画面を作る場合に向いています。

7-4. OxyPlotの特徴・メリット・実装例

OxyPlotは、.NET向けのクロスプラットフォームなプロットライブラリです。公式サイトでは、OxyPlotは.NET向けのクロスプラットフォームプロットライブラリで、MITライセンスで提供されていると説明されています。

OxyPlotのメリットは次のとおりです。

メリット内容
軽量シンプルな構成で使いやすい
クロスプラットフォーム複数UIで利用しやすい
MITライセンス商用利用でも検討しやすい
科学技術系に向く散布図や軸制御に強い
MVVM対応しやすいPlotModelをバインドできる

OxyPlotの基本的な考え方は、PlotModelを作成し、Seriesを追加して、PlotViewにバインドすることです。GitHubの説明でも、NuGetでOxyPlotを追加し、PlotViewをUIに配置し、PlotModelを作成してModelプロパティにバインドする流れが案内されています。

C#
var model = new PlotModel { Title = "売上推移" };

var series = new LineSeries();
series.Points.Add(new DataPoint(1, 120));
series.Points.Add(new DataPoint(2, 150));
series.Points.Add(new DataPoint(3, 180));

model.Series.Add(series);
plotView1.Model = model;

7-5. SciChart・LightningChartなど商用ライブラリの選び方

SciChartやLightningChartは、高性能なリアルタイム描画や大量データ表示が必要な業務用途で検討される商用ライブラリです。SciChartは高性能データ可視化を重視したライブラリとして、科学技術、医療、モータースポーツなどの用途を公式サイトで紹介しています。

LightningChartも、高性能な.NET向けチャートライブラリとして、GPUアクセラレーションやリアルタイム大量データ表示を訴求しています。

商用ライブラリを選ぶときは、次の点を確認しましょう。

確認項目理由
ライセンス費用開発者数、配布形態で費用が変わる
対応UIWinForms、WPF、Blazorなど
リアルタイム性能更新頻度とデータ点数に直結
サポート体制業務システムでは重要
サンプルの充実度実装速度に影響
日本語情報チーム内で共有しやすい
長期メンテナンス継続利用のリスクを下げる

7-6. 無料ライブラリと有料ライブラリの比較表

ライブラリ種別主な対応向いている用途
標準Chart標準機能WinForms/.NET Framework既存業務アプリ、簡易グラフ
ScottPlot無料OSSWinForms、WPFなど高速描画、分析ツール
LiveCharts2無料+有料WPF、WinForms、Blazorなど見た目のよいダッシュボード
OxyPlot無料OSSWPF、WinFormsなど技術系グラフ、軽量表示
SciChart商用WPF、JavaScriptなど科学技術、金融、医療、高性能用途
LightningChart商用WinForms、WPF、UWPなど超高速リアルタイム、大量データ

無料ライブラリは導入しやすく、社内ツールや一般的な業務アプリに向いています。有料ライブラリは、性能、サポート、機能、保証を重視するプロジェクトで有力な選択肢になります。

8. 開発環境・用途別に選ぶC# Chartの最適解

8-1. WinFormsアプリにおすすめのChart実装方法

WinFormsでC# Chartを実装する場合、.NET Frameworkの既存アプリなら標準Chartコントロールが使いやすいです。既存画面に追加しやすく、基本的なグラフであれば十分対応できます。

一方、.NET 6以降のWinFormsや新規開発では、ScottPlotを候補にするとよいでしょう。NuGetで導入しやすく、折れ線グラフや散布図をシンプルに描画できます。大量データやズーム、パンなどの操作を考える場合も、標準Chartより扱いやすいケースがあります。

8-2. WPFアプリにおすすめのChartライブラリ

WPFでは、LiveCharts2、OxyPlot、ScottPlotが候補になります。

用途おすすめ
見た目重視のダッシュボードLiveCharts2
科学技術系・軽量表示OxyPlot
大量データ・シンプル実装ScottPlot
高性能リアルタイムSciChart、LightningChart

WPFではMVVM設計を採用することが多いため、ViewModelからデータをバインドしやすいかどうかも重要です。見た目だけでなく、保守性やテストしやすさも含めて選びましょう。

8-3. Blazor・ASP.NET Coreでグラフ表示する方法

BlazorやASP.NET Coreでは、Webブラウザ上で描画するため、デスクトップ向けChartとは考え方が変わります。選択肢としては、LiveCharts2のBlazor対応、Chart.js系ラッパー、ApexCharts系コンポーネント、Syncfusionなどの商用UIコンポーネントがあります。

Webアプリでは、サーバーから取得したデータをJSONとしてブラウザに渡し、JavaScriptやWebAssembly側で描画する構成が一般的です。リアルタイム更新を行う場合は、SignalRと組み合わせて、サーバーからクライアントへデータをプッシュする設計も検討できます。

8-4. デスクトップアプリとWebアプリで選び方が変わる理由

デスクトップアプリとWebアプリでは、Chartライブラリの選び方が変わります。

デスクトップアプリでは、ローカルPCの性能を活用しやすく、センサー値やローカルファイルを直接扱いやすいです。そのため、WinFormsやWPF向けのChartライブラリが適しています。

Webアプリでは、ブラウザで描画するため、レスポンシブ対応、スマートフォン対応、サーバー負荷、通信量、認証、同時接続数などを考える必要があります。見た目の美しさやインタラクションも重要になるため、Web向けChartライブラリとの連携が現実的です。

8-5. 初心者・業務アプリ・高性能リアルタイム用途別の選定基準

用途選定基準おすすめ
初心者の学習情報量、実装の簡単さWinForms標準Chart、ScottPlot
社内業務アプリ保守性、導入しやすさ標準Chart、ScottPlot、LiveCharts2
WPFダッシュボード見た目、MVVM対応LiveCharts2、OxyPlot
技術計算・分析軸制御、散布図、軽量性OxyPlot、ScottPlot
リアルタイム監視描画速度、安定性ScottPlot、SciChart、LightningChart
商用製品サポート、ライセンスSciChart、LightningChart、Syncfusion

C# Chartの選定では、「無料か有料か」だけで判断しないことが大切です。データ量、更新頻度、対象UI、チームの経験、ライセンス、将来の保守まで含めて選びましょう。

9. C# Chart実装サンプル集

9-1. 折れ線グラフのサンプルコード

C#
chart1.Series.Clear();
chart1.ChartAreas.Clear();

chart1.ChartAreas.Add(new ChartArea("Main"));

Series series = new Series("売上")
{
ChartType = SeriesChartType.Line,
BorderWidth = 3
};

series.Points.AddXY("1月", 120);
series.Points.AddXY("2月", 150);
series.Points.AddXY("3月", 180);
series.Points.AddXY("4月", 160);

chart1.Series.Add(series);
chart1.Titles.Add("折れ線グラフサンプル");

折れ線グラフは、時系列データや連続的な変化を表示するのに適しています。売上推移、温度変化、アクセス数、在庫数などに使いやすいグラフです。

9-2. 棒グラフのサンプルコード

C#
chart1.Series.Clear();
chart1.ChartAreas.Clear();

chart1.ChartAreas.Add(new ChartArea("Main"));

Series series = new Series("件数")
{
ChartType = SeriesChartType.Column
};

series.Points.AddXY("A商品", 30);
series.Points.AddXY("B商品", 45);
series.Points.AddXY("C商品", 20);
series.Points.AddXY("D商品", 60);

chart1.Series.Add(series);
chart1.Titles.Add("商品別販売件数");

棒グラフは、カテゴリごとの値を比較するのに向いています。商品別、部署別、地域別、月別など、カテゴリ単位で差を見たいときに使います。

9-3. 円グラフのサンプルコード

C#
chart1.Series.Clear();
chart1.ChartAreas.Clear();

chart1.ChartAreas.Add(new ChartArea("Main"));

Series series = new Series("構成比")
{
ChartType = SeriesChartType.Pie,
IsValueShownAsLabel = true,
Label = "#VALX: #PERCENT{P1}"
};

series.Points.AddXY("A商品", 40);
series.Points.AddXY("B商品", 30);
series.Points.AddXY("C商品", 20);
series.Points.AddXY("D商品", 10);

chart1.Series.Add(series);
chart1.Titles.Add("売上構成比");

円グラフは、全体に対する割合を見せるときに便利です。ただし、項目数が多いと読みにくくなるため、5項目程度までに抑えると見やすくなります。

9-4. 散布図のサンプルコード

C#
chart1.Series.Clear();
chart1.ChartAreas.Clear();

chart1.ChartAreas.Add(new ChartArea("Main"));

Series series = new Series("測定値")
{
ChartType = SeriesChartType.Point,
MarkerStyle = MarkerStyle.Circle,
MarkerSize = 8
};

series.Points.AddXY(10, 20);
series.Points.AddXY(15, 25);
series.Points.AddXY(20, 28);
series.Points.AddXY(25, 40);
series.Points.AddXY(30, 42);

chart1.Series.Add(series);

chart1.ChartAreas[0].AxisX.Title = "入力値";
chart1.ChartAreas[0].AxisY.Title = "出力値";
chart1.Titles.Add("散布図サンプル");

散布図は、2つの数値の関係を見るときに使います。相関分析、実験データ、品質管理、機械学習前のデータ確認などで役立ちます。

9-5. 複数系列グラフのサンプルコード

C#
chart1.Series.Clear();
chart1.ChartAreas.Clear();

chart1.ChartAreas.Add(new ChartArea("Main"));

Series sales = new Series("売上")
{
ChartType = SeriesChartType.Line,
BorderWidth = 3
};

Series cost = new Series("費用")
{
ChartType = SeriesChartType.Line,
BorderWidth = 3
};

string[] months = { "1月", "2月", "3月", "4月" };
int[] salesValues = { 120, 150, 180, 200 };
int[] costValues = { 80, 90, 100, 110 };

for (int i = 0; i < months.Length; i++)
{
sales.Points.AddXY(months[i], salesValues[i]);
cost.Points.AddXY(months[i], costValues[i]);
}

chart1.Series.Add(sales);
chart1.Series.Add(cost);
chart1.Titles.Add("売上と費用の推移");

複数系列グラフでは、凡例を必ず表示し、系列名を分かりやすく設定します。同じグラフに載せる系列は、できるだけ同じ単位のデータにそろえましょう。

9-6. リアルタイム更新グラフのサンプルコード

C#
private int x = 0;
private Random random = new Random();

private void Form1_Load(object sender, EventArgs e)
{
chart1.Series.Clear();
chart1.ChartAreas.Clear();

chart1.ChartAreas.Add(new ChartArea("Main"));

Series series = new Series("リアルタイム値")
{
ChartType = SeriesChartType.Line,
BorderWidth = 2
};

chart1.Series.Add(series);

timer1.Interval = 1000;
timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
Series series = chart1.Series["リアルタイム値"];

double value = random.Next(0, 100);
series.Points.AddXY(x, value);

if (series.Points.Count > 50)
{
series.Points.RemoveAt(0);
}

chart1.ChartAreas[0].AxisX.Minimum = Math.Max(0, x - 50);
chart1.ChartAreas[0].AxisX.Maximum = x;

x++;
}

このサンプルでは、1秒ごとにランダム値を追加し、最新50点だけを表示します。実務では、ランダム値の代わりにセンサー値、APIレスポンス、ログ件数、CPU使用率などを入れることで、リアルタイム監視グラフを作成できます。

10. C# Chartを実務で使うときのベストプラクティス

10-1. 見やすいグラフを作るための設計ポイント

見やすいC# Chartを作るには、次のポイントを意識します。

ポイント内容
グラフの目的を明確にする比較、推移、割合、分布を区別する
単位を表示するY軸タイトルに「円」「件」「%」などを書く
色を使いすぎない重要な系列だけ強調する
ラベルを詰め込みすぎない必要に応じてツールチップを使う
凡例名を分かりやすくするSeries1のような名前を避ける
0始まりにするか検討する棒グラフは原則0始まり
データ数に応じて表示方法を変える大量データは間引きやズームを使う

グラフは装飾を増やすほど分かりやすくなるわけではありません。実務では、「ユーザーが何を判断するためのグラフか」を基準に設計することが重要です。

10-2. 保守しやすいChartコードの書き方

Chartの設定コードをForm_Loadにすべて書くと、処理が長くなり保守しにくくなります。初期化、データ設定、見た目の設定をメソッドに分けましょう。

C#
private void InitializeChart()
{
chart1.Series.Clear();
chart1.ChartAreas.Clear();
chart1.ChartAreas.Add(new ChartArea("Main"));
}

private void SetChartStyle()
{
chart1.ChartAreas[0].AxisX.Title = "月";
chart1.ChartAreas[0].AxisY.Title = "売上";
chart1.Titles.Add("月別売上");
}

private void LoadChartData()
{
Series series = new Series("売上")
{
ChartType = SeriesChartType.Line
};

series.Points.AddXY("1月", 120);
series.Points.AddXY("2月", 150);

chart1.Series.Add(series);
}

このように責務を分けると、グラフ種類を変更したり、データ取得元をCSVからデータベースに変えたりするときも修正しやすくなります。

10-3. データ取得処理と描画処理を分離する

実務では、データ取得処理とChart描画処理を分離することが大切です。

悪い例は、Chart更新メソッドの中で直接SQLを実行し、その場でSeriesに追加するような実装です。この場合、データ取得、変換、描画が密結合になり、テストや修正が難しくなります。

よい設計では、まずデータ取得メソッドで表示用データを作成し、Chart描画メソッドにはそのデータだけを渡します。

C#
public class SalesData
{
public string Month { get; set; }
public double Value { get; set; }
}

private void DrawSalesChart(List<SalesData> data)
{
chart1.Series.Clear();

Series series = new Series("売上")
{
ChartType = SeriesChartType.Column
};

foreach (var item in data)
{
series.Points.AddXY(item.Month, item.Value);
}

chart1.Series.Add(series);
}

このようにすると、CSV、データベース、APIのどこから取得したデータでも、同じ描画処理を使い回せます。

10-4. ライブラリ選定時に確認すべきライセンスと更新状況

C# Chartライブラリを実務で使う場合、ライセンス確認は必須です。無料ライブラリでも、MIT、Apache、GPLなどライセンスによって利用条件が異なります。

ScottPlotは無料・オープンソースの.NET向けライブラリとして提供されており、OxyPlotも公式サイトでMITライセンスと説明されています。

確認すべき項目は次のとおりです。

確認項目理由
商用利用できるか業務アプリや製品で重要
配布条件は何か顧客環境へ配布する場合に必要
更新が続いているか長期保守に影響
対応.NETバージョン.NET Frameworkか.NET 6以降か
サポート体制障害時の対応に影響
サンプルの豊富さ開発効率に影響
パフォーマンス大量データやリアルタイム表示で重要

ライブラリの見た目や機能だけで決めず、プロジェクトの寿命や保守体制まで含めて選定しましょう。

10-5. C# Chart学習の次に取り組むべきこと

C# Chartの基本を学んだら、次は次のテーマに進むと実務力が上がります。

次に学ぶテーマ内容
CSV読み込み外部データをグラフ化する
データベース連携SQL ServerやSQLiteのデータを表示
非同期処理UIを止めずにデータ取得する
MVVMWPFで保守しやすくする
リアルタイム通信SignalRやソケットで更新する
レポート出力画像保存、PDF出力、印刷
統計処理平均、分散、移動平均、回帰直線
ダッシュボード設計複数グラフを組み合わせる

特に業務アプリでは、グラフ単体の実装だけでなく、「データをどこから取得し、どう加工し、どのタイミングで更新し、どう見せるか」まで設計できることが重要です。

まとめ

C# Chartは、C#アプリケーションでデータを視覚的に表示するための重要な技術です。WinFormsの標準Chartコントロールを使えば、折れ線グラフ、棒グラフ、円グラフ、散布図などを比較的簡単に実装できます。Chart、Series、ChartArea、Axis、Legend、Titleの役割を理解すれば、基本的なグラフ表示はスムーズに作成できます。

一方で、.NET 6以降の新規開発、WPF、Blazor、大量データ、リアルタイム更新、高度なデザインが必要な場合は、標準Chartだけでなく、ScottPlot、LiveCharts2、OxyPlot、SciChart、LightningChartなどのライブラリを比較して選ぶことが大切です。

初心者はまずWinFormsの標準ChartやScottPlotで、折れ線グラフ、棒グラフ、円グラフ、散布図を作ってみるのがおすすめです。その後、CSV読み込み、複数系列、リアルタイム更新、データベース連携へ進むと、実務で使えるC# Chartのスキルが身につきます。

C# Chartをうまく活用すれば、単なる数値データを、ユーザーが直感的に理解できる情報へ変換できます。見やすく、保守しやすく、目的に合ったグラフを設計することが、C#によるデータ可視化の第一歩です。