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 紀伊國屋電子版読書メーター

■3次元グラフの描画

2変数関数のグラフ
2変数関数 \(\small z=f(x,y)\) のグラフを描画するコマンドは「splot」です. 一様双曲面 \(\small z=x^2-y^2\) は次のように表示されます. 目盛りの間隔は自動で設定されています. このグラフに対して,2次元グラフの場合と同様に様々な設定をすることができます.
  • splot x\(**\)2\(-\)y\(**\)2


  1. 座標軸の範囲・目盛り・ラベル
    座標軸の範囲は xrange, yrange, zrange により, 目盛りは xtics, ytics, ztics により, そして,軸のラベルは xlabel, ylabel, zlabel により設定することができます. それらの指定はその後も引き継がれます. その指定を削除するには,たとえば「unset xtics」などとします. 他も同様です.
    たとえば,\(\small -4\le x\le 4,~ -4\le y\le 4\) とすると, この領域のグラフが表示されるように \(\small z\) 軸の範囲は自動設定されます. 再描画するコマンドは「replot」で,2次元グラフと同一です.

    • set xragne [-4:4]
    • set yrange [-4:4]
    • set xlabel 'x'
    • set ylabel 'y'
    • set zlabel 'z'
    • replot

    範囲の設定は,次のようにグラフ描画の「splot」と一緒に行うこともできます. 以下を試してみるときは,「unset」を用いて, 「set」による指定を初期化してから実行してください.

    splot [-4:4] g(x,y)
      \(\small y, z\) の範囲は自動設定
    splot [-4:4] [-4:4] g(x,y)
      \(\small z\) の範囲は自動設定
    splot [] [-4:4] g(x,y)
      \(\small x, z\) の範囲は自動設定
    splot [] [] [-20:20] g(x,y)
      \(\small x, y\) の範囲は自動設定

    \(\small z\) 軸の下方の空白部分を取ろうとして「set zrange [-20:20]」として 「replot」しても,グラフは変わりません(図は略). この空白部分を取るには次のようにします.

    • set ticslevel 0
    • replot

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

  1. 色・線種・太さ・メッシュの間隔
    2変数関数の普通のグラフは曲面になり, デフォルトでは網目模様(メッシュ)で表示されます. その網目の曲線の色・線種・太さは, 2次元グラフのときと同じ書式で変更することができます. 色は「linetype」,線種は「dashtype」,太さは「linewidth」です. それぞれ,lt, dt, lwで簡略化することができます. 下図は,水色のちょっと太めの点線で描画したものです.

    • f(x,y)=x\(**\)2\(-\)y\(**\)2
    • set zrange [-20:20]
    • splot f(x,y) lt 3 dt 3 lw 3

    メッシュの間隔は「set isosample」により調整することができます. 「set iso」でもかまいません. デフォルトでは「set isosample 10,10」で設定されており, \(\small x\) 軸と \(\small y\) 軸がそれぞれ10本の格子線で区切られています. 同じ本数でよいときは「set isosample 10」とすることもできます. 下図は \(\small x\) 軸を50本,\(\small y\) 軸を30本として,本数を変えた場合です.

    • set isosample 50, 30
    • splot f(x,y)

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

  1. 視点の方向
    描画された曲面は,マウスポインターを当ててグリグリすると 任意の角度に回転させることができます. デフォルトでは,視点は \(\small x\)軸を60度,\(\small z\)軸を30度回転した方向に 取られています. この視点は「set view」により変更することができます. 下図は,\(\small x\)軸を30度,\(\small z\)軸を60度回転した場合の図です. 角度は0〜360度の間で指定します. グリグリ回転したときの視点を知るには「show view」とします. 設定した視点をデフォルトに戻すのは「unset view」です.

    なお,下図の画面は回転できません.gnuplotの画面で回転させてください.

    • set view 30, 60
    • splot f(x,y)

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

  1. 隠線処理
    曲面をいろいろ回転させて見ると分かりますが, このメッシュは素通しになっているので裏側から表側が見えます. このとき,「隠線処理」を行うと, 視点の方向から陰になっている部分は見えないようにすることができます. 隠線処理を行うには「set hidden3d」,または簡略化して「set hid」とします. 表側と裏側が別な色で表示されます.
    下図は,視点とメッシュをデフォルトに戻して描画したものです.

    • unset view
    • unset isosample
    • set hidden3d
    • splot f(x,y)

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

  1. 等高線
    曲面が描画できても,\(\small z\) 軸方向が分かりにくい場合があります. そのようなときは等高線も描画するようにすると高さの感覚を捉えやすくなります. 等高線も描画するようにするコマンドは「set contour」です. 下図は,\(\small g(x,y)=x^2+y^2\) のグラフです.\(\small z\ge 0\) なので, \(\small z\) 軸の範囲を \(\small 0\le z\le 40\) にしています. メッシュの細かさは「isosample 20」としました. \(\small x, y\) の範囲と隠線処理(hidden3d)は前の設定が引き継がれています.

    • g(x,y)=x\(**\)2\(+\)y\(**\)2
    • set isosample 20
    • set contour
    • set zrange [0:40]
    • splot g(x,y)

    等高線が描かれて色のレベルが凡例の箇所に表示されます. 「1.」の箇所で設定した「set ticslevel 0」の指定が 引き継がれているので \(\small xy\) 平面に表示されていますが, この指定がなされていないと底面に描かれます. この同心円を曲面上に描くには「set contour surface」, 底面と曲面の両方に描かれるようにするには「set contour both」とします. 等高線の描画を取り消すには「unset contour」とします. 下図は,両方に描かれるようにしています.

    • set contour both
    • replot

    等高線の間隔は「cntrparam」により制御されています. 本数を増やすには「set cntrparam levels N」とします. \(\small N\) には0〜10の数を入れます. 「set cntrp le N」と略記することもできます. ただし,必ずしも指定した数の等高線になるとは限りません. 下図は,10を指定していますが,表示される等高線の本数は6本です.

    • set cntrparam levels 10
    • replot

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

  1. 曲面の色づけ
    曲面全体を色づけするには「splot f(x) with pm3d」とします. 設定取り消しは「unset pm3d」です. 下図は,等高線の描画をやめて描いた場合です.

    • unset contour
    • splot g(x,y) with pm3d

    この色づけを底面にだけ行うには, 「set pm3d at b」とします.

    • set pm3d at b
    • splot g(x,y)

    底面の色づけ部分だけを取り出すには, 「set pm3d map」とします.

    • set pm3d map
    • splot g(x,y)

    色づけの調整は,ある程度上級レベルである必要があります. 詳細は下記を参照してください.

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

媒介変数表示のグラフ
関数が \(\small z=f(x,y)\) と表示されていると, 一価関数のグラフしか描画することができませんが, 媒介変数表示にすると多彩な曲面を描画することができます. 媒介変数を利用するには「set parametric」とします. 1変数関数の媒介変数は \(\small t\) ですが, 2変数関数では \(\small u, v\) を使用します. \(\small x=f(u,v), y=g(u,v), z=h(u,v)\) の式を定義すると, 「splot [a:b] [c:d] f(u,v), g(u,v), h(u,v)」によりグラフが描画されます. [a:b],[c:d] はそれぞれ \(\small u, v\) の範囲です. その範囲を urange, vrange で設定済みのときは, 単に「splot f(u,v), g(u,v), h(u,v)」だけでかまいません.

以下では,下記の設定がなされているものとします. 「reset」して最初から入力するか,不足分を入力するか等により調整してください.

set xrange [-4:4]
set yrange [-4:4]
set zrange [0:40]
set xtics 1
set ytics 1
set xlabel 'x'
set ylabel 'y'
set zlabel 'z'
set ticslevel 0
set isosample 20
set hidden3d
f(x,y)=x\(**\)2\(+\)y\(**\)2


  1. \(\small z=f(x,y)\) のグラフ
    関数 \(\small z=f(x,y)\) は,\(x=u, y=v, z=f(u,v)\) と考えると, 媒介変数表示となります. 下記は,\(\small f(x,y)=x^2+y^2\) が定義済みとした場合のグラフです. \(\small u, v\) のデフォルトの範囲は,\(\small -5\le u,v\le 5\) ですが, \(\small x,y\) の範囲設定の方が優先されるので, \(\small -4\le x,y\le 4\) の範囲内のグラフが表示されています.

    • splot u, v, f(u,v)

    当然ながら \(\small f(x,y)=x^2+y^2\) のグラフと同一ですが, 凡例には「u, v, f(u,v)」と書かれていて媒介変数のモードで 描画されていることを示しています.

    \(\small z=f(x,y)\) のグラフを媒介変数で描画しておくと, \(\small z=\cdots\) としては表現できないような関数のグラフとの 交線をみることができます.たとえば,\(\small yz\) 平面は \(\small x=0, y=u, z=v\) により表されます.この平面は \(\small z=\cdots\) の式では表せません.この座標平面を重ね描きするには次のようにします. 単に「replot 0,u,v」とすると,\(\small v\) は \(\small -5\le v\le 5\) の部分しか描かれないので,大きめにして \(\small v*10\) としています. このグラフにマウスポインターをあてて, (gnuplotの画面で)回転させてみるとよいでしょう.

    • replot 0, u, v\(*\)10

    このように,媒介変数表示を利用して曲面の交線を見るときは, \(\small u, v\) の範囲を指定するのではなく, 関数の \(u, v\) に関する部分の式を調整して,指定済みの \(\small x, y, z\) の範囲を越えるようにするのがよいようです.

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

  1. 円柱座標による表示
    円柱座標は,平面上の曲線を平面に垂直な方向に平行移動してできる曲面を 表すときによく利用されます. たとえば,\(\small xy\) 平面の半径 \(\small r\) の円上の点は \(\small x=r\cos\theta,~ y=r\sin\theta\) で表され, 極座標では \(\small (r, \theta)\) で表されます. その円を \(\small z\) 軸方向に平行移動してできる円柱は, \( \small x=r\cos\theta,~ y=r\sin\theta,~z=t\) により表されるので, この点を \(\small (r, \theta, t)\) で表すのが円柱座標です. gnuplot では,この円柱の \(\small \theta,~t\) を 媒介変数 \(\small u, v\) に置きかえて, 媒介変数表示として描くことができます. たとえば,半径2の円柱は円柱座標では \(\small (2, u, v)\) により表されますが, gnuplot では次により描画されます.

    • set zrange [-4:4]
    • set urange [-pi:pi]
    • set vrange [-4:4]
    • splot 2\(*\)cos(u), 2\(*\)sin(u), v

    この円柱に,同じ半径を持ち中心軸が \(\small y\)軸の円柱を交差させて みましょう.

    • replot 2\(*\)cos(u), v, 2\(*\)sin(u)

    グラフ画面では縦方向に収縮して表示されるので, 縦方向にちょっと伸ばしてみます. この2つの円柱の共通部分の体積を求める問題は, 重積分の応用の定番問題です. 内部の共通部分については立体図形を参照して下さい.

    • set size 0.7, 1
    • replot

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

  1. 球座標による表示
    球座標は平面の極座標の空間版です. 球座標では,空間内の点Pと原点Oとを結ぶ線分OPを考えて, 線分OPの長さ,線分OPの \(\small x\) 軸からの角度,そして \(\small z\) 軸からの角度により点Pを表します.

    \(\small z\) 軸からの角度の計り方は教科書により異なります. gnuplotの球座標での計り方は こちらを 参照してください. $\small u$ は $\small xy$ 平面で $\small x$ 軸からの角, $\small v$ は $z$ 軸からではなく $\small xy$ 平面からの角になり, 経度と緯度の関係になります. デフォルトでの角度の単位はラジアンです. 度数法に変更するには「set angle degree」とします. ここでは,度数法に変更して,\(\small u, v\) の範囲も 0〜360にしておきます.

    球座標で半径 \(\small a\) の球面は, \(\small (a, u, v)\) で表されます. これを直交座標に直すと,\(\small u, v\) を媒介変数として \(\small x=a\cos{u}\cos{v}\),\(\small y=a\sin{u}\cos{v}\), \(\small z=a\sin{v}\) により表されるので, たとえば円柱座標では \(\small (2, u, v)\) で表される半径2の球面は, gnuplotでは次により描画されます. 前項で画面サイズを設定しているときは, 「unset size」としてデフォルトに戻しておきます.

    • unset size
    • set angle degree
    • set urange [0:360]
    • set vrange [0:360]
    • splot 2\(*\)cos(u)\(*\)cos(v),
        2\(*\)sin(u)\(*\)cos(v), 2\(*\)sin(v)

    \(\small z\) 軸方向がつぶれて表示されるので, 下記ではグラフ画面の縦方向を伸ばしています.

    • set size 0.7, 1
    • replot

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

  1. いろいろな曲面
    ドーナツ状の曲面はトーラスと呼ばれます. トーラスは,たとえば次のような式で描かれます. 個々の式が長くなるときは,あらかじめ定義しておきます. ここでは,角度は弧度法に戻して,メッシュを細かくしています. また,前項の「set size 0.7, 1」が引き継がれています.

    • unset angle
    • set
      urange [0:2\(*\)pi]
    • set
      vrange [0:2\(*\)pi]
    • set isosample 60
    • x(u,v)=(3+cos(v))\(*\)cos(u)
    • y(u,v)=(3+cos(v))\(*\)sin(u)
    • z(u,v)=sin(v)
    • splot x(u,v),y(u,v),z(u,v)

    このトーラスを縦にするには \(\small y, z\) を交換します. さらに,\(\small x\) 軸方向に平行移動すると 次の図が得られます.

    • set xrange [-4:8]
    • replot x(u,v)+3,z(u,v),y(u,v)

    有名なメビウスの帯を描くこともできます. クラインの壺も試してみるとよいでしょう. 方程式はWeb検索してください.

    • x(u,v)=
      cos(2\(*\)u)\(*\)(v\(*\)cos(u)+2)
    • y(u,v)=
      sin(2\(*\)u)\(*\)(v\(*\)cos(u)+2)
    • z(u,v)=v\(*\)sin(u)
    • set urange [0:pi]
    • set vrange [-1:1]
    • set xrange [-4:4]
    • splot x(u,v),y(u,v),z(u,v)

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

  1. 立体図形
    今度は,幾つかの曲面で囲まれた立体を描画してみましょう. たとえば,平面 $\small z=2-x$ の下で $\small xy$ 平面よりも上の部分を, 円柱面 $\small x^2+y^2=4$ で切り取ったときの図形を考えます. この円柱面は $\small z=\cdots$ の形では表せないので媒介変数表示で描画します. 初期設定は,下記のようにします.

    • set xrange [-4:4]
    • set yrange [-4:4]
    • set zrange [0:4]
    • set parametric
    • set urange [-pi:pi]
    • set vrange [-pi:pi]
    • set ticslevel 0
    • unset border
    • set arrow 1 from 0,0,0 to 4,0,0
    • set arrow 2 from 0,0,0 to 0,4,0
    • set arrow 3 from 0,0,0 to 0,0,4
    • set hidden3d
    • set isosample 30

    この状況で平面と円柱面を描画すると,次のようになります. なお,u の範囲は [-pi:pi] で設定しているので, 高さが 4 になるように調整しています. z の範囲は [0:4] にしているので,負の側は描画されません.
    • splot u,v,2-u
    • replot 2$*$cos(v),2$*$sin(v),u$*$4/pi

    この図で何となく分からないわけではありませんが, 隠線処理により肝心な部分が隠れて見えません. そこで,円柱面の高さを $\small z=2-x$ により指定します. なお,vだけの式だと空間曲線になってしまうので, uを含む形で定義する必要があります. 平面の円柱面の内部にある部分が描画されるようにするには, 媒介変数で定義することになります.

    • splot 2$*$cos(v),2$*$sin(v),(2-2$*$cos(v))$*$u/pi
    • replot 2$*$cos(v)$*$u/pi,2$*$sin(v)$*$u/pi,2-2$*$cos(v)$*$u/pi

    同様にすると,同じ半径の円柱面が直角に交差したときの共通部分も 描画できます.下記は,$\small x^2+y^2=4, x^2+z^2=4$の共通部分です.
    • splot 2$*$cos(v), 2$*$sin(v), sqrt(4-4$*$cos(v)$**$2)$*$u/pi
    • replot 2$*$cos(v)$*$u/pi, 2$*$sin(v)$*$u/pi, sqrt(4-(2$*$cos(v)$*$u/pi)$**$2)

    下図は,平面$\small z=2-2x-y$と3つの座標平面との共通部分です. urangeは[0:1],vrangeは[0:2]としています.

    • splot u,v,2-2$*$u-v
    • replot 0,v,2-2$*$u-v
    • replot u,0,2-2$*$u-v
    • replot 0,0,2-2$*$u-v

    下図は,断面が見えるようにひっくり返した場合です。

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

空間曲線と断面曲線

  1. 空間における座標軸
    曲面描画では,曲面は外枠の内に描画され原点を通る座標軸は描画されません. 外枠を外して3つの座標軸を書き入れるには, 平面の場合と同様にして矢印を書き入れます. 空間座標のデフォルトは border表示であることから, \(\small xy\)平面は底面に配置されます. それが原点の位置に配置されるようにするには, 「ticslevel」の値で調整できます. \[\small {\rm ticslevel}=\dfrac{{\rm pos}-{\rm zmin}}{{\rm zmin}-{\rm zmax}}\] pos=0 の箇所に配置されるようにするには, \(\small z\) 軸の範囲が \(\small [-4, 4]\) の場合は \[\small {\rm ticslevel}=\dfrac{0-(-4)}{(-4)-4}=-0.5\] として指定します. 目盛りが,矢印で指定した軸上に表示されるようにするには, 「set xtics axis」などとします. 矢印の先端に \(\small x, y, z\) を付すこともできるはずなのですが, うまくいきませんでした. 下記の内容をあらかじめ, たとえば「3d_axis.g」 として作成しておけば, 「load "3d_axis.g"」とするだけでも下記のグラフが描画されます.

    • reset
    • unset border
    • set xrange [-4:4]
    • set yrange [-4:4]
    • set zrange [-4:4]
    • set arrow 1 from -4,0,0 to 4,0,0
    • set arrow 2 from 0,-4,0 to 0,4,0
    • set arrow 3 from 0,0,-4 to 0,0,4
    • set ticslevel -0.5
    • set xtics axis
    • set ytics axis
    • set ztics axis
    • set isosample 40
    • set hidden3d
    • f(x,y)=(x**2+y**2)/6.0-3
    • splot f(x,y)

  2. 空間における線分
    空間の中で,幾つかの点を繋いで線分を描くには, 平面の「plot」を「splot」に変えて, 平面の場合と同様にします. たとえば,原点を中心とする1辺が4の立方体の座標を 「dice.txt」として, 一筆書きできる箇所は連続して座標を記述し, 個々の辺を描画する箇所は空行を入れて記述します. すると,下記により立方体が描画されます. 座標設定は,前項目と同様です.

    • load "dice.txt" w l lw 3 lt 7

    ファイルを読み込むのではなく,一つ一つ入力しながら結ぶには, 「splot "-" w l lw 3 lt 7」として, その後に表示される「input data ('e',ends)>」 の後に点の座標を空白区切りで入力します.これは,平面の場合と同様です.

    前項目の設定を引き継いでいるので隠線処理がなされるべきですが, 面ではなく線で繋いでいるだけなので,隠線処理は効かないようです. \(\small xy\) 平面の端際に点々が表示されていますが, これは\(\small xy\) 平面であることを示すためのものと思われます. この点々が表示されないようにできるかどうかは分かりません.

  3. 空間曲線・断面曲線
    空間曲線を描画するには,媒介変数モードにした方が良いかと思います. それにより,弦巻線のような曲線も描画可能になります. 先に例示した放物面は,隠線処理をしないで描画すると裏側も重ね書きの ような感じで表示されます.

    • set parametirc
    • unset hidden3d
    • splot u,v,f(u,v)

    これを,幾つかの断面曲線を描画することで, それなりに曲面をイメージできるようにすることもできます. 全部同一色で指定しました. 繰返しの「do」を利用すると 良さそうに見えるのですが, 「do」の中に記述すると, 「replot」による重ね描きは効かないようです.

    • unset hidden3d
    • splot -4,v,f(-4,v) lt 8
    • replot 0,v,f(0,v) lt 8
    • replot 4,v,f(4,v) lt 8
    • replot u,-4,f(u,-4) lt 8
    • replot u,0,f(u,0) lt 8
    • replot u,4,f(u,4) lt 8

    なお,弦巻曲線は,たとえば下記のように描画されます.

    • splot cos(4*u), sin(4*u), u

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

陰関数で表された関数のグラフ
gnuplot には, \(\small f(x,y)=0,~f(x,y,z)=0\) のような陰関数で表された関数のグラフを 描画する機能はありません.ただし, 2次元グラフ \(\small f(x,y)=0\) は 曲面 \(\small z=f(x,y)\) と \(\small xy\) 平面との交線として描くことができ, それは等高線を描画することで実現できます.

たとえば,「8の字」曲線(レムニスケート)は, 極座標では \(\small r^2=2\cos{2\theta}\) と表されます. この曲線は極座標モード(set polar)にするか, または媒介変数(set parametric)を 利用すると描くことができますが, ここでは曲面の等高線として描画してみましょう.

この方程式は \(\small r^4=2r^2(\cos^2\theta-\sin^2\theta)\) であることから, 直交座標では \(\small (x^2+y^2)^2=2(x^2-y^2)\) と表されます. そこで,2変数関数 \(\small f(x,y)=(x^2+y^2)^2-2(x^2-y^2)\) を考えて, そのグラフと \(\small xy\) 平面との交線を考えることにします.

最初に,画面設定を次のようにしておきます. 「reset」して入力し直すか, または基礎設定を保存しておいてロードするとよいでしょう. 保存・ロードのやり方は次の項目を参照してください.

set xrange [-4:4]
set yrange [-4:4]
set zrange [-4:4]
set xtics 1
set ytics 1
set xlabel 'x'
set ylabel 'y'
set zlabel 'z'
set ticslevel 0
set isosample 60
set hidden3d

前述の関数を定義して座標平面との交線をみると,次のようになります. gnuplotの画面でグラフを回転させてみると 「8の字」形の交線を確認することができます. 交線の曲線がはっきり出るようにメッシュを細かくしました.

  • f(x,y)=
    (x\(**\)2+y\(**\)2)\(**\)2
    \(-\)2\(*\)(x\(**\)2\(-\)y\(**\)2)
  • set isosample 100
  • splot u,v,f(u,v)
  • replot u,v,0

次に,等高線が表示されるようにして, 本数を1本だけにして描画します.

  • set contour
  • set cntrparam levels 1
  • splot u,v,f(u,v)

底面に曲線が表示されます.\(\small xy\) 平面上の曲線としてみるには, 「unset surface」として等高線だけが表示されるようにして, さらに「set view 0,0」により視点を真上に設定します.

  • unset surface
  • set view 0,0
  • replot

凡例や \(\small z\) 軸のラベルが気になるときは, それら消去します(参照:凡例).

  • unset zlabel
  • set key off
  • replot

下図は,座標軸やグリッドを書き入れ, 範囲を狭めて縦横の目盛りの間隔が揃うようにしたものです.

  • set zeroaxis
  • set grid
  • set xrange [-3:3]
  • set yrange [-2:2]
  • set size 0.8,1
  • replot

3次元グラフ \(\small f(x,y,z)=0\)を描画する機能は gnuplotにはありません. ただし,関数のグラフ描画にgnuplotが使用されている 「Maxima」を利用すると, \(\small f(x,y,z)=0\) で表された曲面を描画する機能(draw3d)があります. 下図は,Maximaによる \(\small x^2+y^2-z^2=1\) と \(\small x^2+y^2+z^3=1\) のグラフです.

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

複素関数のグラフ

  1. 複素数の扱い
    gnuplotでは,複素数も扱うことができます. 複素数 \(\small a+bi\) は {a,b} で表されます. したがって,虚数単位は {0,1} で表されます. たとえば,\(\small z=1+2i, w=2-3i\) の場合は 次のようになります. \[\small z+w=3-i,~ zw=8+i,~\frac{w}{z}=-\frac45-\frac75i\] この計算をgnuplotで行うことができます.

    • I={0,1}
    • z=1+2\(\small *\)I
    • w=2-3\(\small *\)I
    • print z+w,z\(\small *\)w,w/z
      {3.0, -1.0} {8.0, 1.0} {-0.8, -1.4}

  2. 複素関数
    複素関数 \(\small w=f(z)\) は,\(\small z=x+yi\) とするとき \(\small w=u(x,y)+iv(x,y)\) の形で表せるので, 実部と虚部はそれぞれ2変数関数となります. たとえば,\(\small w=1/z\) の場合は \[\small \begin{align*} w&=\frac1{z}=\frac1{x+yi}\\ &=\frac{x-yi}{(x+yi)(x-yi)}\\ &=\frac{x}{x^2+y^2}-i\frac{y}{x^2+y^2} \end{align*}\] となるので,次のようになります. \[\small u=\frac{x}{x^2+y^2},\quad v=\frac{y}{x^2+y^2}\]

  3. 実部・虚部・絶対値のグラフ
    複素関数 \(\small w=f(z)\) のグラフを描くことはできませんが, その実部,虚部,絶対値は \(\small x, y\) の関数となるので, そのグラフを描くことができます.\(\small f(z)\) の 実部,虚部,絶対値は,それぞれ real(f(z)),imag(f(z)),そして abs(f(z)) で表されます. 下図は,\(\small w=1/z\) の実部のグラフです.

    • set xrange [-pi:pi]
    • set yrange [-pi:pi]
    • set zrange [-10:10]
    • set isosample 50,50
    • set ticslevel 0
    • f(x,y)=1/(x+y*{0,1})
    • splot real(f(x,y))

以上は,実部・虚部・絶対値のグラフですが, 他にもいろいろな描画方法があるようです. 詳しくは下記を参照してください.
▲戻る(トップメニューマップ)

■履歴とグラフのファイル保存

履歴ファイルの保存と読み込み
gnuplotでいろいろ試しても, 終了すると履歴は全て消えてしまいます.また, gnuplotを起動するごとに, 座標軸の表示や軸の範囲を設定するのは面倒です. そのようなときは,設定が共通と想定される状況を書き込んでおいて, その状況を保存しておきます. そして,gnuplotを起動するごとに保存した設定を読み込むようにするとよいでしょう.

ここで,共通設定を指定するために,いったんgnuplotを終了します. 「quit」か「exit」を入力するか,または画面の右上の「×」をクリックします. その上で,改めてgnuplotを起動して, たとえば下記を入力します.

  • set zeroaxis
  • set xrange [-5:5]
  • set yrange [-3:4]
  • set xlabel "x"
  • set ylabel "y"
  • set xtics 1
  • set ytics 1
  • set grid

ここでは,座標軸を表示し, 縦軸と横軸の目盛りの間隔が同じように見えるように 縦軸の長さを横軸の長さの70%にしています. 関数を具体的に定義した後は, そのグラフを見ながら範囲を適当に調整するとよいでしょう. この履歴を保存するには,

  • save 'filename.plt'

とします.「filename」の箇所は適当に決めてよいですが, 後で思い出せるような名前にしておいた方がよいでしょう. ファイル名は「'」か「"」で囲います. 単なるテキストファイルとして保存されます. 拡張子は「.plt」とする場合が多いようです. ファイルはMy Documentsに保存されます.

単なるテキストファイルとして保存されますが, 自分で入力した内容ばかりではなく, 起動してからユーザーが利用可能になるまでにgnuplotが内部で行っている, 細々とした諸設定も一緒に書き込まれます. その内容を理解しようとする必要はありませんが, プログラムに堪能な方は, 細々部分でgnuplotがどのようなことを行っているのかを知るために 眺めておくとよいでしょう.

「save」を実行したらgnuplotをいったん終了して, 改めて立ち上げます.そして,保存したファイルを読み込むために 下記を実行します.

  • load 'filename.plt'
読み込んだら下記を実行してください. グラフが画面中央におさまるように,幅を変えずに範囲を調整しています.
  • plot x\(**\)2\(-\)2\(*\)x
  • set xrange [-4:6]
  • set yrange [-2:5]
  • replot

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

グラフ画面の保存 (PDF)
描画されたグラフ画面をファイルに保存するには, どのファイル形式で保存するかを意識する必要があります. png, pdf, svg, emfのいずれかで保存するには, グラフ画面の上部で左から2番目のアイコン「Export plot to file」 をクリックします. 保存先のフォルダー,ファイル名,そしてファイル形式を選択すれば グラフ画面が保存されます. 下記は,ファイル名を「sample」とし, ファイル形式は「pdf」を指定して保存しています.

「pdf」保存するには、「印刷」画面から 「Adobe PDF」か「Microsoft Print to PDF」を選択して保存することもできます。 ただし、そのファイルには、画像の下に余分な空白が含まれています。 それを削除するには「こちら」を参照して下さい。 削除後のファイルは、\includegraphics を利用すると TeX のファイルで利用することができます。 ただし,gnuplotのバージョンによっては, グラフ画面の上段の表示が若干異なります. ver5.5では,FDマークの保存画面から emf 形式での保存ができ, 「option」の箇所から emf, png, bmp, JPEG, GIF, TIFF のタイプの保存ができます.

出力されたファイルは, 「sample.pdf」というファイル名で「My Documents」に保存されます. この保存場所は, gnuplotの「ファイル(F)」のメニューで表示される 「ディレクトリーの移動」箇所を利用すると変更することができます(下図). 作成したファイルを事後に利用するのであれば, 扱いやすいフォルダーに変更しておいた方がよいでしょう.

上記のメニューからフォルダーを指定して「Ok」を押すと, gnuplotの画面には,

  • cd 'C:\Users\・・・'
として,変更したフォルダー名が表示されます. 「cd」は,「Change Directory」ということです. 必要ならば,gnuplotを起動して「load」で読み込むファイルに 同じ内容を書き込んでおくと,以後は指定したフォルダーに画像が保存されます.


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

グラフ画面の保存 (EPS)
gnuplotは,描画されたグラフ画像を上記以外のファイル形式でも 保存することができます.その保存のためには, グラフを描画する出力先を変更する必要があります. デフォルトでのグラフの出力先は「wxt」になっています. どのような出力先があるかは,「set terminal」を実行すると表示されます. 下記は,表示されたファイル形式の最初の部分を示したものです. 非常に多数のファイル形式に対応していることが分かります.

gnuplotの画像を「eps」形式のファイルで保存するには, グラフを表示した後に出力先を「postscript」に指定して次のように入力します. 同様に,「gif」で保存するには「set terminal gif」, 「jpeg」で保存するには「set terminal jpeg」とします.

  • set terminal
    postscript eps
  • set output
    'sample.eps'
  • replot
  • set output
  • set terminal wxt
これのコマンドは,それぞれ次のことを行っています. なお,スペルが長くて面倒な場合は, 「set term post eps」または「se te po eps」と略記することもできます.
  1. 出力形式を「postscript」の「eps」形式で行う.モノクロ保存される.
    カラー保存するには, 「set terminal postscript eps
    enhanced color」とする.
  2. ファイル名を「sample.eps」にする.
  3. グラフを再描画する.ただし,事前にグラフを表示済みとする.
  4. 出力したファイルを閉じる.
  5. 出力先を,標準の「wxt」に戻す.

最後に「set terminal wxt」を実行しないと, 次にグラフを描画したときにグラフが画面に表示されないので注意してください. または,次のようにしてもかまいません.

  • set terminal postscript eps
  • set output 'sample.eps'
  • replot
  • set terminal wxt
  • replot
この場合は,「wxt」に戻ってから「replot」する必要があります. それにより,postscriptでの出力ファイルが閉じられます。 ファイルは,デフォルトでは「My Documents」に保存されます. 前項で保存先のフォルダーを変更していれば, 変更したフォルダーに保存されます. 保存したepsファイルをTeXに取り入れる方法は, 「TeXへの取り込み」を参照してください.

ただし,座標軸やタイトルなどに日本語を使用してeps保存すると, 日本語部分が文字化けします. フォントを指定する必要があるようなのですが, いろいろ試してもうまく表示させることができませんでした. 下記を参照して試してみてください. どうしても日本語を使用したい場合は, 出力したファイルを修正して対応することもできます. 「epslatexによる出力」を参照してください.


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

グラフ画面の保存 (その他)
グラフ画面をgnuplotの機能を利用して保存する方法について説明してきましたが, 画面保存をするには他にもいろいろな方法があります. いずれも,png, jpeg, bmp, gif, tifなどのファイル形式で保存することができます.
  • Windowsの 「 スクリーンショット」の機能を利用する.
    1. 「PrtScreen」のキーを押すと画面全体がクリップボードに保存される.
    2. Windowsアクセサリーにある「ペイント」を起動する.
    3. クリップボードの内容を貼り付ける.
    4. 切り出す部分を選択する.
    5. 選択部分を切り取る.
    6. 切り取った部分をファイル保存する.
  • Windows10に新たに備わった 「Shipping Tool」を利用する.
    このツールは使ったことがないので分かりませんが、 ペイントを利用するよりも簡単な手順で必要部分を切り出すことができるようです.
  • 他の画像ツールを利用する.
    私の場合は,フリーソフトの 「WinShot」 を愛用しています.

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

■TeXへの取り込み

a
\includegraphicsの利用
保存したepsファイルは,「graphics」パッケージを利用すると TeXに組み入れることができます. 基本的には, 「\includegraphics{sample.eps}」とするだけです. 下記では, 画像部分がはっきり分かるよう\fboxにより外枠をつけています.
\documentclass[a4paper,dvipdfmx]{jsarticle}
\usepackage[dvipdfmx]{graphicx}
% [ ]の部分は個々の使用環境による
\pagestyle{empty}
\begin{document}
\fbox{\includegraphics{sample.eps}}
% 図の部分が分かるように外枠をつけた
\end{document}
PDF変換するときにdvipdfmxを利用する場合は, [dvipdfmx]をオプション指定する必要があります. このオプションをつけなくてもタイプセット自体はできて DVIファイルは表示されますが, PDFに変換すると画像の位置がちょっとずれて変換されます.

また,上記のファイル指定は, EPSファイルがTeXのソースファイルと同じフォルダーにある場合です. たとえば,ソースファイルが置かれているフォルダーの サブフォルダー「sub」に置かれているときは \includegraphics{./sub/sample.eps}とします. 下図は,表示されたDVIから画像部分を切り取ったものです.

ここでは「eps」ファイルでの利用を想定して解説していますが、 近年は「eps」ではなく「pdf」ファイルにして取り込む流れになっているようです。 その場合は、前述したように「pdf」で保存して、 拡張子が「pdf」のまま \includegraphics を利用します。 ただし、画像の下に余分な空白が含まれてしまうので、 それを削除する必要があります。 TeXの「bin」フォルダーにある「pdfcrop.exe」を利用すると、 余分な空白が削除されます(参照)。

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

\includegraphicsのオプション
\includegraphicsには, いろいろなオプション機能があります. 以下は,オプション部分とそれにより表示される画像を示したものです.
  • 拡大・縮小「scale」
    \includegraphics[scale=0.75]{sample.eps}
    この値により,画像の拡大・縮小をすることができる.

  • 横幅と高さ「width」「height」
    これらの値により,横幅や高さを指定することができる.
    \includegraphics[width=50mm]{sample.eps}

    \includegraphics[width=100mm, height=50mm]{sample.eps}
    横長に指定したので,画像は横に伸びて歪むことになる.

    \includegraphics[width=100mm, height=50mm,keepaspectratio]{sample.eps}
    「keepaspectratio」を指定すると,縦・横の長さを指定しても, 元の画像の比率を変えないように拡大・縮小が行われる. 下図の場合は,縦の長さに合わせられている.

  • 回転「angle」
    \includegraphics[scale=0.5, angle=-30]{sample.eps}
    度数法で,画像の回転角を指定することができる.


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

emathの利用
作成した画像を文章混じりのプリントに取り入れるには, 「emath」のmawarikomi環境やedaenumerate環境を利用するとよいでしょう. 具体的な利用の仕方は, 「emathの利用法」のページを見てください. ここでは,利用例のみを示します.
  • 文章の中に図を割り付ける. (出力例)

    \documentclass[a4paper,dvipdfmx]{jsarticle}
    \usepackage[dvipdfmx]{graphicx}
    \usepackage{emathp, emathMw}
    \begin{document}
    \begin{mawarikomi}{0.3\textwidth}
    {\includegraphics[scale=0.5]{sample.eps}}
    右図は,gnuplotで作成したグラフをeps保存して利用しています. 表示される画像のサイズは,scaleの値を変えてタイプセットして, 試行錯誤で決めて下さい.
    \end{mawarikomi}
    \end{document}

    ここでは,右側の図を配置するスペースは\textwidthのサイズの30%で 指定しましたが,例えば「5cm」として具体的な値で指定してもかまいません.

  • 並列問題の中に図を入れる. (出力例)

    \documentclass[a4paper,dvipdfmx]{jsarticle}
    \usepackage[dvipdfmx]{graphicx}
    \usepackage{emathp, emathEy}
    \def\theenumii{\arabic{enumii}}
    \begin{document}
    \begin{enumerate}
    \item 次に示されているグラフは,どのような関数のグラフか. 関数の式を答えよ.
    \begin{edaenumerate}
    \item ~\\[-1.5zh] \includegraphics[scale=0.4]{sample3.eps}
    \item ~\\[-1.5zh] \includegraphics[scale=0.4]{sample3.eps}
    \item ~\\[-1.5zh] \includegraphics[scale=0.4]{sample3.eps}
    \item ~\\[-1.5zh] \includegraphics[scale=0.4]{sample3.eps}
    \end{edaenumerate}
    \end{enumerate}
    \end{document}

    画像の縮尺(scale)は,試行錯誤で決めて下さい. また,「\item」の箇所を上記のようにした理由は, 下記のそれぞれの場合を試してみるとよいでしょう. 「\item」の後には何らかのテキストが必要です. 「チルダ(~)」で空白を空けただけです.「\,」でもかまいません.
    1. 「\item \include・・・」とすると番号が図の左下になる.
    2. 「\item \\ \include・・・」とするとエラーになる.
▲戻る(トップメニューマップ)

epslatexによる出力
gnuplotの中で日本語を使用できても, それをeps保存すると文字化けしてしまいます. その場合は,「eps」ではなく「epslatex」を指定して出力すると, 出力されたファイルに対して日本語を使用することができます. 前項までに利用してきた放物線 \(y=x^2-2x\) を描画(plot)した上で, 次の指定を行います.
  • set terminal epslatex
  • set output 'sample_j.eps'
  • replot
  • set output
  • set terminal wxt
これにより,ファイルの出力先(デフォルトでは「My Documents」)には 「sample_j.eps」の他に「sample_j.tex」というファイルも出力されます. 「eps」ファイルの扱い方は既に説明済みです. 拡張子が「tex」の同名ファイルには グラフ画面がTeXのコマンドで書き込まれているので, このファイルを \input することでグラフをTeXに取り入れることができます. たとえば,次のようにします.
\documentclass{jsarticle}
\usepackage{graphicx}
\begin{document}
\begin{figure}[h]
\begin{center}
\resizebox{80mm}{!}{\input{sample_j1}}
\end{center}
\end{figure}
\end{document}

凡例部分がちょっと左に来すぎています. 画像の大きさは\resizeboxの数値を調整することで行うことができます. TeXのファイルとして出力されるので, このファイルに対してであれば日本語を使用することができます. 同時に出力されるepsファイルは,このtexファイルの中で読み込まれています. epsファイルだけを¥includegraphicsで読み込んでみると分かりますが, このepsファイルには座標の数値や関数の式などの文字情報は含まれていません. 格子線と曲線だけの図になっています.

出力された「sample_j.tex」の内容を理解しようとする必要はありません. このファイルの前半では,種々の定義や諸設定が行われてます. グラフ画面に関する内容は, 後半にある¥begin{picture}, ¥end{picture}で囲まれている部分に 書き込まれています.$-2$などの部分は外枠に目盛りを書き入れています. ¥putで座標を指定しているので, 目盛りが書き込まれている箇所の位置が分かります.

\begin{picture}(7200.00,5040.00)%
\gplgaddtomacro\gplbacktext{%
\csname LTb\endcsname%%
\put(744,768){\makebox(0,0)[r]{\strut{}$-2$}}%
\csname LTb\endcsname%%
\put(744,1344){\makebox(0,0)[r]{\strut{}$-1$}}%
\csname LTb\endcsname%%
\put(744,1920){\makebox(0,0)[r]{\strut{}$0$}}%
(以下、略)
たとえば,このファイルを次のように変更してみます.
  1. 座標軸を把握しやすいように,目盛りの「0」を大きくする.
  2. 凡例部分を右に寄せて,「放物線」を書き入れる.
  3. y軸のラベルを回転させないで,軸の上端に移動する.
  4. x軸のラベルを「x軸」にする.
目盛りの数値を大きくするために¥Largeをつけて, 「$0$」を「\Large$0$」としました. 2以降の修正箇所は,ファイルの最後の部分にあります. たとえば,次のように修正します. コメント行の下の部分が修正した部分です。 y軸のラベルが¥rotateboxで回転しているので, それを外して回転しないようにしています. 移動先の座標は,y軸の上端の目盛りの座標を参考にして, ある程度の試行錯誤で決めたものです. いずれにしろ,TeXのファイルなのでTeXのコマンドを使用することができます.
\gplgaddtomacro\gplfronttext{%
\csname LTb\endcsname%%
% \put(216,2783){\rotatebox{-270}{\makebox(0,0){\strut{}y}}}%
\put(216,4799){\makebox(0,0){\strut{}$y$}}%
\put(216,4550){\makebox(0,0){\strut{}軸}}%
% \put(3827,168){\makebox(0,0){\strut{}$x$}}%
\put(3827,168){\makebox(0,0){\strut{}x軸}}%
\csname LTb\endcsname%%
% \put(5696,4616){\makebox(0,0)[r]{\strut{}x**2-2*x}}%
\put(6400,4423){\makebox(0,0)[r]{\strut{}放物線}}%
}%
\gplbacktext

なお,次のようにする方法もあります.

  • set terminal latex
  • set output 'sample_j2.tex'
  • replot
  • set output
  • set terminal wxt
このようにすると,texファイルだけが出力されてepsファイルは出力されません. 出力されたtexファイルを¥inputすることになりますが, グラフ画面が全てTeXのコマンドとして書き込まれているので, ファイルの内容が複雑になって座標を書き入れている箇所などを見つけにくいです. 出力ファイルに修正を加えるのであれば,「epslatex」を指定した方が良いと思います. なお, 「set output」を省略するときは,wxtに戻ってから「replot」してください.


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

copyright