C++を用いて数値計算やデータ解析を行う際、計算結果を視覚的に確認するための「グラフ描画」は欠かせない工程です。
PythonであればMatplotlibなどが有名ですが、C++においてどのようにグラフを出力すべきか迷う開発者は少なくありません。
特にPythonのMatplotlibをC++から操作できる「matplotlib-cpp」は、使い勝手の良さから多くのエンジニアに支持されています。
この記事では、matplotlib-cppを中心に、C++でグラフを描画するための主要なアプローチを整理し、初心者でも導入しやすいライブラリの使い方をサンプルコードと共に詳しく紹介します。
![]() 執筆者:マヒロ |
|
C++でグラフを描画するための主要なアプローチ
C++でデータを可視化する場合、大きく分けて3つの手法が存在します。
開発環境やプロジェクトの規模、必要な描画速度に応じて適切な方法を選択することが重要と言えるでしょう。
Pythonの表現力を活用するmatplotlib-cpp
Pythonで最も普及しているグラフ描画ライブラリ「Matplotlib」をC++から直接呼び出す手法です。
Python風の簡潔な記述で高度なグラフを作成できるため、解析業務などで非常に高い人気を誇ります。
C++専用プロットライブラリ(SciPlotやmatplot++)
近年はC++専用のモダンなグラフ描画ライブラリが増えています。
例えば「SciPlot」や「matplot++」などは、C++の構文を活かして直感的にグラフを作成できるよう設計されています。
これらは外部ツールとしてのgnuplotをバックエンドに利用することが一般的です。
GUIフレームワークの描画機能
アプリケーションのUIの一部としてグラフを表示したい場合は、Qt(QtCharts)やImGui(ImPlot)といったGUIフレームワークの機能を利用します。
これらはリアルタイム性が高く、ユーザーが操作可能なインタラクティブなグラフを構築するのに適しています。
【本命】matplotlib-cppによる直感的なグラフ描画
matplotlib-cppは、C++からPythonのMatplotlibを呼び出すためのヘッダーオンリーライブラリです。
Pythonのインストールが必要ですが、その分非常に強力な表現力を持っています。
matplotlib-cppの実装例
以下のコードは、C++のベクトルデータを用いて、複数の関数を一つのグラフにプロットするサンプルです。
#include <vector>
#include <cmath>
#include "matplotlibcpp.h"
namespace plt = matplotlibcpp;
int main() {
// データの準備
int n = 5000;
std::vector<double> x(n), y(n), z(n), w(n, 2);
for(int i=0; i<n; ++i) {
x.at(i) = i*i;
y.at(i) = sin(2*M_PI*i/360.0);
z.at(i) = log(i);
}
// プロットの実行
plt::figure_size(1200, 780);
plt::plot(x, y);
plt::plot(x, w, "r--"); // 赤色の破線
// タイトルやラベルの設定
plt::title("Sample Plot with matplotlib-cpp");
plt::xlabel("x axis");
plt::ylabel("y axis");
// 凡例の表示
plt::legend();
// 画像として保存
plt::save("matplotlib_cpp_output.png");
// グラフを表示
plt::show();
return 0;
}
ソースコードの解説
まず、ヘッダーファイル matplotlibcpp.h をインクルードし、使いやすいように plt というエイリアスを設定しています。
このライブラリの最大の特徴は、plt::plot(x, y) のように、std::vectorを直接引数に渡せる点にあります。
PythonのMatplotlibとほぼ同等のAPIが提供されているため、ドキュメントが豊富なことも大きなメリットです。
注意点として、コンパイル時にはPythonの開発用ヘッダーやライブラリをリンクする必要があります。
CMakeを利用する場合は find_package(Python3 COMPONENTS Development) などを適切に設定してください。
一度環境を整えてしまえば、C++とは思えないほど柔軟な描画体験が得られるはずです。
【モダン】SciPlotによる型安全なグラフ作成
Python環境に依存したくない場合や、よりC++らしいオブジェクト指向的な記述を好む方には「SciPlot」が推奨されます。
C++17以降の環境を要求しますが、モダンな設計思想で開発されています。
SciPlotを用いた実装例
SciPlotを利用すると、以下のようにメソッドを繋げて記述することが可能になります。
#include <sciplot/sciplot.hpp>
using namespace sciplot;
int main() {
// データの作成
Vec x = linspace(0.0, 10.0, 100);
Vec y = sin(x);
// プロットオブジェクトの作成
Plot2D plot;
plot.xlabel("Time [s]");
plot.ylabel("Amplitude");
// 曲線を描画し、装飾をチェーンメソッドで指定
plot.drawCurve(x, y).label("Sine Wave").lineColor("red").lineWidth(2);
// 凡例を右上に配置
plot.legend().atTopRight();
// 図(Figure)とキャンバスの作成
Figure fig = {{plot}};
Canvas canvas = {{fig}};
// 画像保存とプレビュー表示
canvas.save("sciplot_output.png");
canvas.show();
return 0;
}
ソースコードの解説
SciPlotは「流れるようなインターフェース」を採用しており、コードの可読性が非常に高いのが特徴です。
内部的にはgnuplotをバックエンドとして利用していますが、開発者はgnuplotのコマンドを意識することなくコーディングを進められます。
また、MITライセンスで提供されているため、商用プロジェクトでも採用しやすいという利点があります。
外部ツール連携とGUI向けライブラリ
目的に応じて、さらに特化したアプローチが必要になることもあります。
ここでは、古典的な手法とリッチなUI向けの選択肢を紹介します。
gnuplotとのパイプ連携
最も依存関係が少ない手法が、C++からパイプを開き、gnuplotプロセスに直接コマンドを送り込む方法です。
Windows環境では _popen / _pclose を、Linux/macOSでは popen / pclose を使用してプロセスを制御します。
ライブラリの導入が制限されている環境や、非常にシンプルなプロットをサッと行いたい場合に適しています。
高機能なGUIグラフ:QtChartsとImPlot
デスクトップアプリケーションの開発において、グラフにズームやマウスホバーによる詳細表示を組み込みたいなら、QtChartsが第一選択となります。
一方で、数値シミュレーションのデバッグなどで、毎秒数十フレームの更新頻度を求めるなら、ImGui用のアドオンであるImPlotが最適です。
ImPlotは数百万ポイントのデータでも軽快に動作するため、信号処理などのリアルタイム可視化で威力を発揮します。
C++のスキルを活かして年収を上げる方法
以上、C++でmatplotlib-cppなどを使ってグラフを描画する方法について解説してきました。
なお、C++のスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。
C++を扱えるエンジニアは希少価値が高いため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。
なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。
併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなC++の案件を探しやすくなります。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。



