gnuplotによるグラフの作成

in [TeXの部屋]

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

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

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


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

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

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

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


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

■「gnuplot」とは?

「gnuplot」とは?
 gnuplotは 1変数や2変数の関数のグラフを描画するフリーのアプリケーションで, Unix, Windows, MacOS, Androidなど多数のOS上で動作します. 「グニュープロット」と呼ばれることもありますが, 本来は「ニュープロット」と呼ぶようです. 「gnu」がついていますが, 「GNUプロジェクト」とは関係しないフリーソフトです. 描画されたグラフをファイル保存(eps, pdf, jpeg等)すると, TeXのファイルとして取り入れることができます.
 このページでは,gnuplotによる基本的なグラフの描画方法と, TeXのファイルとしての取り入れ方について解説します. 細かい使い方は,他の解説サイトを参照してください.
 とりあえず,どのようなグラフが表示できるかは下記のサイトを参照してください. gnuplotによる多数の出力例が紹介されています.
  • Wikimedia-gnuplot diagrams: 主に平面グラフについて,多数の出力例があります. 画像をクリックして右下に表示される「More details」をクリックすると, スクリプトが表示されます.
  • Demo Scripts for gnuplot version 5: 多数のグラフとスクリプトが登録されています.
  • gnuplot pm3d: いろいろな曲面の出力例があり 画像をクリックするとスクリプトが表示されます.
  • gnuplotギャラリー: 物理学関連の画像とスクリプトが公開されています.
  • 下図は,偏微分や重積分の授業で参考図として作成したものです.

ダウンロード
 最初に,次の手順でgnuplotの最新版をダウンロードします. 以下は,ダウンロードの主な画面を示したものです. Android版は「Google Play」で検索してください.
  1. 本家サイト「gnuplot homepage」にアクセスする.[ URL]
  2. トップ画面の上部に表示されるメニューから 「Download」の箇所をクリックする.

  3. 「gnuplot download」のページに飛ぶと, タイトルの下に「Current gnuplot major version is *.*」 (2022.03.26時点では,5.4)という行がある. Windows版をダウンロードするには,その行の下部にある 「Primary download site on SourceForge」をクリックする.
     Linux版やMac版をダウンロードするには, 下方の「Downloads offerd by others」の箇所にある 「Various Sources and binaries」を参照する.

  4. 「Primary download site」をクリックすると 「SourceFoge」の「gnuplot」のページに飛び, 上部に緑色の「Download Latest Version」のアイコンがある. それをクリックすると, Windowsの最新の自動解凍ファイル(.exe)がダウンロードされる.
     画面の右下に表示される「Sign Up」を クリックしてメールアドレスを登録すると, バージョンアップしたときには最新情報が送られてくる. 連絡不要のときは「No, Thank you」を選択する. いずれにも返答しないで無視してもかまわない.

  5. 以上の操作で,gnuplotのWindows版の最新版が, [Downloads]フォルダーに保存される.2022.03.26時点でのファイル名は 「gp543-win64-mingw.exe」(38MB)である.
▲戻る(トップメニューマップ)

インストール
ダウンロードしたEXEファイルをダブルクリックすると, ファイルは自動解凍されます. 解凍途中では,以下の事について確認が求められます. 特にこだわりが無ければ,「Ok」や「次に」を押し続けていればよいでしょう.
 途中で確認を求められる主な事項は,下記の通りです.
  1. 使用言語が「日本語」でよいかの確認が求められる.
  2. 「使用許諾契約書の同意」が求められる.
  3. 重要な情報を読むことが求められる.
  4. インストールするフォルダーを指定する. デフォルトでは,「c:\Program Files\gnuplot」にインストールされる.
  5. インストールするコンポーネントを選択する. 「日本語対応」のチェックが外れているので,チェックを入れる.
  6. プログラムアイコンを作成する場所を指定する.
  7. 追加タスクを指定する.
  8. インストールしてよいかどうかの確認が求められる.
  9. インストールが終了すると,その旨のメッセージが表示される.

 以上の個々の画面を表示しながら ダウンロード・インストール手順を説明している サイトもあります.ただし, 古いバージョンで説明されているので, このページでの説明と若干違う部分もあるので注意してください.


gnuplotの起動
インストール後にスタートボタンを押すと, 「最近追加されたもの」として, 上部に「gnuplot」の名称のついた2種類のアイコンが表示されます. 「console-version」ではない方のアイコン, つまり一番上に表示されるアイコンをクリックします.

クリックすると下図のようなトップ画面が現れるので, メニューが日本語表示になっていることを確認してください. 「ヘルプ」から「目次」を選択して個々の項目をクリックすると, 日本語の解説が表示されます.


誤って「console-version」を選択すると, 下図のようなDOSモードのgnuplotが立ち上がります.


この画面でもgnuplotの全機能を利用することはできますが, いちいちコマンドを打ち込む必要があり, メニュー形式でのコマンド選択はできません. gnuplotを終了するには, いずれの場合も「quit」か「exit」を打ち込むか, または右上の「×」ボタンをクリックします.
▲戻る(トップメニューマップ)

■グラフ画面の諸設定

画面のフォント調整
gnuplotの初期画面では, 画面に表示されるフォントが小さすぎると感じるかもしれません. そのフォントの大きさは自由に変更することができます. カーソルを画面上において右クリックすると表示されるメニューから, 「Choose Font...」を選択します. フォントの選択画面が表示されるので, 希望するフォントとサイズを指定します. 最新版をダウンロードするとデフォルトで日本語が使用可能になっているので, サイズの箇所だけ指定すればよいでしょう.



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

平面グラフの描画
gnuplotを利用すると,どのようなグラフが描画されるのかを さっそく試してみましょう. 平面グラフの描画コマンドは「plot」です. 簡単な2次関数 \(\small y=x^2-2x\) のグラフ描画は, 次のように打ち込みます.
  • plot x\(**\)2\(-\)2\(*\)x
関数の入力で「\(\small y=\)」を打ち込む必要はありません. また,gnuplotの数式入力では「べき乗」の記号\(^\)は利用できません. \(x^n\) は,「x\(**\)n」と入力することに気をつけてください. 「数と文字」や「文字と文字」の積は, 積の記号「\(*\)」を間に挟む必要があります. コマンドを直接打ち込まないで, メニューの「プロット(P)」の箇所を利用することもできますが, 単に「plot 」が書き込まれるだけで,関数の式は自分で入力するしかありません. 直接打ち込む方が簡単だと思います. 関数の式を入力して「enter」を押すと,次のようなグラフが表示されます.

(注意) 分数係数を掛けるときは注意してください.
たとえば, 「plot 1/2\(*\)x\(**\)2」とすると,直線「y=0」が描画されます. gnuplotの仕様では,「整数/整数」では整数の商が返されます. 「1/2」の商は「0」なので,要するに「plot 0\(*\)x\(**\)2」が 描画されてしまうのです. これは関数を定義するときの要注意事項なので,記憶に留めておいてください. どうすればよいかというと, 要するに「小数点をつける」ということで, 「1.0/2」「1/2.0」「1.0/2.0」のいずれかで入力します.

このグラフは, おそらくは多くの方がイメージしているグラフではないと思われます. いろいろと気になる点があります.
  1. 座標軸が描画されていない.
  2. 軸の名前(ラベル)が表示されていない.
  3. 縦軸や横軸のスケールが大きすぎる.
縦と横の目盛りはありますが,座標軸が描画されていません. gnuplotのデフォルトでは, 定義域を \(\small -10\le x\le 10\) とした場合のグラフが描画されます. \(\small y\) 軸の範囲は,この定義域内の グラフがすべて表示できるように自動設定されます. 定義されていない点を含むときの \(\small y\) の範囲は,関数により異なります. また,グラフを描画する枠は,デフォルトでは横長に設定されています.

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

座標軸の設定
gnuplot に対するいろいろな設定は「set」コマンドを利用します. たとえば,座標軸を描画して,軸の名前(ラベル)を表示し, 軸の範囲を \(\small -2\le x\le 4, -2\le y\le 6\) に指定するには次のようにします.
  • set zeroaxis
  • set xlabel "x"
  • set ylabel "y"
  • set xrange [-2:4]
  • set yrange [-2:6]
  • replot

両座標軸は「zeroaxis」を指定すると表示されます. どちらか一方でよいとき, \(\small x\) 軸は「xzeroaxis」, \(\small y\) 軸は「yzeroaxis」により表示されます. 数学の教科書などでは, 原点で直交する2本の数直線は正の方向が矢印で示されますが, gnuplotでは単なる点線で表示されます. 始点と終点を指定して矢印を書き入れることはできますが, その方法については後述します.

■軸のラベル
軸のラベルは,それぞれ「xlabel」「ylabel」で指定して 「”」か「'」で囲います. 簡略化して「xl」「yl」でもかまいません. 座標軸の先端ではなく, グラフを描画する枠の外側に表示され, 縦軸のラベルは90度回転して表示されます. 「set」で指定した内容を削除するには「unset」を用います. たとえば,\(\small x\) 軸のラベルを削除するには「unset xlabel」などとします.

軸に日本語を含めて入力しようとすると, 入力中の日本語がきちんと表示されないかもしれません. 入力が正しくできていればエラー表示はでません. 「replot」すれば,グラフ画面に日本語が表示されているはずです. 例えば,次のように入力してみます.

  • set xlabel '横軸'
  • set ylabel '縦軸'
画面では「軸」の右半分が消えて表示されますが, 「replot」すると日本語で表示されています.

日本語を利用する場合は, その内容を書き込んだテキストファイルをあらかじめ作成しておいて, それを読み込むようにするとよいようです. たとえば,上記の,横軸・縦軸の2行を書き込んだファイルを「test.plt」 として保存しておいて, そのファイルをgnuplotの画面にドロップするとよいでしょう. ドロップすると,下記のように書き込まれます.
  • load 'C:\Users\・・・\test.plt'
そのファイルの置かれたフォルダーが表示されて, ファイルの読み込み(ロード)が行われたことを示しています. その後で「replot」すると日本語が書き込まれたグラフが表示されます.

gnuplotが入力や出力で利用するフォルダーは, デフォルトでは「My Documents」です. そのフォルダーにファイルを置いているときは, ドラッグしないで「load 'test.plt'」とすることでもかまいません. gnuplotで利用するフォルダーを変更する方法は, 「履歴とグラフのファイル保存」の箇所を参照してください.

座標軸のラベルのフォントのタイプや大きさを指定することもできます. たとえば,\(\small x\) 軸であれば,「set xlabel font "FontType, FontSize"」 の形で指定し,「MS明朝」であれば 「set xlabel font "MS明朝, 14"」とします(図は略).

■矢印としての座標軸
長方形の枠が表示されないようにするには,「unset border」とします. ただ,枠線は表示されませんが目盛りが表示されます.

  • unset border
  • replot

目盛りやラベルを消すには,「unset xtics」「unset xlabel」などとします. その上で,座標軸を矢印で書き込みます. 矢印は,「set arrow A from 点1 to 点2」の書式です. 「A」には,その矢印に付すラベルです.適当な番号で指定します. 点1と点2は,たとえば (a,b) であれば,「a,b」で指定します. 矢印には,それぞれ異なる番号を付します. それにより,たとえば y軸方向の矢印に「2」を付したとき, それを消すには「unset arrow 2」とします.

矢印を引いただけでは目盛りは表示されません. 目盛りを表示させるには, たとえば x軸の場合は「set xtics axis」とします. デフォルトは「set xtics border」に設定されています.
  • unset xtics
  • unset ytics
  • unset xlabel
  • unset ylabel
  • unset zeroaxis
  • set arrow 1 from -2,0 to 4,0
  • set arrow 2 from 0,-2 to 0,6
  • set xtics axis
  • set ytics axis
  • replot

★なお,グラフ画面を消去するコマンドは「clear」, 入力した各種の指定をすべて初期化するコマンドは「reset」です. 矢印の太さや矢尻の大きさなどを調整したいときは, 下記を参照してください.


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

座標軸の範囲と目盛り
軸の範囲は「xrange」「yrange」で指定します. 簡略化して,それぞれ「xr」「yr」だけでもかまいません. \(x\) 座標と \(y\) 座標はコロン(:)で区切ることに注意してください. 範囲指定を自動設定に戻すには「set autoscale」とします.

「replot」は,定義済みの関数のグラフを「再描画」させるコマンドです. 改めて関数の式を入力する必要はありません. 関数を描画後に範囲を指定するのではなく, 最初から範囲を与えて描画することもできます. その場合は,下記のように,関数の前で \(\small x\) 軸の範囲と \(\small y\) 軸の範囲を指定します.

  • plot [-2:4] [-2:6] x\(**\)2\(-\)2\(*\)x

座標軸の目盛りは自動的に付されますが, その間隔を自分で指定することもできます. たとえば,\(\small y\) 軸の目盛りを2刻みにするには 「set ytics 2」とします(図は省略). \(x\) 軸は「xtics」を利用します. 目盛りのフォントを指定するには, 「set tics font "FontType, FontSize"」のように指定します. たとえば,「set tics font "Times New Romman,14"」などとします(図は略).

目盛りの指定を削除するには「unset」を利用します. たとえば,\(\small y\) 軸の目盛りを削除するには「unset ytics」とします. \(y\) 軸の目盛りを削除して「replot」すると, 縦軸の目盛りが消えて単なる縦線になります(図は略). 「unset yrange」として「replot」すると, \(\small x\) 軸に指定した範囲のグラフが表示されるように \(\small y\) 軸の範囲が自動設定されます(図は略).

なお,座標軸の範囲や目盛りの調整を試してみた場合は, この後の説明の都合上,下記の設定にしておいてください.

  • reset
  • set zeroaxis
  • set xrange [-2:4]
  • set yrange [-2:6]
  • set xtics 1
  • set ytics 1
  • plot x**2-2*x
テキストファイルに,上記の内容を保存して, たとえば「gplot_basic.g」などとすれば, 「load "gplot_basic.g"」により 「座標軸の設定」での設定に戻り, 放物線が描画されます.


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

色と線種の指定
グラフの色は関数が変わるごとに変わり, 8種類の色が順繰りに変化していきます. どのような色が登録されているかは,「show linetype」により表示されます(図は略). 色に名前がついていないものはrgbコードで表示されます. ただし,コードだけでは色のイメージが沸かないので, 私の感覚(イメージ)で名前をつけました.右列のイメージの箇所は, 一部を除いて正式な色の名前ではありません.

linetype色(rgb) イメージ
1 dark-violet
2 "#009e73" 青緑
3 "#56b4e9" 水色
4 "#e69f00" 橙色
5 "#f0e442" 薄黄
6 "#0072b2" 薄青
7 "#e51e10"
8 black

上記の色が循環していきますが, この中の特定の色で描画させることもできます. たとえば,関数f(x)のグラフを「黒色(black)」で描画させるには, 「plot f(x) linetype 8」または「replot f(x) linetype 8」とします. 「linecolor」でもよいようです. 再描画の場合,関数部分は必須です. 事前にグラフが描画済みとしても,「replot linetype 8」ではエラーとなります. この8色以外の色で描画するには, 「plot f(x) linetype rgb "gold"」または 「plot f(x) linetype rgb "#ffd700"」などとして, カラーの名称かカラーコードを直接指定します. 「linetype」は「lt」,「linecolor」は「lc」と簡略指定することができます.

グラフの線種はデフォルトでは実線になりますが, 点線や破線で描画させることもできます. その指定は「plot f(x) dashtype N」として,Nの番号で指定します. Nの値により,次のような線種を指定することができます. 「dashtype」は「dt」と簡略指定することができます.

dashtype 線種 
1実線
2破線
3点線
41点鎖線
52点鎖線

以下では,\(\small f(x)=x^2-2x\) として, 線種を変えながら\(\small y\) 軸方向に平行移動しています. 色はgnuplotが自動的に変えています. 指定には簡略化した記法を使っています.

  • f(x)=x\(**\)2\(-\)2\(*\)x
  • plot f(x)\(-\)1
  • replot f(x) dt 2
  • replot f(x)\(+\)1 dt 3
  • replot f(x)\(+\)2 dt 4

個々の関数ごとに指定しながら「replot」するのが面倒なときは, 個別に指定しながら「,」で区切って次のように指定しても同じグラフが描画されます.

  • plot f(x)\(-\)1 dt 1, f(x) dt 2, f(x)\(+\)1 dt 3, f(x)\(+\)2 dt 4

曲線の太さを変えるには, 「plot f(x) linewidth N」として, Nには具体的な整数を入れます.デフォルトのNの値は1です. このコマンドは,「plot f(x) lw N」と略記することもできます. また,曲線の色,線種,太さを続けて指定することもできます. 下記では,定義済みの関数 \(f(x)\) に対して, 赤色の点線で太さを5倍にしたものです. コマンドは略記しています. 関数ごとに同じような指定をしながら 「,」で区切って指定していくと, 複数の関数のグラフを一気に描画することができます.

  • plot f(x) lt 7 dt 3 lw 5


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

格子線(グリッド)の表示
グラフが分かりやすいように,格子線(グリッド)を表示させることもできます. 「set grid」により,グリッドが表示されます. グリッドを非表示にするには,「unset grid」とします.
  • set grid
  • plot x\(**\)2\(-\)2\(*\)x

グリッドは,軸に目盛りがあるときに目盛りの箇所での格子線が引かれます. したがって,目盛りの指定がされていないときに「set grid」を実行しても 格子線は引かれません. たとえば,格子線が引かれている状態で 「unset ytics」として \(y\) 軸の目盛り消去して「replot」すると, 下図のように \(\small y\) 軸を通る格子線は引かれません. なお,そのことを確認後は, 目盛りは「set ytics 1」として元に戻しておきます.

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

グラフ画面のサイズ
gnuplotのグラフ画面は,\(\small x\) 軸や \(\small y\) 軸の範囲を同じにした場合でも 横長の画面に表示されます. 外枠の縦横の長さを同じにするには「set size square」とします. これによりグラフを描画する画面が正方形になりますが, それぞれの範囲指定の仕方により目盛りの幅は異なります. 「set size ratio a」として, \(\small a\) には縦\(\small /\)横の値を入れることでも画面枠のサイズを 調整することができます. 「set size x, y」とすると \(\small 横:縦=x:y \) になります. 下図は,
  • set size square
  • replot
によるグラフです. 「set size ratio 1」としても同じサイズになります.

ただし,この状態でグラフ画面を保存すると, グラフ部分だけではなく外枠の空白部分も一緒に保存されてしまいます. グラフ画面はデフォルトの画面幅のままで利用するのがよいと思います. 軸の目盛りの間隔が同じになるように設定するには, \(\small y\) 軸の範囲は \(\small x\) 軸の範囲の60〜70%程度にするのがよいようです. 具体的な範囲に応じて,目盛りの区切りが良くなるように決めるとよいでしょう.

なお,正方形状にした画面を元に戻すには, 「set size nosquare」または「set size noratio」とします. 以後の説明は,デフォルトの画面幅で行います.


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

凡例の調整
グラフを描画すると,画面の右上に関数の式とグラフの色が表示されます. その部分を「凡例」といいます. この凡例の表示方法は,下記のように変更することができます.
  1. 凡例を表示しないようにするには,
    • 「set key off」を実行する.これにより, それ以降にplotやreplotしたグラフの凡例は表示されない. 表示させるには「set key on」とする.
    • プロットする関数の後に,たとえば「plot f(x) notitle」とする. 「notitle」をつけると, 関数f(x)のグラフだけ凡例が表示されない.
    • 「replot f(x) notitle」とすると, f(x)のグラフだけが直前の画面に上書きされ凡例は表示されない.
  2. 凡例の内容を指定するには,
    • 「plot f(x) title '変更内容'」とする. 関数の式が「変更内容」に置きかえられる. 日本語を入力すると入力画面に表示されない場合があるが, ENTERを押してグラフ画面に表示されれば問題はない.
    • 「replot f(x) title '変更内容'」とすると,直前の画面に上書きされる.
  3. 凡例の位置を変更するには,
    • 「set key bottom」とすると,凡例が下部に表示される. 「left」は左側,「right」は右側,「top」は上部である. 「outside」を指定すると外枠の外側に表示され, 「inside」を指定すると内側に表示される.
    • 以上の指定は複数指定することができる. たとえば,「set key outside top left」として「replot」とすると, グラフ外枠の外側左上の箇所に凡例が表示される.
  4. グラフ画面にタイトルをつけるには,
    • 画面全体にタイトルをつけるには「set title 'Title of Graph'」 のようにする.グラフ画面の外枠の上部中央に「Title of Graph」が 表示される.
    • タイトルの位置は,「set title offset m,n」の書式で変更することができる. たとえば,「set title offset 0,-1」とすると, タイトルの文字が1文字分下がる.
    • タイトルを消去するには「unset title」とする.
    • タイトルに日本語を使用するには,「set title '日本語のタイトル'」 だけを書き込んだファイルを用意して, そのファイルをgnuplotの画面にドロップするか, または「load」で読み込ませるとよい. 「座標軸の設定」の箇所を参照のこと.

下図は,凡例に関して次の指定をしたものです. タイトル部分ではべき乗記号が使用できるようです.

  • set title 'Graph of f(x)=x^2-2x'
  • set key outside
  • replot

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

メニューの利用
以上の設定は,メニューから行うこともできます. 軸に関する諸設定は「軸(A)」の箇所に, 再描画は「プロット(P)」の箇所に登録されています. 下図は「軸(A)」のメニューです.メニューを利用して指定しても, gnuplotの画面には自分で入力したものと同じ内容が書き込まれます. 自己入力とメニュー利用のいずれが簡単かの判断は, それぞれのPCの利用スタイルによると思うので一概には言えません. メニュー利用の場合は,個々のコマンドを覚える必要はありません. コマンドを忘れたときはメニューを利用するとよいでしょう.


コメントの挿入
個々のコマンドの概要を把握できるように,コメントをつけることもできます. 「#」をつけると,それ以降の部分はコメント文として扱われます. 行頭につけると,その行全体がコメント行になります. 下記では行頭につけています. コマンドの履歴を保存して後で再利用したいときは, コメントをつけて保存しておくとよいでしょう. ただし,コメント部分に日本語を入力することはできません. 履歴の保存方法は後述します.

  • # zahyoujiku
  • set zeroaxis
  • # jiku label
  • set xlabel "x"
  • set ylabel "y"
  • # jiku hanni
  • set xrange [-2:4]
  • set yrange [-2:6]
  • # saibyouga
  • replot


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

■定数と関数の定義

定数の定義
gnuplotでは,定数として円周率 \(\small \pi\) は「pi」として定義されていますが, ネイピア数 \(\small e\) は定義されていません. その値を使用するには「exp(1)」として利用します. あるいは,「e=exp(1)」として文字「e」に定義しておけば, 「exp(x)」は「e\(\small **\) x」として利用することができます. 係数が複雑な式のときに, いちいちそれを打ち込むも大変です. その式を定義する前に, たとえば「a=sqrt(2/pi)」などと定義しておいて「a」を利用するととよいでしょう. 定義済みの定数は「print 定数」により確認することができます. 「show variables」とすると,gnuplotが認識している定数が表示されます. 定義した定数を削除するには「undefine 定数」とします. 個別に削除するのが面倒なときは「reset session」とします. すべての設定が削除され,gnuplotの初期状態に戻ります.

上図では,e, aを定義して,「print」を利用して値を表示させています. また,「show variables」により,その時点で定義されているすべての定数を 表示しています.gnuplotの幾つかの内部定数も表示されますが,気にしないことです. pi, a, e が含まれていることが確認できます. その下では「undefine」を利用して a を削除し, 実際に削除されたことを「print」と「show variables」で確認しています.


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

数値計算(複素計算)
gnuplotを電卓代わりに利用することもできます. 計算式を直接打ち込むとコマンドとして理解しようとして エラーが表示されるので,「print」を利用します.

整数と整数の割算では整数が返されるので注意してください. いずれかに小数点がつくと実数としての計算になります. 文字式で置きかえているときなどは「1.0」を掛けるとよいでしょう. あるいは,実数計算の箇所に現れる整数には, 小数点をつけるように習慣づけた方がよいかもしれません. また,gnuplotのマニュアル(16. 式(Expression))によれば, \(\small -5/2\) の計算結果が \(\small -3\) になるのか \(\small -2\) で表示されるのかはシステムにより異なるということが 書かれています.この違いは,あらかじめ確認しておいた方がよいでしょう.
★このことは、関数を定義するときも注意する必要があります。たとえば、 「plot 2/3*x」とすると、直線「y=0」が描画されます。「plot 2.0/3*x」または 「plot 2/3.0*x」とする必要があります。

複素数を扱うこともできます.\(\small a+bi\) は {a,b} で表します. 虚数単位は {0,1} なので,この値を I としておけば 複素数は「a+b*I」として利用することができます.

複素関数の値も計算することができます.

複素関数論で学ぶように, \(\small z=x+iy\) のときは \[\begin{align*} \small \log(z)&\small =\log|z|+i\arg z\\ \small e^z&\small =e^{x}(\cos{y}+i\sin{y})\\ \small \sin(z)&\small =\frac1{2i}(e^{iz}-e^{-iz}) \end{align*}\] で定義されます.\(\small z=2+3i\) の場合は \(\small |z|=\sqrt{4+9}=3.60555, {\rm arg}(z)=\arctan(3/2)=0.98279\) となるので次のようになり,当然ながら上記の結果と一致します. \[\begin{align*} \small \log(z)&\small =\log(3.60555)+i\cdot 0.98279\\ &\small =1.28247+0.98279i\\ \small \sin(z)&\small =\frac1{2i}(e^{-3+2i}-e^{3-2i})\\ &\small =\frac1{2i}\left\{e^{-3}(\cos{2}+i\sin{2})\right.\\ &\small     -\left.e^{3}(\cos{2}-i\sin{2})\right\}\\ &\small =-i\frac12(8.37925-18.21845i)\\ &\small =9.15449-4.16890i\\ \small e^z&\small =e^2(\cos{3}+i\sin{3})\\ &\small =-7.31511+1.04274i \end{align*}\]
▲戻る(トップメニューマップ)

関数の定義

関数 \(\small f(x)\) を定義するには, 単に,\(\small f(x)=(xの式)\) として定義するだけです. 2変数関数も同様に,\(\small f(x,y)=(x,yの式)\) とするだけです. 12個の引数まで利用できます. 定義した関数を削除するには「undefine GPFUN_関数名」とします. たとえば,関数として func(x,y) を定義しているのであれば, 「undefine GPFUN_func」とします. 単純な式に留まらず,次の項目にある条件分岐や繰り返し処理などを 利用することで,かなり複雑な関数も定義することができます.
★ただし、分数係数を掛けるときは注意してください。 gnuplotの仕様では「整数/整数」は、整数の商が返されます。 たとえば「2/3」を掛けるときは、「2.0/3」または「2/3.0」とする必要があります。


条件分岐と繰り返し処理
条件分岐をする関数を定義するには, 三項演算子が利用できます. 書式は「条件式 ? 処理1 : 処理2」の形で使用します. 条件式が真のときは処理1が実行され,偽のときは処理2が実行されます. 入れ子にして使用することもできます.たとえば, \[\small f(x)=\begin{cases} -x-2 & (x<-2)\\ x+2 & (-2\leq x<-1)\\ -x & (-1\leq x< 0)\\ x & (0\leq x)\end{cases}\] を定義するには次のようにします.
  • f(x)= x<-2 ? -x-2 : x<-1 ? x+2 : x<0 ? -x : x
  • plot [-4:2] [0:2] f(x)

条件を記述するとき,一致「\(\small a=b\)」は「a==b」, 不一致「\(\small a\ne b\)」は「a!=b」とします. 等号付きの不等号は「<=」「>=」などとなります.

繰り返し処理を行うこともできます. 書式は「do for [変数 = 開始:終了:増加数] {処理1;処理2;処理3}」 のようにします.たとえば,単純に1から10までの和の計算は次のようになります. [i=1:10:3]のように指定すると3刻みの和となります.

なお,単純な和を求めるには「sum」があります. 書式は「sum [変数=開始:終了] 計算式」です. 1から10までの和は, 「sum [i=1:10] i」だけで済みます.\(\small \displaystyle \sum_{i=1}^{10}i\) を 計算していることになります.

「while」文も利用できます. 書式は「while (評価式) {処理1;処理2;処理3}」のようにします. 評価式が0ではない間,処理が続行されます.whileを使用する場合は, 「0ではない間で実行される」ような評価式で設定する必要があります.

「if」文は「if (条件式) {処理1;処理2} else {処理3;処理4}」 のような書式で利用することができます. たとえば,下記では,区間 \(\small [0,1]\) の乱数(rand(0))を発生させて, 0.5より小さいか大きいかを判断しています.

do for [i=1:10] {a=rand(0); if (a<0.5) {print "small ",i,a} else {print "big ",i,a}}

このように入力式が長くなるときは,下記のように改行しながら入力するとよいでしょう.
do for [i=1:10]
{ a=rand(0);
if (a<0.5) {print "small ",i,a}
else {print "big ",i,a}}
「\」の後で[Enter]キーを押すと,改行しながら入力することができます.

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

■2次元グラフの描画

関数の入力と定義
gnuplotでは,いろいろな関数を扱うことができます. 円周率 \(\small \pi\) は,「pi」により参照することができます. 入力するときの書式は,下記の通りです.

関数書式
絶対値関数 abs(x)
平方根関数 sqrt(x)
べき乗関数 x\(**\)n
指数関数 exp(x)
対数関数 log(x), log10(x)
三角関数 sin(x), cos(x), tan(x)
逆三角関数 asin(x), acos(x), atan(x)
双曲線関数 sinh(x), cosh(x), tanh(x)
逆双曲線関数 asinh(x), acosh(x), atanh(x)
階段関数 sign(x), ceil(x), floor(x)

自分で関数を定義するときは, 「f(x)=・・・」の形で定義します. そのグラフは「plot f(x)」により描画されます. 下記では,\(\small f(x)=x^2-\pi x\) を定義してグラフを表示させています. 「plot」の後ろで \(\small x\)と\(\small y\) の範囲を最初に指定しています. 前の設定で座標軸の描画とグリッドの指定をしていれば, その指定を引き継いでグラフが描画されます.

  • f(x)=x\(**\)2\(-\)pi\(*\)x
  • plot [-2:4] [-3:6] f(x)


適当な文字定数を使用することもできます. 下記のようにしても上図と同じグラフが描画されます. あるいは,「f(a,x)=x\(**\)2\(-\)a\(*\)x」と定義しておいて, 「plot f(pi,x)」のようにすることもできます.
  • a=pi
  • f(x)=x\(**\)2\(-\)a\(*\)x
  • plot f(x)

「plot f(x), g(x)」などとすると, 複数の関数のグラフを描画することができます. あるいは,「plot f(x)」の後で「replot g(x)」としてもかまいません. グラフの線種や色等の指定の仕方は「グラフ画面の諸設定」を参照してください.


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

媒介変数表示によるグラフ
gnuplotは, \(\small x=f(t),\, y=g(t)\) のように \(\small t\) を媒介変数として 表された関数のグラフも描画することができます. 極座標で \(\small r=f(\theta)\) と表されている場合は, \(\small x=f(t)\cos{t}, y=f(t)\sin{t}\) により\(t\) を媒介変数として表すことができます. 媒介変数を利用できるようにするには,最初に
  • set parametric
を実行します.すると, 「dummy variable is t for curves, u/v for surfaces」と 表示され,曲線の場合の媒介変数は \(\small t\) を, 曲面の場合の媒介変数は \(\small u, v\) を使用するように表示されます. 元の直交座標に戻すには「unset parametric」とします.すると, 「dummy variable is x for curves, x/y for surfaces」と表示されて \(\small x, y\) の使用に戻ります.

xrange, yrange により座標軸の範囲を指定することができますが, 新たに trange により媒介変数の範囲を指定することができます. \(\small x=f(t),\,y=g(t)\) の \(\small a\le t\le b\) の範囲のグラフを描画させるには, 「plot [a:b] f(t), g(t)」とするだけです. 事前に「set trange [a:b]」を実行していれば, 「plot f(t), g(t)」だけでかまいません. デフォルトでは,\(\small -5\le t\le 5\) に設定されています. サイクロイドは,次により描画されます. \(\small t\) の範囲は,trangeを使用しないで関数の組の前で直接指定しています.

  • set zeroaxis
  • set grid
  • set xrange [-2:8]
  • set yrange [-2:4]
  • set xtics 1
  • plot [0:2\(*\)pi] t-sin(t), 1-cos(t)

下図は,三葉線 \(\small r=2\sin3\theta\) のグラフです. 直前のグラフで \(\small t\) の範囲を指定しているので,関数の組を指定するだけです. つまり,「set parametric」の指定のもとに極座標で表されたグラフを描画するには, 媒介変数を利用した式に定義し直す必要があります。 なお,グラフが画面中央に描画されるよう,\(\small x\) 軸の範囲を調整しています.
  • set xrange [-5:5]
  • set yrange [-3:3]
  • f(t)=2\(*\)sin(3\(*\)t)
  • plot f(t)\(*\)cos(t), f(t)\(*\)sin(t)


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

異なる座標系のグラフ
前項でみたように, 「set parametric」として媒介変数を利用すると 極座標で表された関数のグラフも描画することができます. 直交座標で \(\small y=f(x)\) と表された関数も, 媒介変数を利用すると \(\small x=t, y=f(t)\) と表すことができます. つまり,媒介変数のグラフモードにしておくと, 3種類のタイプのグラフを同じ画面に描画することができます.

例えば,単位円,心臓型曲線(カージオイド),そして正弦曲線 を同じ画面に描画するには次のようにします. 画面設定は前項のものを引き継ぎ,\(\small x\) 軸の範囲だけ変更します. 「set parametric」はすでに実行済みで, 媒介変数 \(\small t\) の範囲も前項ですでに定義済みです.

  • set xrange [-3:7]
  • plot cos(t), sin(t) # unit circle
  • f(t)=1+cos(t)
  • replot f(t)\(*\)cos(t), f(t)\(*\)sin(t) # cardiod
  • replot t, sin(t) # y=sin(x)

このように,一つの曲線をplotした後は,replotを利用して 次々にグラフを重ねがきすることができます.ただし,replotすべきところで plotを利用すると,前に描いたグラフは消えてしまうので注意してください. その場合は,最初からやり直すしかありません.

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

極座標によるグラフ
極座標で表された関数のグラフは,前項により 媒介変数表示に変換して描画することができますが, 「set polar」によりグラフ画面の座標系自体を極座標に直すこともできます. 元に戻すには「unset polar」とします. さっそく試してみましょう. 前項と同じ三葉線を描画させてみます.
  • set poloar
  • plot sin(3\(*\)t)

前項の画面範囲を引き継いで描画され, 始線には動径 \(r\) の目盛りが表示されます. そこで,画面範囲をデフォルトに戻すために「reset」を実行して 描画してみます.
  • reset
  • set polar
  • plot sin(3\(*\)t)

今度は,縦軸と横軸が動径 \(\small r\) の最大幅に設定されて 横長の画面に表示されます.この幅は,「plot」される \(\small r\) の値に応じて自動設定されます. 極座標系にしても, 画面の横軸と縦軸の範囲はxrange, yrangeにより設定することができます. 縦横の目盛りの間隔が揃うように, たとえば縦軸の範囲が横軸の60%になるように設定します.
  • set xrange [-2:2]
  • set yrange [-1.2:1.2]
  • set grid
  • replot 1

関数の式はすでに入力済みなので,「replot」だけでグラフが再描画されますが, 参考までに「replot 1」により単位円 \(\small r=1\) を重ね描きしています. 横軸と縦軸の目盛りはデフォルトで表示されます. この目盛りに不満があるときは「set xtics」などを利用して変更します. 極座標系で「set grid」というコマンドを実行すると, 目盛りのついた箇所での同心円と極からの半直線が描画されます. \(\small r\) の目盛りは「set rtics」により変更することができます. 「set grid」の指定がなされていると, 目盛りを細かくすると同心円も細かくなります.

なお,xrange, yrange の指定は \(r\) の値よりも優先されることに留意してください. たとえば,上記の状態で「plot 3\(*\)sin(3\(*\)t)」を実行すると, この画面に納まる部分だけが表示され,三葉線の全体像は表示されません(図は略).


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

点を線で繋ぐ
関数のグラフではなく,指定された点を線分で繋いでいくことで 得られるグラフもあります. 複数の点を線分で繋ぐには,「plot "-" with lines」 とします.そうすると,点の座標を入力することが求められるので, コンマ区切り(,)ではなく,半角の空白区切りで座標を入力します. 空白行を入力すると,次に入力する点が新たな始点になります. 入力を終えるときは「e」を入力します. 下記では,単純な三角形を,赤の点線で, ちょっと太めで描画しています. lw は「line width」,ltは「line type」の略記です. 「with lines」は,「w l」で済ませることもできます.
  • plot "-" with lines lw 3 lt 7
    input data ('e',ends) > 0 0
    input data ('e',ends) > 4 0
    input data ('e',ends) > 2 4
    input data ('e',ends) > 0 0
    input data ('e',ends) > e

点の数が増えるときは, あらかじめ(空白区切りの)座標を書き込んだファイルを 用意しておいて,それを読み取る形にすることもできます. 上記のデータを「line_seg1.txt」, 直線 x=2 で反転させたデータを 「line_seg2.txt」とすると, 「replot」を利用して重ね書きすることができます. 下記では,モバイルフレンドリーのために改行して入力しています. 行の最後に「\」を打ち込んで「Return(Enter)」を押すと改行しながら入力することが できます.
  • plot "line_seg1.txt" \
    > w l lw 3 lt 7
  • replot "line_seg2.txt" \
    > w l lw 3 dt 3 lt 2

同様にして複数の図形を1つのファイルだけで描画するには, 図形の区切りの箇所に空白行を挿入します. 下記は,「line_seg1.txt」 と 「line_seg2.txt」 を 1つのファイル「line_seg3.txt」 にまとめて描画したものです.
  • plot "line_seg3.txt" \
    > w l lw 3 lt 7

ただし,複数の図形の線種や色などを変えることはできません. それらを変えるには,面倒でもファイルを分けて「replot」するしかないと 思われます.

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

離散データのグラフ
実験等で得られる離散的な数値データをグラフ化することもできます. 数値データはデフォルトでは空白で区切られますが, 「set datafile separator ","」とすることでコンマ区切りの データも読み込むことができます.

試みに, ランキングサイトをもとに, 平成27年の国勢調査による県庁所在地47都市の人口を図示してみましょう. 最初に,このサイトのデータをもとに, コンマ区切りの データを作成します. 各行は「順位, 人口,人口密度」で, 人口の単位は「千人」,人口密度は1平方キロメートルあたりの人数(整数)です. デフォルトでは, データファイルは「My Documents」にあることが想定されているので, 必要に応じてデータファイルを置くフォルダーを変更しておきます. トップメニューの「ファイル(F)」から 「ディレクトリーの移動」を利用してください. データが用意できたら,下記によりグラフが描画されます. 空白区切りのデータでは,最初のコマンドは不要です.

  • set datafile separator ","
  • plot "jinkou.dat"

使用しているデータファイルは3列あります. デフォルトでは1列目を \(\small x\) 軸,2列目を \(\small y\) 軸のデータとして, 記号「+」が置かれて描画されます. 列を指定するコマンド「using 1:2」が省略されているのです. 2列目と3列目の関係を描画するときは「using 2:3」とします. 描画範囲は自動的に設定されます. これを見ると,いろいろと気になる箇所があります.
  • [1] プロットする記号を変更したい。
  • [2] 線で繋ぎたい。
  • [3] 棒グラフで描画したい。
  • [4] 複数の列データを描画したい。
  • [5] 座標軸を書き入れたい。
  • [6] 別な曲線も書き込みたい。
  • [7] 凡例を変更したい。
  • [8] 縦軸を対数軸にしたい。
  • [9] 離散データ参照サイト
  • スプライン曲線やベジェー曲線を引くこともできますが, 専門的過ぎるのでここでは触れません. 詳しくはマニュアル の「84.3.6節 Smooth」の箇所を参照してください. 以下では,[1]〜[8]について順にみていきましょう。

    1. プロット記号
    離散データは飛び飛びの値になりますが,それをいろいろな記号で 表示させることができます. デフォルトでは「with points」というオプション指定が省略されて, 上図のように描画されます. 付す記号は「pointtype」を指定することで変更することができます. 記号は,下記の番号で指定します.

    番号 記号 番号 記号
    1   8
    2×   9
    3   10
    4   11
    5   12
    6   13
    7  

    たとえば,黒丸「●」を指定するには次のようにします. オプション部分のスペルが長いので,単に「pt 7」とすることもできます. 必ず「plot」で指定します.「replot」ではエラーとなります.
    • plot "jinkou.dat" pointtype 7


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

    2. 線で繋いで描画する
    離散データは,「plot "ファイル名"」とすると 「with points」というオプション指定が省略されて描画されます. 隣り合うデータを線で繋いで描画するには 「with line」とします.頭文字だけとって「w l」でもかまいません. ここも「plot」で描画します.

    • plot "jinkou.dat" with line

    記号を付して線で繋ぎたいときは,「with linespoint」とします. 略して「w lp」でもかまいません.例えば,白丸「○」を付して 線で繋ぐには, 「plot "ファイル名" with linespoint pointtype 6」とします. 簡略化して 「plot "ファイル名" w lp pt 6」とすることもできます(図は略).
    なお,線の色は「linetype」により, 線の種類は「dashtype」により指定することができます.


    3. 棒グラフで描画する
    離散データを棒グラフで描画するには「with boxes」を指定します. この場合,列の指定をする「using」を省略することはできません. 下図では,「notitle」を指定して凡例の表示を抑制しています. 入力する式が長くなりそうなときは, 改行しながら入力することもできます. コマンドの後に半角の空白をおいて「\」の後に「Enter」を 押すことで改行されます.空白を入れないと 次の行のコマンドと繋がってしまうので,必ず空白を入れてください.

    • plot "jinkou.dat" \
        using 1:2 with boxes notitle


    4. 複数の列データを描画する
    3列以上のデータファイルでは, 複数の列データを描画することもできます. たとえば,1列目を横軸にとり, 2列目は棒グラフにして,3列目は線で繋いで描画する場合は, 次のようにファイルに対する指定を「,」で区切って指定します.

    以下では,スマホでの表示の関係で, 「 \」を入れてできるだけ改行しながら入力しています. 実際には,1行で続けて入力してください.

    • plot "jinkou.dat" \
        using 1:2 with boxes \
        title "人口", \
        "jinkou.dat" \
        using 1:3 with linespoint \
        title "人口密度"


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

    5. 座標軸を書き入れる
    すでに枠部分が座標軸になっていますが, 明示的に書き入れるには「set zeroaxis」を指定してから 描画範囲を変更します. 範囲指定は「set」を用いて「set xrange [-5:50]」などと してもよいですが, 「plot」とファイル名の間で指定するのが簡単です. なお,以下の指定のオプション部分は,簡略化して 「w lp pt 7 notitle」とすることもできます.

    • set zeroaxis
    • plot [-5:50] [-500:10000] \
        "jinkou.dat" \
        with linespoint pointtype 7 notitle


    6. 別な曲線を書き入れる
    曲線を書き入れるには, 「replot」で指定します.

    • plot [] [0:10000] \
        "jinkou.dat" \
        using 1:2 with boxes \
        title "人口"
    • replot 10000/x

    上図では,人口を棒グラフで描画して曲線 \(\small y=10000/x\) と 重ねています.わりと上手く重なっているのが分かります. 最初の [] [0:10000] では,\(\small x\) 軸の範囲は [] として gnuplot に任せて,\(\small y\) 軸の範囲だけを指定しています. 棒グラフ自体は範囲指定を行わなくても描画されますが, 同じ範囲に \(\small y=10000/x\) を描画するには, その関数が \(\small x=0\) では定義されないため, あらかじめ範囲を指定しておく必要があります.

    県庁所在地の人口はいろいろなはずですが,順番に並べると \(\small 10000/x\) という分布に従っていることが分かります. これは \(\small (人口)\times(順位)=10000\) という関係にあることを 示しています.このように,順位との積が一定値であるような関係は, 「ジップ(Zipf)の法則」と呼ばれています. また,一般に \(\small C/x^a\) のようなベキ関数で表される分布は「ベキ分布」 と呼ばれ,世の中のマクロからミクロの世界まで, さらには人間のかかわるいろいろな場面で頻繁に現れてきます. 「ベキ分布:リンク集」も参照してください。


    7. 凡例を変更する
    凡例については,すでに示しているように「title」を利用します. 「notitle」とすると凡例は表示されません. 詳しくは「凡例の調整」を参照してください.


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

    8. 座標軸を対数軸にする
    使用した人口のデータでは,最初は大きな桁数の値になりますが, その後の大部分は小さな桁数の値が途切れることなくダラダラと 続いていきます.このようなときは,軸を(常用)対数の値に取ると グラフが見やすくなります. 特に,\(\small y=C/x^a\) という関係にあるときは, \(\small \log{y}=\log{C}-a\log{x}\) となるので, 2つの座標軸を対数軸にとったグラフは右下がりの直線になります.

    周知のように,常用対数は,いろいろな値(\(\small M\))を \(\small M=10^a\) の形で表して,指数部分の \(\small a\) の値で 考えようとするものです.天文学的な \(\small 10^{20}\) のような大きな値や, ミクロの世界の \(\small 10^{-10}\) のような小さな値も, 対数をとると \(\small -10\sim 20\) の取り扱いやすい値に変換することができます. 座標軸を対数軸にするには「set log」を用います. 解除するには「unset log」です.

    • set log x
    • set log y
    • plot [1:50] [100:10000] \
        "jinkou.dat" \
        with linespoint pointtype 7 \
        title "人口"
    • replot 10000/x

    対数の値は \(\small 0\) では定義されないので, それを含まない区間を指定しました. \(\small 100=10^2, 1000=10^3, 10000=10^4\) なので, 対数軸の実際の目盛りは \(\small 2\sim 4\) の範囲となります. \(\small y\) 軸の目盛りを \(\small 10^a\) の形で表示させることもできます. 「set format y "10^{%L}"」とします. 元に戻すには「unset format」とします. 目盛りに関する詳細はこちらも参照してください.

    • set format y "10^{%L}"
    • replot


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

    9. 離散データに関する参照サイト

    • データファイルの数値のプロット
      2次元や3次元のデータが与えられたときのプロットについて解説されています.
    • gnuplotを使って折れ線グラフを描く
      折れ線グラフの作成方法について簡潔に説明されています. グラフのファイル保存では「postscript」が使用されていますが、 TeXでの利用を考えるときは「グラフ画面の保存」を参照してください。
    • gnuplotを使ったグラフ作成
      実験等で得られる離散データの処理の仕方について詳しく解説されています. 「1. 関数を描画」の冒頭に登録されているサンプルデータ「dummy.dat」を ダウンロードして,書かれているとおりに試してみるとよいでしょう.
    • gnuplotの使い方
      琉球大学工学部電気電子工学科の学生向けの, gnuplotに関する151ページの解説書です. 「第9章 データファイルのプロット」(p106)を参照してください. 非常に詳細に解説されています.

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

    ヒストグラムの描画

    データファイル
    離散データでは,ファイルに書き込まれた順にグラフが描画されていきます. 値が激しく変動するデータファイルから, 度数分布表を作成してヒストグラムを描画させることもできます. ここでは,次のサンプルファイル(random_smp.csv)を利用します. Maximaの確率分布に関するコマンドを利用して, 二項分布,一様分布,正規分布,ベキ分布(パレート分布)にしたがう乱数を, それぞれ1000個ずつ発生させたものです. gnuplotのデータは列データである必要があるので,このファイルは要するに \(\small (1000, 5)\)型の行列データです.

    乱数のサンプルファイル
    1列目:1から1000までの通し番号.
    2列目:サイコロを10回振って特定の目が出た回数を表す二項乱数.
    3列目:区間 \(\small [0,1]\) における一様乱数.
    4列目:平均50,標準偏差10の正規分布にしたがう乱数.
    5列目:ベキ分布 \(\small 1/x^2~(x\geq 1)\) にしたがう乱数.

    連続データの場合
    gnuplotにより,値の大小がばらばらのデータから ヒストグラムを作成して描画する方法を解説しているサイトは, あまりありません.以下の解説は, 下記を参照して作成したものです.

    では,用意したデータファイルの第4列「正規分布N(50,10)」を利用して, さっそくヒストグラムを描画してみましょう. 最初に,サンプルファイルをダウンロードして, 利用するフォルダーに置いておきます. 現在のフォルダーの確認やフォルダーの変更は, 「ファイル(F)」の箇所で行うことができます.フォルダー間のファイルの移動は, エクスプローラーなどを利用してください. 描画の手順は,下記の通りです.

    1. データの形式を指定する.
    2. ヒストグラムの柱(bin)の幅(binwidth)を指定する.
    3. 階級値の値の計算式を指定する.
    4. ヒストグラムを描画(plot)する.
    • set datafile separator ","
    • binwidth=5
    • bin(x,width)= \
         width\(\small *\)floor(x/width)+width/2.0
    • plot "random_smp.csv" \
        using (bin($4,binwidth)):(1.0) \
        smooth frequency with boxes \
        title "N(50,10)"

    空白区切りのデータファイルの場合は,最初の1行目の指定は不要です. コンマ区切りのデータでは,この指定をしないとエラーになるので注意してください. bin(x,width)の式は,階級値の値を計算していると思われます. 4行目では,コマンドが長くなりそうなので,「\」の後で「Enter」 を押して改行しながら入力しています.
    • 「using」の箇所で, 使用するデータ列(4列目)を階級幅で区切ることを指定しています.
    • 「:(1.0)」の部分はデータ1個あたりを「1.0」とすることを 指定しています.これにより,縦軸は単純な度数になります.
    • 「smooth」の後には幾つかのオプションがあり,ここでは「frequency」を 指定しています.単純な度数分布が描かれます. 累積度数分布とするには「cumulative」とします. また,縦軸の範囲を \(\small [0,1]\) の範囲とした度数分布は 「fnormal」(これが通常のヒストグラム),累積分布は「cnormal」とします.
    • 「with boxes」とすると柱で描画されます. 折れ線グラフにするには「with lines」とし, 点も配置して線で結ぶには「with linespoints」とします.
    下記は,「fnormal」(ヒストグラム)と「cnormal」(相対累積度数)のグラフを 同時に描画したものです. 「,」で区切ることで(4行目),同じデータ列を2つの異なるスタイルで描画しています. なお,以下の「$」は全角ですが,実際には半角で入力してください.
    • plot "random_smp.csv" \
        using (bin($4,binwidth)):(1.0) \
        smooth fnormal with boxes \
        title "N(50,10)", \
        "random_smp.csv" \
        using (bin($4,binwidth)):(1.0) \
        smooth cnormal with lines \
        notitle


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

    度数分布表の作成
    ヒストグラムを描画することはできても, 各階級の度数まではグラフに表示されません. gnuplotには,階級ごとの度数分布表を出力させる機能があります.
    • set table "histogram.txt"
    • plot "random_smp.csv" \
        using (bin($4,binwidth)):(1.0) \
        smooth frequency with boxes \
        title "N(50,10)"
    • unset table
    1行目は,テーブル出力することとファイル名を指定しています. 2行目でプロットしますが,テーブル出力を指定しているので グラフは表示されません. 3行目でテーブル出力を取り消すことでファイルが閉じられます. これを行わないと,プロットするごとに 指定したファイルにどんどん書き込まれていきます. 第4列をデータ列とした場合は下記の内容が書き込まれました. 1列目が階級値,2列目が度数です. 「fnormal」を指定すると,ヒストグラムの場合の値が書き込まれます. つまり,「(度数)/(階級幅×全度数)」の値が描き込まれます. データファイルをコンマ区切りにするには, 「set table "ファイル名" separator comma」にすればよいと マニュアルには書かれているのですが,試してみると, 何故かコンマ区切りの出力は得られず下記と同じ内容になりました.
    # Curve 0 of 1, 13 points
    # Curve title: "N(50,10)"
    # x y xlow xhigh type
    22.5 3 22.5 22.5 i
    27.5 20 27.5 27.5 i
    32.5 39 32.5 32.5 i
    37.5 93 37.5 37.5 i
    42.5 146 42.5 42.5 i
    47.5 187 47.5 47.5 i
    52.5 184 52.5 52.5 i
    57.5 160 57.5 57.5 i
    62.5 96 62.5 62.5 i
    67.5 54 67.5 67.5 i
    72.5 12 72.5 72.5 i
    77.5 6 77.5 77.5 i

    ▲戻る(トップメニューマップ)
    離散データの場合
    離散データの場合も同様です.以下は, 使用しているデータファイルの2列目にある二項分布Bin(10,1/6)を 利用したものです.

    まず,1行目で階級幅を1に変更します. 2行目では,階級値の計算式を変更して整数値にしています. その上で,3行目で柱(boxes)と折れ線(lines)による描画をしています. 以下の「$」は,実際には半角で入力してください.

    • binwidth=1
    • bin(x,width) \
        =width\(\small *\)floor(x/width)
    • plot "random_smp.csv" \
        using (bin($2,binwidth)):(1.0) \
        smooth frequency with boxes \
        title "Bin(10,1/6)" ,\
        "random_smp.csv" \
        using (bin($2,binwidth)):(1.0) \
        smooth frequency with lines \
        notitle


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

    不均一な階級幅
    「binwidth」で階級幅を指定すると, 基本的には指定した階級幅で区分されます. ただし,値が大きく飛んでいて度数の存在しない階級が存在するようなときは, 幾つかの階級が自動的にまとめられて描画されるようです.

    そのような値が生じる場合として「ベキ分布(パレート分布)」があります. 使用しているデータファイルの5列目は,確率密度関数が \(\small 1/x^2~(x\geq 1)\) で表されるベキ分布にしたがう乱数です.簡単な計算から分かるように, この確率分布は平均も分散も存在しません(参照). そのような確率分布にしたがう乱数を発生させると, 値の変動はすさまじいものになります.

    • plot "random_smp.csv" \
         using 1:4 \
         with lines title "N(50,10)"

    上図は,比較のために正規分布N(50,10)にしたがう乱数の値1000個を 発生順に線で結んで描画したものです. 平均50,標準偏差10の分布にしたがう乱数なので, 50の前後に分布して変動幅もあるレベル内に収まっています.

    それに対して,ベキ分布にしたがう乱数は,値の飛び幅が半端ではありません. 下図は,縦軸を対数軸に取って描画したものです.大部分は10以内になっていますが, 100を超える場合がかなりあり,1000に近い値になることもあります. 何度か乱数を発生させると,1000を超える値が発生する場合もあります.

    • set log y
    • plot "random_smp.csv" \
         using 1:5 \
         with lines title "1/x^2"

    このようなベキ分布にしたがう乱数のヒストグラムを作成してみましょう.
    • binwidth=1
    • bin(x,width)=width\(\small *\)floor(x/width) \
         +width/2.0
    • set xrange [1:20]
    • plot "random_smp.csv" \
        using (bin($5,binwidth)):(1.0) \
        smooth frequency width boxes \
        title "1/x^2"

    乱数の最大値が1000近い値まであるので, 上図では区間を \(\small [1,20]\) にして描画しています. ここでは,階級幅を「1」としています. 「set table」を指定して度数分布を出力させると, 度数があるところでは1刻みになりますが, 度数のない箇所は階級がまとめられているのが分かります. 100以上の箇所は,次のようになっています.
    100.5 1 100.5 100.5 i
    123.5 1 123.5 123.5 i
    132.5 1 132.5 132.5 i
    149.5 1 149.5 149.5 i
    174.5 1 174.5 174.5 i
    189.5 1 189.5 189.5 i
    200.5 1 200.5 200.5 i
    244.5 1 244.5 244.5 i
    246.5 1 246.5 246.5 i
    307.5 1 307.5 307.5 i
    465.5 1 465.5 465.5 i
    749.5 1 749.5 749.5 i
    下図は,範囲を \(\small 0\leq x\leq 800, 0\leq y\leq 10\) にして描画したものです.\(\small x\geq 27\) では1個だけの度数が 800近くまで続いています.

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

    copyright