Articles

gnuplotでレポートのグラフを作成する

Jun 07, 2024
ekken_gnuplot

はじめに

電気通信大学のB1には、「基礎科学実験A」というエクストリームスポーツ科目があり、実験のレポートをPDFで提出する必要があります。もちろん必修。

ちなみに、電通大で「謁見」というとこれのことを指します。

レポートはWord等のオフィスソフトで作成してもいいのですが、書体(立体で書くべきところと斜体で書くべきところがある)やレポートに添付する図や表のキャプションを付ける位置など、さまざまな「おさほう」に対応するのが面倒なので、代わりにLaTeX\LaTeXという組版ソフトを使用すると、そこらへんをよしなにやってくれるので、電通大にはLaTeX\LaTeXでレポートを書いている人がたくさんいます。

LaTeX\LaTeXを使うだけで綺麗なレポートが作れるので、これから謁見をやる人はぜひ使ってほしいです。

さて、この記事では、あえてLaTeX\LaTeXの導入方法などは書きません。なぜなら、他の電通大のすごい先輩たちが詳しく書いてくれているからです。

↓ おすすめはこのへんの記事です。

電通大生のためのいちばんかんたんなLaTeX環境構築2024
電通大生のためのいちばんかんたんなLaTeX環境構築2024 favicon zenn.dev
電通大生のためのいちばんかんたんなLaTeX環境構築2024

僕の記事では、謁見のレポートを書くうえで必要になるグラフを、いい感じに作成する方法を紹介します。

なお、グラフの作成の仕方はいくつもあるので、選択肢の一つとして見てもらえるとうれしいです。

↓ 他の方法の一つとしてPythonを使う方法を友達が書いているので、よかったらそっちも見てみてください。

謁見レポート用グラフをPythonで描く|JS2FZH
電通大一年にある大敵、基礎科学実験A、通称謁見のレポートを書くにあたって、グラフを載せることがあります。 そのグラフは、LMS上で様式の指定があり、その通りに描く必要があります。 グラフというとExcelを最初に思い浮かべると思います。 私も最初は、Excelで簡単に作れるだろうと思っていましたが、実際に作りかけると、どうも思うような設定項目が見つからず、早々に諦めました。 というのも、Pythonのmatplotlibというモジュールでグラフが描けるということを知っていたからです。 実際に作って上手くいったので、備忘録もかねて、記しておきます。 これができると、グラフ作成の手間がだい
謁見レポート用グラフをPythonで描く|JS2FZH favicon note.com
謁見レポート用グラフをPythonで描く|JS2FZH

gnuplotとは

タイトルにもあるように、この記事ではgnuplotなるものを使用してグラフを作成する方法を紹介します。

gnuplotは、グラフ作成に特化したソフトウェアで、オープンソースかつ無料です。オ-プンソ-スサイコウ!!!!!

gnuplot homepage
gnuplot homepage favicon www.gnuplot.info

ちなみに読み方は「ニュープロット」だそうです。

Excelなどでグラフを作るのと違い、テキストでグラフの仕様を入力するとグラフを出力してくれます。

これを使うと何が嬉しい、後述する方法で書くとグラフをTeX\TeX形式で出力してくれて、そのままLaTeX\LaTeXに埋め込むことができるんですよ!最高!!

グラフの軸ラベルや凡例がそのままテキストとしてレポートに埋め込まれるので、フォントを本文と統一することができます

gnuplotのインストール

さっそくgnuplotをインストールしましょう。

WindowsとMacOSでの場合を書きます。Linuxを使っているような人は自力で調べられそうなので割愛します。

Windowsの人

Source ForgeからDLするのがいいようです。

gnuplot - Browse /gnuplot at SourceForge.net
A portable, multi-platform, command-line driven graphing utility
gnuplot -  Browse /gnuplot at SourceForge.net favicon sourceforge.net

「Download Latest Version」という緑の大きなボタンをクリックするとダウンロードできます。

ダウンロードした.exeファイルを実行するとインストールできます。 基本的に次へを連打でいいですが、以下に示す2箇所だけ変更してください。

windows gnuplot inst1 ✅ 日本語対応

windows gnuplot inst2 ✅ PATHを追加

インストールできたら、Terminalを開いて、gnuplot --versionというコマンドを実行して、インストールされていることを確認してください。(VSCode内のターミナルでもいいです。)

自分の環境では、gnuplot 6.0 patchlevel 1になってました。

MacOSの人

Homebrew経由でインストールするといいです。

Homebrewをまだ入れてない場合は、以下のサイトを見て書いてあるとおりにインストールしてください。

Homebrew
The Missing Package Manager for macOS (or Linux).
Homebrew favicon brew.sh
Homebrew

インストールのコマンドを実行すると、最後に「このコマンドを実行しろよ〜」みたいな指示があると思うので、それも実行してください。

Homebrewが入ったら、次にgnuplotをインストールします。

brew install gnuplot

上記のコマンドでインストールできます。

インストールできたら、Terminalを開いて、gnuplot --versionというコマンドを実行して、インストールされていることを確認してください。(VSCode内のターミナルでもいいです。)

自分の環境では、gnuplot 6.0 patchlevel 1になってました。

グラフ作成

さて、いよいよグラフを作っていきます。

先に完成形を見せます。

gnuplot graph

適当にフックの法則っぽい感じのグラフを作ってみました。

データのプロットと、最小二乗法でフィッティングした直線を描画しました。

これを目指します。

データの作成

データは後述するcsvという形式で直接作ってもいいですが、平均値の計算とかが楽なので、ExcelやGoogleスプレッドシートなどの表計算ソフトを使うのがいいと思います。

spreadsheet table

このように、数値だけを入れた表を作ります。

あとでデータを使用する際に、「1列目をxx座標、2列目をyy座標」というように指定するので、データは縦に並ぶようにしてください。

データができたら、csv形式でエクスポートします。

spreadsheet export

csv形式とは、カンマ区切りでデータを記述した形式で、上のデータだと中身は以下のようになっています。

20,21.4,40.2
25,25.2,51.3
30,29.8,62.8
35,35.4,69.2
40,41.0,80.4
45,45.3,93.7
50,49.4,100.5

簡単な形式なので直接csvで作ってもいいですが、前述したとおり平均値の計算とかが楽になるので表計算ソフトを使うことをおすすめします。

レポートのTeX\TeXファイルと同じディレクトリ(以下、作業ディレクトリと表記します)に、DLしたcsvファイルをdata.csvという名前で保存しておいてください。

gnuplotのスクリプトを作成

次に、gnuplotに渡すグラフの仕様を書きます。

作業ディレクトリに以下の内容で、graph.pltというファイルを作成してください。

set terminal tikz createstyle
set mono
set nokey
set grid
set datafile separator ","
set output "graph.tex"

set xlabel "ばねの伸び $x / \\si{mm}$"
set ylabel "弾性力 $F / \\si{N}$"

f(x)=a*x+b
fit f(x) "data.csv" using 1:2 via a, b
g(x)=c*x+d
fit g(x) "data.csv" using 1:3 via c, d

plot [0:60] [0:120] "data.csv" using 1:2 pt 1, "data.csv" using 1:3 pt 2, f(x), g(x)

細かく区切って解説します。

set terminal tikz createstyle
set mono
set nokey
set grid
set datafile separator ","
set output "graph.tex"

この部分は、gnuplotの設定を書いています。 上から、「tikzというterminal(ライブラリのようなもの)を使用する」、「モノクロで出力」、「凡例を非表示」、「グリッド線を表示」、「データの区切りをカンマに設定(csvなので)」、「graph.texというファイル名で出力」です。

set xlabel "ばねの伸び $x / \\si{mm}$"
set ylabel "弾性力 $F / \\si{N}$"

この部分で軸ラベルを指定しています。

LaTeX\LaTeXと同じように書けますが、\(バックスラッシュ)は2個ずつ入れるようにしてください。(gnuplotには文字列として渡し、LaTeX\LaTeXにはコマンドとして扱わせるためです。)

ちなみに、\si{mm}\si{N}書いているのは、LaTeX\LaTeX側でsiunitxというパッケージを入れて、単位を正しく立体で表示するようにしているためです。

f(x)=a*x+b
fit f(x) "data.csv" using 1:2 via a, b
g(x)=c*x+d
fit g(x) "data.csv" using 1:3 via c, d

ここでは、フィッティングの設定を書いています。

このグラフはフックの法則を表わしていて、もとの公式は以下の式(1)で表されます。

F=kx\begin{equation} F = kx \end{equation}

一次関数なので、実験値をf(x)=ax+bf(x) = ax + b の形にフィッティングすることができると考えられます。

今回kkの値が異なる2種類のばねで測定したという体でグラフを作っているので、フィッティングする関数を2つ(f(x)f(x)g(x)g(x))定義しておきます。

fit~の行は、data.csvの何列目からデータを取得するかを書いています。

まあ正直見たまんまです。説明が極上ですね。

plot [0:60] [0:120] "data.csv" using 1:2 pt 1, "data.csv" using 1:3 pt 2, f(x), g(x)

この行で、実際に描画しています。

[0:60] [0:120]というのは、xxyyそれぞれの軸の範囲を指定しています。

その後の部分では、カンマ区切りで4種類のグラフを指定しています。

前半の二つが点をプロットする指示ですが、「どのファイルのどの部分のデータを使うか」と、pt(point type)で点の種類を指定しています。

後半の二つはさっきフィッティングした直線を描画する指示です。

LaTeXに埋め込む

さいごに、レポートのLaTeX\LaTeXのファイルにグラフを埋め込みます。

前述のgraph.pltから、グラフのデータをTeX\TeX形式で出力します。

gnuplot graph.plt

上のコマンドで出力できます。 いくつかファイルが生成されますが、必要なものなので消さないでください。

コマンド実行時に色々表示されますが、そのときにフィッティングした関数の係数が表示されるので、レポートで「最小二乗法により〜」というのが書けるので便利です。(伝われ)

次に、レポートのLaTeX\LaTeXのファイルに必要なパッケージを記述します。

\usepackage[dvipdfmx]{graphicx}
\usepackage{here}
\usepackage{siunitx}
\usepackage{tikz}
\usepackage{gnuplot-lua-tikz}

これを\begin{document}の前あたりに追加してください。

既に\usepackageの記述がある場合はその末尾に追記するといいです。

そして、グラフを挿入したい位置に以下のように書きます。

\begin{figure}[H]
  \begin{center}
    \input{graph.tex}
    \caption{ばねの伸びと弾性力の関係}
    \label{graph}
  \end{center}
\end{figure}

これでレポートをビルドすると、グラフが入っているはずです!!

おわりに

お疲れさまでした。

今回紹介したgnuplotはこういう分野でよく使われているので、ネット上にもたくさん情報が転がっています。

多種多様なグラフが書けるので、色々試してみてください。

わからないことがあったら相談乗るので、気軽にDM等ください。

では、よい謁見ライフを!!