gnuplotによるグラフの作成

in [TeXの部屋]

gnuplotを利用したグラフの作成手順を取りまとめました。

gnuplotを利用してグラフの作成ロードを駆け抜けよう!

(注) MathJaxを使用しているので、 スマホでは表示に時間がかかることがあります。
モバイル利用(Android)でのメニュー選択は、 SiteMapを利用するか、 「長押し」から「新しいタブを開く」を選択してください。
■ 「gnuplot」によるグラフの作成  [Map]


[御案内] TeXを利用した数学プリントの作成では, 関数のグラフをどのように作成するかは大きな問題です. ここでは,フリーのグラフ描画ソフト「gnuplot」を用いた グラフの描画方法とTeXへの取り入れ方について解説します.gnuplotは, 数式処理ソフトMaximaにも組み込まれているソフトです. 離散的な実験データのグラフ化や2変数関数のグラフも描画することができ, 理工系の研究論文の図の作成にも利用されています. C言語で作成された関数ライブラリーを利用することもできます.
 なお,関数のグラフ描画ソフトとしては,gnuplotの他に下記のようなソフトもあります.
WinTpic Ngraph GRAPES FunctionView GeoGebra Cinderella

★gnuplotを利用しなくても、TeXの中でMetaPostを利用して 立体図形や曲面描画を可能にする「MePoTeX」というマクロパッケージがあります。 その解説ページを作成したので参照してください。 たとえば、 下記のような図をTeXのソースコードの中に簡単に記述でき、 パラパラ漫画まで作成することができます[概要]。最後のグラフは、球面調和関数のグラフです[概要]。

★このページには数学絡みで訪れる方が多いと思われますが、

  • 世の中の多くの事象は「正規分布」ではなく 「ベキ分布」に支配されているようです。
  • ベキ分布:リンク集」も参照してください。


[お知らせ] 下記を出版しました。 PCやスマホで使える数式処理ソフト Maximaの解説書です。 計算問題やグラフ問題の解答を作るときに非常に重宝します。 フリーソフトなので一度試してみてください。
 なお、Maximaでのグラフ描画ではgnuplotが利用されています。 PC版Maximaでグラフを描いてeps保存すれば、 数学のプリント作成の際にも利用することができます。
いつでも・どこでも・スマホで数学!
試し読み 森北出版 amazon 楽天 honto 7net 紀伊國屋電子版読書メーター

■C言語の利用

はじめに
通常使用の場合はgnuplotに登録されている関数で十分と思いますが, いろいろと複雑な現象を解析しようとすると特殊関数や 高度の数学的な操作が必要になってくるかもしれません. そのような場合に,C言語で作成された関数をgnuplotの関数として 取り入れることができます.そのような関数ライブラリーとして, 「GNU科学技術計算ライブラリ(GNU Science Library)」があります. GSLと略記されるようです. 何ができるかは,下記マニュアルの目次を見てみるとよいでしょう. 多様な特殊関数のみならず,線形代数,高速フーリエ変換,数値積分, 各種の乱数や確率分布など, 数学のあらゆる分野にわたる膨大な関数が登録されています.

GNU科学技術計算ライブラリ,リファレンス・マニュアル (578頁)

このライブラリーを利用するには,C言語で記述されたソースファイルをコンパイルして,gnuplotで利用できるような形の実行ファイル(dll)を生成する必要があります. gnuplotで利用するにはコマンド「import」を使用します. このコマンドは,gnuplotの ver5.0 以上で取り入れられたコマンドです. 現時点(2020.02.15現在)では ver5.5 がリリースされています.

つまり,GSLに登録されている関数を使用するには,以下のことが必要になります.

  1. gnuplotのバージョンを 5.0 以上にアップデートする.
  2. C言語のコンパイラーをインストールする.
  3. GSLのソースファイルを入手する.
  4. GSLの関数をgnuplotで利用できるようなCプログラムを作成する.
  5. そのプログラムをコンパイルして dllファイルを生成する.
  6. 生成したドリルファイルを「import」することで gnuplot で利用可能になる.
何だか大変そうにみえるのですが, 下記のサイトで上記の手順(2〜6)が懇切丁寧に解説されています.

▲戻る(トップメニューマップ)

幾つかの留意事項
上記サイトに書かれている通りに実行したところ,そのサイトで例示されている \(\small n\) 次の第1種ベッセル関数 \(\small J_n(x)\) のグラフを, \(\small 0\leq n\leq 5\) についてgnuplotで描画させることができました. なお,gnuplotの上部メニューで [関数(N)]>[特殊関数] の箇所にもベッセル関数が ありますが,そこにあるのは \(\small J_0(x), J_1(x)\) と, 第2種ベッセル関数 \(\small Y_n(x)\) の \(\small n=0, 1\) だけです.

以下に,この図を得る作業の中での幾つかの留意点を記しておきます.
  • インストールするCコンパイラーは「MinGW」で, フリーで提供されているGNUのCコンパイラーである「GCC」を, Windows環境でも使用できるようにしたもののようです( 参照).
  • 私の場合は,64ビット版のMinGW-W64/MYSYS2をインストールしました. つまり,「その1.5」のページを参照しました. インストール先として提示されている「sourceforge」のサイトに行くと 「Oh no! Some styles failed to load」というメッセージが 出るので(2020.02.15現在), 2番目に提示されている「gihub」のサイト「MSYS2 Installer」を利用しました.
  • インストールが終わると,スタートメニューに「msys2」が登録され, 「MSYS2 MinGW 32-bit」「MSYS2 MinGW 64-bit」「MSYS2 MSYS」という 3つの実行ファイルが表示されます. 2番目を使用する場合と,3番目を使用する場合があるので注意が必要です. 解説サイトでは,その区別がきちんとなされているので注意して読んでください.
  • インストールしたら, 「手順9」で3番目の「MSYS2 MSYS」を立ち上げて, ファイル群を「update」する必要があるようですが, 私の場合は「update-core」が見つかりませんというエラーがでました. したがって,その後の手順は, 「手順9」で解説されている「a」の方を実行しました.
    その作業は,かなりの時間がかかります.30分以上はかかると思った方がよいでしょう. 途中で,どこを押せば(クリックすれば)よいのか分からなくなる時がありますが, 解説をよく読んでください.赤字で,その場合の対応法が書かれています. 要するに,右上の「×」を押して終了させて,もう一度立ち上げればよいようです. この操作は何度か必要になり,その都度「MYSYS2 MSYS」を立ち上げて 「pacman -Syuu」を実行することになります.
  • インストールとアップデートが終了したら, 「サンプルのコンパイルテスト」について解説されています. それは単なるテストではなく, そこで利用したサンプルファイルの一部(gnuplot_plugin.h)は GSLの関数を利用する際も必要なファイルです.したがって, このサンプルテストは,実際に試してみる必要があります. そのためには,gnuplotのソースファイルを入手する必要があります. 入手先として「sourceforge」のページが参照されていますが, なぜかそのサイトは「Oh no! Some styles failed to load」となってファイルを 入手できません(2020.02.15現在). 他のサイトも,多くは実行ファイルが登録されていてソースファイルまでは 含まれていません.そこで, 私の場合はCTANから 入手しました.ただし,バージョンは 5.2.6 でした.
  • サンプルファイルを編集してコンパイルするには,64ビット版の場合は 「MSYS2 MinGW 64-bit」を利用することになります. 「MSYS2 MSYS」ではないので注意してください.解説サイトでも赤字で注意が 促されています.ただ,私の場合は,書かれている通りに実行してエラーもなく 終了したのですが,dllファイルは生成されませんでした. 再起動してもう一度試したら大丈夫でした. おそらくは,pathの設定の問題ではないかと思われます. 使用したソースファイルは 5.2.6 のものでしたが,問題ありませんでした.
  • サンプルファイルをコンパイルしてみるには, そのファイルをおいてあるディレクトリー(フォルダー)に移動する必要があります. そこでは,フォルダー移動に関するコマンド「cd」について, ある程度把握している必要があります. 「MSYS2 MinGW 64-bit」の場合は,「/home/ユーザー名」がデフォルトの フォルダーになるようですが,私の場合はルートディレクトリーに「home」という フォルダーは無いので, 「cd」で移動しようとしてもうまくいきませんでした. おそらくは,存在しないフォルダー内で移動しようとしているためと思われます. そこで,実際の作業フォルダーは, 「cd c:/users/ユーザー名/documents/・・・」という形で直接指定した方が よいようです.移動するフォルダー名に漢字が含まれていても大丈夫です.
    1. 「cd ABC」:現在いるフォルダーの下部フォルダー「ABC」に移動する.
    2. 「cd ..」:現在いるフォルダーの上部フォルダーに移動する.
    3. 「cd c:/ABC/DEF」:絶対指定したフォルダーに移動する.
    4. 「pwd」:現在いるフォルダー名が表示される.
    5. 「dir」:現在いるフォルダーにあるファイル名が表示される.
  • GSLのインストールのやり方は,最初に提示したサイトの解説を 順に読んでいくと書かれています. 「その3」の冒頭で解説されており, MSYS2を使って「pacman」を利用してインストールします.
  • インストールしたGSLのファイルは,私の場合は 「c:/msys64/mingw64/include/gsl」に保存されました. 拡張子が「h」の265個のファイルがあります. どんな関数が定義されているのかは,ある程度ファイル名で判断できます. GSLで定義された関数をgnuplotで利用できるようにするのは, そこで使用されている関数名を参照する必要があります. 使用したい関数のコマンド名はGSLの リファレンス・マニュアルに書かれており, その関数がどのファイルに含まれているかが明示されています. ベッセル関数での場合を参考にしながら, 必要なことを記述することになるでしょう.
  • 概ね,以上のようなことに気をつけながら,解説されている通りに やってみると良いでしょう.

    参考までに, 作成したベッセル関数のCプログラムとdllファイルも登録しておきます (Cプログラムdllファイル).

同様にすると, GSLに登録されている膨大な関数群を gnuplot でも 利用することができることになります. 私自身は解説サイトに書かれていることを真似ただけですが, 「C」について堪能な方であれば gnuplotで扱うことのできる世界が一気に広がることになるでしょう.


▲戻る(トップメニューマップ)

球面調和関数

はじめに
通常の数学の教科書では触れられることが少ないのですが, 「球面調和関数」という関数があります. 私自身も掲示板[No.5]で質問があったことで詳細を知るようになった関数なのですが, フーリエ級数なみの重要な関数であるようです. 原子の軌道解析やCGにおける光の反射等の計算などで利用され, フーリエ級数の基底としての三角関数と同じような正規直交性があります. 球面上の任意の関数を球面調和関数で展開することができるようであり, それにより膨大な情報を幾つかの係数値に圧縮することができるようです. 詳しくはMaximaでの解説 を参照してください.

この関数を gnuplot で扱ってみようと思います. この関数は,次のような式で定義される関数です. \[\small \begin{align*} Y_l^m(\theta,\phi) &=(-1)^{\frac{m+|m|}{2}}\sqrt{l+\frac12}\\ &\times\sqrt{\frac{(l-|m|)!}{(l+|m|)!}} P_l^m(\cos\theta)\\ &\times \frac1{\sqrt{2\pi}}e^{im\phi} \end{align*} \] ここで,\(\small P_l^m(x)\) はルジャンドルの培関数と呼ばれる関数で, ルジャンドルの多項式を \[\small P_l(x)=\frac1{2^ll!}\frac{d^l}{dx^l}(x^2-1)^l\] とするとき,次の式で定義されます. \[\small P_l^m(x)=(1-x^2)^{\frac{|m|}{2}}\frac{d^{|m|}}{dx^{|m|}}P_l(x)\]

要するに,関数の定義自体に高次導関数の高次導関数を含むので, この式を直接 gnuplot に打ち込むことはできません. ただし,GSLには,ルジャンドルの培関数が登録されています. gnuplot は複素数も扱うことができるので, ルジャンドルの培関数を gnuplot で利用できれば, この球面調和関数も扱うことが可能になります.

gnuplotによる球面調和関数のグラフを描画しているサイトもありますが, そこでは \(\small l, m\) を決めて計算された具体的な関数式のグラフが 描画されています(参照). gnuplotでルジャンドルの培関数を利用することができると, 任意の \(\small l, m\) について 関数式を知ることなくグラフを直接描画することができます.


▲戻る(トップメニューマップ)

Cプログラムの作成
球面調和関数は,GSLのリファレンス・マニュアルによれば 「2.24.2 ルジャンドルの培関数と球面調和関数」(p.77)の箇所で解説されています. それによると、\(\small P_l^m(x)\) の計算では \(\small l, m\) が両方大きくなると (概ね \(\small l\geq 150\)) オーバーフローが生じるので, 正規化された「gsl_sf_legendre_sphPlm(l,m,x)」を使用することが推奨されています. 「正規化されたルジャンドルの培関数」は,次の式で定義されます. \[\small \sqrt{\frac{2l+1}{4\pi}}\sqrt{\frac{(l-m)!}{(l+m)!}}P_l^m(x)\] \(\small l,m\) は整数で \(\small m\geq 0, l\geq m, |x|\leq 1\) であることが 必要です.\(\small m\lt 0\) のときは利用できませんが,球面調和関数の性質 として \[\small Y_{l,-m}(\theta,\phi)=(-1)^mY_{lm}^{*}(\theta,\phi)\] という性質を利用することで対応可能です.右辺は複素共役です.

この関数を利用するためのCプログラムは, 「C言語の利用」の箇所で提示したサイトにしたがい, ベッセル関数のときのプログラムを球面調和関数に合わせて修正するだけです( 参照). そのサイトでは,ベッセル関数でのプログラム例として下記が提示されています.

#include "gnuplot_plugin.h"
#include <math.h>
#include <gsl/gsl_sf_bessel.h>
DLLEXPORT struct value Jn(int nargs,
        struct value *arg, void *p){
struct value r;
double x;
int n;
RETURN_ERROR_IF_WRONG_NARGS(r, nargs, 2);
RETURN_ERROR_IF_NONNUMERIC(r, arg[0]);
RETURN_ERROR_IF_NONNUMERIC(r, arg[1]);
r.type = CMPLX;
n = IVAL(arg[0]);
x = RVAL(arg[1]);
r.v.cmplx_val.real = gsl_sf_bessel_Jn(n, x);
r.v.cmplx_val.imag = 0.0;
return r;
}
球面調和関数で使用するルジャンドルの培関数は 「gsl_sf_legendre.h」で定義されて引数は3個あるので, それに合わせた修正が必要です. gnuplotで使用する関数名を,たとえば「sphPlm(l,m,x)」とします. GSLでの関数名と同じである必要はありません. 次のように修正しました.
#include "gnuplot_plugin.h"
#include <math.h>
#include <gsl/gsl_sf_legendre.h>
DLLEXPORT struct value sphPlm(int nargs,
        struct value *arg, void *p){
struct value r;
int l;
int m;
double x;
RETURN_ERROR_IF_WRONG_NARGS(r, nargs, 3);
RETURN_ERROR_IF_NONNUMERIC(r, arg[0]);
RETURN_ERROR_IF_NONNUMERIC(r, arg[1]);
RETURN_ERROR_IF_NONNUMERIC(r, arg[2]);
r.type = CMPLX;
l = IVAL(arg[0]);
m = IVAL(arg[1]);
x = RVAL(arg[2]);
r.v.cmplx_val.real = gsl_sf_legendre_sphPlm(l,m, x);
r.v.cmplx_val.imag = 0.0;
return r;
}
このファイルを,たとえば「gsl_sphPlm.c」として保存します.

▲戻る(トップメニューマップ)

dllの生成とインポート
次に,作成したCプログラムをMinGWでコンパイルします. その手順は下記の通りです. (MinGWのインストールや利用法はこちらを参照。)
  1. [スタートメニュー]
    >[MSYS2 64bit]>[MSYS2 MinGW 64bit]
  2. 「cd」を利用して,保存したCプログラムのフォルダーに移動する.
  3. 次のコマンドでコンパイルする.最後はピリオド「.」がつきます. (下記では改行しながら示していますが,実際には1行で入力する.)
    gcc -static -shared -o
     gsl_bessel_Jn.dll gsl_bessel_Jn.c
     -lgsl -DHAVE_CONFIG_H -I.
これで,「gsl_sphPlm.dll」が生成されるはずです. エラーが出るときは,Cプログラムの記述ミス, コマンドのスペルミス,あるいは読み取るファイルの保存フォルダーの指定 などをチェックしてください. それでもエラーが出るときは,「C」に堪能な方に相談してください. 参考までに作成したCプログラムとdllファイルを登録しておきます. (Cプログラムdllファイル)

生成した「gsl_sphPlm.dll」をgnuplotで使用するには, そのファイルを「import」する必要があります. その手順は下記の通りです.

  1. 「gnuplot」を立ち上げる.
  2. [File]の箇所を利用して,あるいは「cd」コマンドを利用して, 生成したdllファイルがあるディレクトリーに移動する. あるいは,生成したdllファイルを, 通常使用しているgnuplotの作業ディレクトリーに移動(またはコピー)する.
  3. 次のコマンドで,生成した「sphPlm(l,m,x)」を呼び出す.
    「import sphPlm(l,m,x) from "gsl_sphPlm"」

▲戻る(トップメニューマップ)

グラフの描画
生成した正規化されたルジャンドルの培関数「sphPlm(l,m,x)」を利用して, 球面調和関数のグラフを描画してみましょう. 最初に,正規化されたルジャンドルの培関数のグラフを確認しておきます. 下図では,定義域 \(\small [-1:1]\) を指定しないで「plot」を実行すると エラーが生じて「gnuplot」が強制終了されるので気をつけてください.

スマホでのモバイル表示の関係で改行していますが, 実際には1行で入力してかまいません. gnuplotでは,「\」の後に[enter]とすると, 改行しながらコマンドを入力することができます. ここでは,正規化されたルジャンドルの培関数 \(\small P_2^0(x), P_2^1(x), P_2^2(x)\) のグラフが描画されています.

以下では,球面調和関数を定義しますが, 「正規化されたルジャンドルの培関数」が利用されているので, 最初に記述した定義式と定数部分の違いがあります.

gnuplotでは球座標や円柱座標のまま関数のグラフを描画することはできません. 球面調和関数は球座標で表される式なので, そのグラフを確認するためには媒介変数を用います. 極方程式 \(\small r=f(\theta,\phi)\) を媒介変数表示すると, \[\begin{cases} \small x=f(\theta,\phi)\sin\theta\cos\phi\\ \small y=f(\theta,\phi)\sin\theta\sin\phi\\ \small z=f(\theta,\phi)\cos\theta \end{cases}\] ですが, gnuplotで2変数の媒介変数は \(\small u, v\) を使用する必要があるので, 次のようになります.下図は, 球面調和関数のグラフとしてよく例示される \(\small Y_2^0\) の グラフです.\(\small \phi=0\) なので,これは実関数として \[\small Y_2^0(\theta,\phi)=\frac14\sqrt{\frac{5}{\pi}}(3\cos^2\theta-1)\] により表される関数です.正規化されたルジャンドルの培関数を利用しているので, 具体的な関数の式を入力する必要はありません.

【参考】gnuplotは,球座標のままでグラフ表示することはできませんが, 平面の極座標であれば極方程式のままグラフを表示することができます. 下図は,\(\small y(2,0,\theta,\phi)\) について,\(\small \phi=0\) の場合, つまり \(\small xz\)平面による断面図を極座標で描画したものです. 極座標の変数は \(\small t\) を用いる必要があります. \(\small \theta\) は \(\small z\) 軸からの角ですが, 平面の極座標の場合は始線からの角になります. この図を横軸を中心軸に回転したものが \(\small y(2,0,\theta,\phi)\) のグラフです.以下では,\(\small f(u,v)=y(2,0,u,v)\) の指定が引き継がれています.

下図は,\(\small |Y_2^1|\) のグラフです.上記の極座標を試した場合は polar, xrange, yrange を「unset」で解除した後に 改めて「set parametric」を実行してから下記を行ってください.

下図は \(\small Y_5^4\) の実部 (\(\small {\rm real}\,(y(5,4,u,v))\)) のグラフです.


▲戻る(トップメニューマップ)

(参考) ベッセル関数
一般に,ベッセル関数は,ベッセルの微分方程式 \[\small x^2y''+xy'+(x^2-\alpha^2)y=0\] の特殊解 \(\small J_{\alpha}(x), Y_{\alpha}(x)\) として定義され,一般解は \[\small y=c_1J_{\alpha}(x)+c_2Y_{\alpha}(x)\] として表されます.\(\small J_{\alpha}(x), Y_{\alpha}(x)\) は, それぞれ第1種のベッセル関数,第2種のベッセル関数と呼ばれており, 具体的には次の式で表されます.実際には \(\small \alpha\) が整数の場合を 扱うことになります(参考1参考2). \[\small \begin{align*} J_{\alpha}(x) &=\sum_{n=0}^{\infty}\frac{(-1)^n}{n! \Gamma(n+\alpha+1)}\left(\frac{x}{2}\right)^{2n+\alpha}\\ Y_{\alpha}(x) &=\frac{J_{\alpha}(x)\cos(\alpha \pi)-J_{-\alpha}(x)}{\sin\alpha\pi} \end{align*} \]

▲戻る(トップメニューマップ)

■「gnuplot」のリンク集
ここでは,gnuplotの利用法を解説しているWebサイトを紹介します.
  • gnuplotの初歩
    gnuplotの使い方に関して、初歩から曲面の描画まで丁寧に解説されています.
  • 初歩gnuplot入門
    愛知教育大学の数学科の学生向けに, gnuplot4.0.0の使い方が初歩から丁寧に解説されています.
  • gnuplot tips
    gnuplotに関して「〜したい」と思うことが丁寧に解説されています. ただし,2003年の解説なので, 最新版のgnuplotでは動作しないものも含まれています.
  • gnuplot FAQ
    gnuplot ver.5 に関するFAQです.
  • gnuplot
    gnuplotに関する「not so Frequently Asked Questions」です.
  • gnuplot入門
    琉球大学工学部電気電子工学科の学生向けの, gnuplotに関する解説書です(PDF版).
  • gnuplot:グラフを描く基本ツール
    大阪大学の理学部数学科の学生向けの解説です.
  • gnuplot入門
    明治大学の,おそらくは工学部の学生向けの解説です.
  • gnuplotコマンド集
    gnuplotのコマンドが,機能ごとに分類されて解説されています。
  • gnuplotのepslatexを使ってTeXへ・・・
    「set terminal」で「epslatex」指定のやり方について解説されています.
  • gnuplotを使ったグラフ作成
    実験で得られた離散データの処理の仕方について詳しく解説されています.
  • gnuplotスクリプトの解説
    論文で使用する図を作成することを目標に,詳しく解説されています.
  • gnuplot
    いろいろな機能別にコマンドの使い方がまとめられていますが, gnuplotを使いなれた方の備忘録的な内容です.
  • gnuplot|シキノート
    上級向けの記事が多数登録されています. 華麗な曲面グラフを作成するときは参考になります.
  • 可視化の基礎演習
    離散データをもとに,それを可視化するときの様々な技法について解説されています.
  • gnuplot
    gnuplot5.2の公式マニュアルの日本語訳です.
  • gnuplot について
    上記のマニュアルを公開されている新潟工科大学の竹野先生のサイトです. 更新情報やいろいろな専門Tipsなど,「gnuplot」の最新情報がまとめられています.
▲戻る(トップメニューマップ)

copyright