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コントロールを使う基本手順は次のとおりです。
Visual Studioで「Windows フォーム アプリケーション(.NET Framework)」を作成する
フォームデザイナーを開く
ツールボックスから「Chart」を探す
フォームにドラッグ&ドロップする
プロパティでNameを
chart1などに設定する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を追加します。
コード上でChart、Series、ChartArea、SeriesChartTypeなどが認識されない場合は、名前空間の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アクセラレーションやリアルタイム大量データ表示を訴求しています。
商用ライブラリを選ぶときは、次の点を確認しましょう。
| 確認項目 | 理由 |
|---|---|
| ライセンス費用 | 開発者数、配布形態で費用が変わる |
| 対応UI | WinForms、WPF、Blazorなど |
| リアルタイム性能 | 更新頻度とデータ点数に直結 |
| サポート体制 | 業務システムでは重要 |
| サンプルの充実度 | 実装速度に影響 |
| 日本語情報 | チーム内で共有しやすい |
| 長期メンテナンス | 継続利用のリスクを下げる |
7-6. 無料ライブラリと有料ライブラリの比較表
| ライブラリ | 種別 | 主な対応 | 向いている用途 |
|---|---|---|---|
| 標準Chart | 標準機能 | WinForms/.NET Framework | 既存業務アプリ、簡易グラフ |
| ScottPlot | 無料OSS | WinForms、WPFなど | 高速描画、分析ツール |
| LiveCharts2 | 無料+有料 | WPF、WinForms、Blazorなど | 見た目のよいダッシュボード |
| OxyPlot | 無料OSS | WPF、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を止めずにデータ取得する |
| MVVM | WPFで保守しやすくする |
| リアルタイム通信 | 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#によるデータ可視化の第一歩です。

