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

同等の対象を

  • gnuplot
  • Maxima (plot2d(), draw2d())
  • Python の Matplotlib の plt.***, ax.***
  • Python の SymPy Plotting Backends
    • The Graphic Module
    • Plot functions

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


2024.12.3 追加


2024.11.25 追加

Python でグラフ作成

SymPy Plotting Backends (SPB)

Python の SymPy 自身にもグラフ作成機能はありますが,SymPy Plotting Backends (SPB) は,言わばその機能拡張版に相当します。 SPB によるグラフ作成には,The Graphics Module による方法と,Plot functions による方法の2種類の方法がありますドキュメントによると,The Graphics Module のほうがより直感的で簡単であり,異なったグラフを重ねて表示させることも簡単にできるのでオススメのようです。Plot functions による方法は今後はアップデートされないようです。

Matplotlib

Python の Matplotlib によるグラフ作成には,plt.*** という関数を使った plt (pyplot) 流(pyplot インターフェース)と,ax.*** という関数を使った ax 流(オブジェクト指向インターフェース)の2つの方法があります。

個人的感想:

ひととおりまとめてみた限りでは,ax.*** を使う ax 流のみできることは,

  • subplots() で複数のグラフを描いて(重ねて表示するのではなくて)配置する
  • matplotlib.patches.* を使って ax.add_patch() する

なので,それ以外の細かな設定は全て ax 流でも plt 流でも(関数名は微妙に違う場合もあるが)基本的にできるようだ。ax 流を覚えておくと,SPB の The Graphic Module でもそのまま使えるのが便利といえば便利。


グラフ作成基本編

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 ではどう描くかも示しておこうと思って書いたページ。

tan(x) などの不連続点をつながないグラフを描く

初等関数のグラフを描く際,$y=\tan x$ や $y=1/x$ などの不連続点を無造作に線でつなぐケースがあったので,不連続点を無造作に繋がないようなグラフの描き方をまとめてみた。

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

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

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

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

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

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

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

電磁気学の授業で,電荷密度から直接静電場を求めているので。

 

複数の曲線を一気にグラフにする例とオプション設定例

パラメータを変えて複数の曲線を一気にグラフにする例や,オプションの設定法について,まとめてみた。

 

螺旋(らせん)を立体的にグラデーションで描く

電磁気学の授業で,ソレノイドを流れる電流による磁場や,一様な静磁場中の荷電粒子の運動について話しているので。

本稿執筆時点では,SymPy Plotting Backends では3次元ベクトルが描けない,Matplotlib で3d plot の曲線にグラデーションをつけるやり方がわからない…

楕円や回転楕円体を描く

理工系の数学 B の授業で,楕円の周長や面積,回転楕円体の表面積や体積を求めているので。

 


参考

gnuplot

Maxima

SymPy Plotting Backends

関連ページ

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

 

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


経緯ときっかけ

そもそも私(葛西)は Mathematica 1.1 の頃(20世紀の昔,今から30年以上も前の話)までは熱心な Mathematica のユーザであった。どんだけ熱心だったかというと,共済に借金をして私費を投じて NeXT station を買ったらついてきたこのユーザーズガイド(November 1991)をまだ持っているくらい。

Mathematica User’s Guide For NeXT Computers

 

そのうちに高額有料ソフトはおいそれと買えなくなり,その頃担当していた授業では 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.) を使ったものに移行していこうかなぁ… と思っているところです。