gnuplot, Maxima, Python グラフ作成・比較

同等の対象を

  • gnuplot
  • Maxima (plot2d(), draw2d())
  • Python の matplotlib.pyplot.plot()
  • Python の SymPy および SymPy Plotting Backends

でグラフにしてみるシリーズ。

グラフ作成基本編

Maxima や SymPy にはコンピュータ代数(古い言葉でいえば数式処理)の機能もあるが,グラフ作成の機能に限ってコンパクトにまとめたページ。

sin x と x のグラフを描く

「理工系の数学B」の授業で,$\displaystyle\lim_{x\rightarrow 0} \frac{\sin x}{x} = 1$ のイメージをもってもらおうと gnuplot でグラフを描いてみたが,今時の学生さんに gnuplot というのもなぁ… と思い直して,Maxima, Python (Matplotlib, SymPy) ではどう描くかなと調べてみたページ。

参考:初等関数のグラフを描く

「理工系の数学B」の授業で初等関数の微分をコンプリートした後,初等関数それぞれの外形くらいはグラフで示しておこうと思って書いてみたページ。自分が慣れ親しんだ gnuplot, Maxima だけではなく,今時の学生さん向けに Python の Matplotlib や SymPy,さらには SymPy Plotting Backends ではどう描くかも示しておこうと思って書いたページ。

グラフの上下左右軸に主目盛・副目盛をつける

20世紀の大昔,サイエンティフィックなグラフというものは上下左右軸に目盛をつけるものだと偉い先生に教えられたことがある。その理由は,定規を水平または垂直に当ててグラフの曲線から数値を読み取るためだと言われて,妙に感心したことを覚えている。というわけで,上下左右軸に目盛をつけた,サイエンティフィックなグラフを描く例。

2曲線の描画範囲を個別に設定して plot/draw と塗りつぶし

しばらく前に,gnuplot で $x$ の描画範囲と表示範囲を独立に指定するにはどうするかを調べた際の備忘録として,他の Maxima や Python (Matplotlib, SymPy) ではどう指定するかも書いておこうと思って。また,「ケプラーの第1法則・第2法則のパラパラアニメ」の出来上がり例のように,面積速度一定の法則を視覚的に表すためには,一定時間間隔で惑星が掃く面積を塗りつぶして見せたらいいので,そのための塗りつぶしテクニックの基本として。

正規分布をσごとに塗りわける

Wikipedia にある 標準正規分布がもつ確率密度関数のグラフ に触発されて,このグラフはどう描くのかなぁ… と試行錯誤した結果。

電場ベクトルの方向場を描く

 


参考

gnuplot

Maxima

SymPy Plotting Backends

関連ページ

SymPy Plotting Backends を知る以前に作成していたページ。Maxima と SymPy については,コンピュータ代数(代数といっても微分とか積分とか)についても比較できるように同等内容でまとめておいた。

 

はじめてのプログラミングシリーズ。プログラミングといっても,書式設定や繰り返し処理といった基本的な部分はグラフを作成する際にも重宝するので,ちょくちょく参考にしている。


経緯ときっかけ

そもそも私(葛西)は Mathematica 1.1 の頃(20世紀の昔,今から30年以上も前の話)までは熱心な Mathematica のユーザであったが,そのうちに高額有料ソフトはおいそれと買えなくなり,その頃担当していた授業では gnuplot を使いはじめていました。本学では一時期 Mathematica のサイトライセンスも契約していたのですが,それも打ち切りになり,それを契機に Maxima を使いはじめました。あの頃は Mathematica でこうやるところは Maxima ではどうすればいいか,という視点で使用法のまとめをしていたものですが,今となっては,もうすっかり Mathematica は使い方も忘れてしまいました。

なので,グラフ作成はまず gnuplot で描き,コンピュータ代数は Maxima で,そのついでに Maxima の plot2d() とかでグラフを描く内容の授業をやったりしていましたが,最近は Maxima の plot2d 系からdraw 系に統一した授業内容に変更しようかなぁ… と思っていたところです。

gnuplot からはじめた身にとっては,Python の Matplotlib(MATLAB系?)はなかなか馴染めずにいたわけですが,SymPy では symbolic な関数のグラフしか描けず,数値リストからグラフが描けないという致命的欠陥のために,しかたなく Matplotlib も授業で使うことにしていました。

しかし,最近 SymPy Plotting Backends を知りまして,これはいわば SymPy の機能拡張版とでもいうべきパッケージで,SymPy 的に関数のプロットが plot() でできるだけでなく,数値データのリストも plot_list() でグラフにでき,なかなかおもしろそうです。

というわけで,授業内容を Maxima から Python (+ SymPy + SymPy Plotting Backends + etc.) を使ったものに移行していこうかなぁ… と思っているところです。