グラフィックスとサウンド
Plot[f,{x,xmin,xmax}] | xmin から xmax までの x の関数として f をプロットする |
Plot[{f1,f2,…},{x,xmin,xmax}] | いくつかの関数を一緒にプロットする |
Exclusionsを使うと,プロットから特異点を省くことができる:
微分方程式の数値解を求めておく.解法に関しては「微分方程式の数値解法」を参照のこと:
Wolfram言語では,どんな軸スケールを使うかとか,プロットする式のサンプリング点をどこにするかとか,また座標軸をどう描画するかとか,プロットの仕様をいろいろ変更できるようになっている.通常は,Wolfram言語により自動的に採用される設定条件で間に合うが,グラフの用途によっては,仕様を変更した方がよいときもあるだろう.
これはWolfram言語の関数全般に関して言えることだが,関数の動作条件を変更するには,「オプション」指定を行う.各オプションには決まった名前がある.例えば,プロットの条件を指定するにはPlot関数の最後に引数として,書式 name->value で書かれた規則を引数として加える(ここで,name はオプション名,value は変更する設定値を示す).何も規則を指定しなければ,「デフォルト値」の規則が使われる.
Plot[f,{x,xmin,xmax},option->value] | オプションに値を指定し,式をプロットする |
Plotのような関数には設定できるオプションが数多くある.普通は,多くても2,3の項目を変更する程度で事が足りるだろう.プロットを見やすくするには,いろいろと実験してみるのが最善の方法である.例えば,あるオプションに一連の異なった値を設定していったとき,プロットの表示がどうなるかを見ていくとよいだろう.
オプションはプロットごとに指定することができる.また,プロットした後でも,オプションだけを変えて再表示することができるようにもなっている.これについては「プロットの再描画と組合せ」で説明する.
オプション
|
デフォルト値
| |
AspectRatio | 1/GoldenRatio | プロット領域の縦幅を横幅で割った比.Automaticは, と の絶対座標から自動的に算出される比にする |
Axes | True | 軸を表示するかどうかを指定する |
AxesLabel | None | 軸に表示するラベル.ylabel は, 軸のラベルを指定する.書式{xlabel,ylabel}は両軸のラベルを指定する |
AxesOrigin | Automatic | 軸が交差する点 |
BaseStyle | {} | プロット中のテキスト要素に適用するデフォルトのスタイル |
FormatType | TraditionalForm | プロット中のテキスト要素に適用する標準表記法 |
Frame | False | プロット領域の囲み枠を表示するかどうかを指定する |
FrameLabel | None | 囲み枠に付けるラベル.ラベルはリスト形式で指定され,下部 軸から始まり時計方向の並び順になっていること |
FrameTicks | Automatic | 囲み枠を引く場合,そこに目盛を付けるどうかを指定する.Noneは,目盛を付けない |
GridLines | None | どんな方眼線を入れるかを指定する.Automaticは,主な目盛の位置だけに線を描く |
PlotLabel | None | プロットの題目 |
PlotRange | Automatic | プロットする座標の範囲.Allは,すべての点を含む |
Ticks | Automatic | 軸に付ける目盛の形を指定する.Noneは,目盛なし |
と 軸のラベルを指定する.ラベルは,TraditionalFormのWolfram言語の出力として生成されるときと同じように表示される.ラベルの文字はダブルクォートでくくって指定することができる:
AspectRatioオプションの設定を変更するとグラフの全景が変わる.AspectRatioは縦幅を横幅で割った比として与えられる.デフォルト値は,長方形では最も見やすいといわれている比で,いわゆる,黄金比の逆数である:
自動設定でプロットを行うと, 軸と 軸のスケールが自動設定され,式の挙動で特に重要と思われる部分だけがプロットされる.もし,プロットする式の値が急激に増加する場合や,特異点が現れる場合は,局所的に式の値が大きくなりすぎて,その部分は自動的にプロット範囲から除外されてしまう.PlotRangeを指定することにより,プロットに入れたい 軸と 軸の範囲を正確に制御できる.
Automatic | 式の挙動で「重要」と思われる部分がプロットに含まれるように,割合大きな範囲が選択される(デフォルト時の設定) |
All | プロット可能な全区間が選択される |
{ymin,ymax} | の下限と上限を指定する |
{xrange,yrange} | 区間と 区間を指定する |
オプションPlotRangeの設定
PlotRangeを使い の区間を指定する. の極限をこのように指定すると,曲線の下の部分は表示されなくなる:
関数の曲線をなるべく滑らかにプロットできるように,Wolfram言語内部で調整が取られる.つまり,増減の激しい関数に対してはより多くのプロット点が使われる.通常,関数の取る形に応じて関数のサンプリングを「適応」させるが,上限はあり,それ以上の細かさで関数をサンプリングすることはできない.この上限は設定可能なので,必要ならば変更しておく.
において,は無限に増減を繰り返す.増減する区間において,それに見合った点数のサンプリングが試みられるが,サンプリング点は有限であるために関数の挙動が十分に再現されない.このため,曲線がところどころで切れてしまっている:
ここで重要なのは,プロットする関数は限られた点数までしかサンプリングできないので,必ずしも関数の特徴を再現できるとは限らない,ということである.Wolfram言語は適応的に関数をサンプリングするため,関心のある部分付近のサンプル数を増加させるが,それでも何かが足りないという可能性もある.もちろん,PlotPointsでプロット点数を増やしておき,もっと多くの点でサンプリングすることは可能である.ただし,PlotPointsを大きく設定すればするほど,曲線は滑らかにできるが,プロットする時間も長くなってしまうことになる.
オプション
|
デフォルト値
| |
PlotStyle | Automatic | 曲線の描画スタイルを決めるグラフィックスプリミティブをリスト形式で指定する(「グラフィックス指示子とグラフィックスオプション」を参照のこと) |
ClippingStyle | None | 曲線が省略されている場合に, 何を描画するか |
Filling | None | 各曲線の下に挿入する塗り潰し |
FillingStyle | Automatic | 塗り潰しに使用するスタイル |
PlotPoints | 50 | 関数をサンプリングする点の最小数 |
MaxRecursion | Automatic | 反復細分化が許される最大回数 |
PlotStyleを使って,破線の曲線を指定する:
複数の関数をプロットするときは,リストの中のPlotStyle設定はそれぞれの関数に継続的に使われる:
複数の関数をプロットするときは,リストの中のPlotStyle設定はそれぞれの関数に継続的に使われる:
PlotRangeが曲線を切り取るように指定されている場合,デフォルトで何も表示されない:
ClippingStyleをリストに設定すると,下部と上部で切り取られた部分に対するスタイルが指定される:
Show[plot,option->value] | オプションを変更してプロットを再描画する |
Show[plot1,plot2,…] | 複数のプロットを重ねて表示する |
GraphicsGrid[{{plot1,plot2,…},…}] | プロットの配列を表示する |
InputForm[plot] | 内在するプロットについてのテキスト記述を参照する |
Showを入力するたびにオプション設定を変えてやることで,1つのプロットをいろいろな方法で見ることができる.最良なプロット仕様を見付けるには,このようにひとつひとつ設定条件を試しながら行うのもよい方法である.
Wolfram言語のグラフィックスはすべて式なので,他の式と同様に操作することができる.このような操作を行うときはShowを使う必要はない.
GraphicsGrid[{{plot11,plot12,…},…}] | 縦横表示 |
GraphicsRow[{plot1,plot2,…}] | 横並び表示 |
GraphicsColumn[{plot1,plot2,…}] | 縦並び表示 |
GraphicsGrid[plots,Spacings->{h,v}] | 間隔指定付き再表示 |
Showで並べて表示するときにオプションを指定すると,それは個々のプロットに対してでなく,配列全体に対して有効になる:
特に指定がない場合,GraphicsGridを指定するとプロットとプロットの境界に狭い間隔が置かれる.この間隔は,書式Spacings->{h,v}を使ったオプション設定で変えることができる.ここで,h と v は,それぞれ,水平方向と垂直方向の間隔幅を表すパラメータである.デフォルトでは,Spacingsオプションはデフォルトフォントの文字の幅と高さを使って,h および v パラメータをスケールするが,グラフィックスでは一般にScaled座標を使った方が便利である.Scaledは値1が格子の1要素の幅と高さを表すようにスケールする.
プロットすると,他の情報と一緒にプロットした点もリスト形式で保存される.Showを使うことで,これらの情報をもとに,プロットをいろいろな描画条件で再表示することができる.また,条件を変えても,Showにはもともとプロットした値が保存されているので,例えば,オプション設定で最初に作ったプロットを部分的に拡大表示させ,Plotで使われた個々の標本点を確認する,というようなことも可能である.ただし,オプションPlotPointsを使ったプロット点数の指定は,Plotコマンドを指定したときだけに有効である.(Wolfram言語では,常に保持してある実際の点がプロットされる.平滑化した曲線やスプライン曲線は使われない.これは,数学のグラフィックスで誤った解釈を与えかねないからである.)
部分的に拡大表示させる.この解像度ならば,Plotコマンドで生成されたひとつひとつの区間線を見分けることができる:
Plot3D[f,{x,xmin,xmax},{y,ymin,ymax}] | |
f を x と y の関数として3Dでプロットする |
三次元グラフィックスは,その内部でマウスをドラッグしてグラフィックスを回転させることができる.グラフィックスの内部でドラッグすると,グラフィックスはマウスに従う方向に転倒し,グラフィックスの境界線付近をドラッグするとスクリーン上のそのままの場所で回転する.Shiftキーを押したままグラフィックスをドラッグすると,グラフィックスをパンすることができる.Ctrlキーを使うとズームされる.
3Dプロットには非常に多くのオプションがある.ここではその中の基本的なものに限って説明する.他は「グラフィックスとサウンドオブジェクトの構造」で説明する.
オプション名
|
デフォルト値
| |
Axes | True | 軸を表示するかどうか |
AxesLabel | None | 軸に表示するラベル.zlabel は 軸のラベルを指定し,書式{xlabel,ylabel,zlabel}はすべての座標軸にラベルを指定する |
BaseStyle | {} | プロットに適用するデフォルトのスタイル |
Boxed | True | 曲面の周囲に三次元ボックスを描画するかどうか |
FaceGrids | None | プロット空間を囲む枠に方眼線をどう表示するか.Allの場合,すべての面に方眼線が表示される |
LabelStyle | {} | ラベルに対するスタイル指定 |
Lighting | Automatic | 面の色付けに使用する照明効果 |
Mesh | Automatic | 曲面に メッシュを描画するかどうか |
PlotRange | {Full,Full,Automatic} | あるは他の値の範囲の指定 |
SphericalRegion | False | 外接球を最終的な表示領域にフィットさせるかどうか |
ViewAngle | All | 視野の角度 |
ViewCenter | {1,1,1}/2 | 中心に表示する点 |
ViewPoint | {1.3,-2.4,2} | 曲面を眺める空間点 |
ViewVector | Automatic | シミュレートされるカメラの位置と方向 |
ViewVertical | {0,0,1} | 垂直にするための方向 |
BoundaryStyle | Automatic | 曲面の境界線の描画方法 |
ClippingStyle | Automatic | 曲面の省略部分の描画方法 |
ColorFunction | Automatic | 曲面の色の決定方法 |
Filling | None | 各曲面の下の塗潰し |
FillingStyle | Opacity[.5] | 塗潰しに使用するスタイル |
PlotPoints | 25 | 関数をサンプルする各方向での点の数.は および 方向に異なる数を指定する |
PlotStyle | Automatic | 各曲面のスタイルに対するグラフィックス指示子 |
設定を変えて前のプロットを表示し直す.この例のPlotRangeの設定では,範囲の曲面部分だけが表示される:
オリジナルのプロットを作成する場合は,より多くの点をサンプリングするようにすることもできる.Wolframシステムは適応的にプロットをサンプルリングし,きれいに見せるために点を加える.しかしそれでももっと多くの点を指定した方がよい場合もある:
3Dプロットで特に重要な設定はどこの空間点からプロット面を眺めるかを決めることだろう.実際の設定は,視点となるの座標位置を選び,オプションViewPointに設定することで行える.Plot3DとShowの機能のどちらでも設定の仕方は同じである.座標の算出法は「3Dグラフィックスの座標系」で説明する.マウスを使ってグラフィックスを回転させている場合は,ViewPoint値を調整していることになる.
これは,プロットした面をデフォルトの視点{1.3,-2.4,2}から眺めたときのグラフである.視点のデフォルト値としては,視覚的に紛らわしいプロット面の部分的な配合が起らないようにした「一般的な」位置が選択される:
ViewPointオプションは,一般的な視点を表すさまざまな記号値も取る:
{1.3,-2.4,2} | デフォルトの視点 |
Front | 負の 方向に沿って正面から眺める |
Back | 正の 方向に沿って後ろから眺める |
Above | 正の 方向に沿って上から眺める |
Below | 負の 方向に沿って下から眺める |
Left | 負の 方向に沿って左から眺める |
Right | 正の 方向に沿って右から眺める |
視点に関しては,プロット面を多少斜め上方向から眺めるような値に設定するとたいていは最良の効果が得られる.また,視点をプロット面にある程度接近させ,遠近効果を付けた方が一般によくなる.また,プロット空間に囲み枠を引いて,プロット面の空間配置(オリエンテーション)を分かりやすくするのもひとつの方法だろう.
3Dのイメージに実在感を与えるために,デフォルトでは,擬似的な照明モデルを使いプロット面に特殊な色付けが施される.この場合,4点の光源とアンビエント照明がオブジェクトを照らしているものと想定される.他の光源の設定方法やオブジェクトの反射特性の設定方法は,「照明効果と曲面の反射特性」で説明する.
照明は,照明特性の集まりを表す文字列を使って指定することもできる.例えば,オプション設定Lighting->"Neutral"では白い光の集まりが使われるので,プリンタ等の白黒出力デバイスで忠実に再現することができる.
ここでは関数ではなく,リストとしてあるデータ点をどうプロットするかを説明する(外部ファイルやプログラムからどうデータを読み込むかは,「データのインポートとエキスポート」で説明する).プロットの対象物がリスト形式のデータであっても,使うWolfram言語コマンドは,関数のプロットで使ったものと似ていて,類推できる.
ListPlot[{y1,y2,…}] | リスト形式のデータ y1,y2,… を x の値1,2,…でプロットする |
ListPlot[{{x1,y1},{x2,y2},…}] | 点(x1,y1),…でプロットする |
ListLinePlot[list] | 点と点を結び,折れ線グラフを作る |
ListPlot3D[{{z11,z12,…},{z21,z22,…},…}] | |
データ点を zyx として3Dプロットを作成する | |
ListPlot3D[{{x1,y1,z1},{x2,y2,z2},…}] | |
位置{xi,yi}において,高さ zi の3Dプロットを作成する | |
ListContourPlot[array] | 配列データを等高線プロットする |
ListDensityPlot[array] | 配列データを密度プロットする |
「基本的なプロット」において,Wolfram言語を使いどう 座標を 座標の関数としてプロットし,曲線を生成するかを説明した.Wolfram言語を使いパラメトリックプロットを行うことも可能である.パラメトリックプロットでは,各点の と 座標は,ともに第3のパラメータ,例えば, に依存した関数として与えられる.
ParametricPlot[{fx,fy},{t,tmin,tmax}] | |
パラメトリックプロットを行う | |
ParametricPlot[{{fx,fy},{gx,gy},…},{t,tmin,tmax}] | |
複数のパラメトリック曲線を同一領域にプロットする |
ParametricPlot3D[{fx,fy,fz},{t,tmin,tmax}] | |
3D曲線をパラメトリックプロットする | |
ParametricPlot3D[{fx,fy,fz},{t,tmin,tmax},{u,umin,umax}] | |
3D曲面をパラメトリックプロットする | |
ParametricPlot3D[{{fx,fy,fz},{gx,gy,gz},…},…] | |
複数のパラメトリック曲線を一括してプロットする |
3Dパラメトリックプロットで使うParametricPlot3D[{fx,fy,fz},{t,tmin,tmax}]は,二次元のParametricPlot[{fx,fy},{t,tmin,tmax}]に準じている.また,どちらの次元のプロットでも,パラメータ t を変化させることでプロット点が生成され,また,それらの点が結ばれることで曲線が形成される.ParametricPlotなら曲線は二次元,ParametricPlot3Dなら三次元である.
ParametricPlot3D[{fx,fy,fz},{t,tmin,tmax},{u,umin,umax}]を使うと,形成されるのは3Dの曲面で,曲線ではない.曲面は四辺形の面要素で構成され,四辺形の各頂点は,等間隔の格子上で t と u が取る値において決定される fi の各値に対応した座標を持つ.
ParametricPlot3Dをうまく使えば,複雑に入り組んだ構造の曲面を作ることができる.このような曲面の形成の仕方は,- 平面を「歪めたり」,「丸めたり」して行うものととらえると分かりやすいかもしれない.
ParametricPlot3Dで曲面プロットをするときは,特に,パラメータとして適切な変数を選択することが大切である.また,パラメータを変化させていったときプロット面が部分的にでも複数回に渡って描画されないように注意しなければいけない.同じ点を何回もプロットするとメッシュが部分的に途切れてしまうことがあるし,また,ParametricPlot3Dがプロットを完了するのに余計な時間がかかってしまう.
「グラフィックスとサウンドオブジェクトの構造」で触れるが,Wolfram言語には機能的に非常に充実したグラフィックス用プログラミング言語が組み込まれている.この言語を使うことで,いろいろな形式のプロットを行うことが可能になる.
LogPlot[f,{x,xmin,xmax}] | 片対数でプロットしたグラフを作成する |
LogLinearPlot[f,{x,xmin,xmax}] | 対数線形プロットを作成する |
LogLogPlot[f,{x,xmin,xmax}] | 両対数プロットを作成する |
ListLogPlot[list] | データのリストから片対数プロットを作成する |
ListLogLinearPlot[list] | データのリストから片対数プロットを作成する |
ListLogLogPlot[list] | データのリストから両対数プロットを作成する |
DateListPlot[list] | 日付座標でデータのリストからプロットを作成する |
DateListLogPlot[list] | 日付座標でデータのリストから片対数プロットを作成する |
PolarPlot[r,{t,tmin,tmax}] | 角度 t の関数として半径 r の極プロットを作成する |
SphericalPlot3D[r,{theta,min,max},{phi,min,max}] | |
3Dの球プロットを作成する | |
RevolutionPlot3D[f,{t,tmin,tmax}] | 3Dの回転面を作成する |
BarChart[list] | データのリストを棒グラフとして作成する |
PieChart[list] | データのリストを円グラフとして作成する |
RevolutionPlot3Dを使って 軸および 軸を中心にして曲線を回転させる:
利用できるプロット関数のいくつかが,Wolframシステムに付属の標準パッケージで定義されている.
ErrorListPlot[{{x1,y1,dy1},…}] | エラーバー付きのプロットを作成する |
BoxWhiskerPlot[list] | データの箱ひげ図を作成する |
ParetoPlot[list] | データのパレート図を作成する |
PairwiseScatterPlot[data] | 多変量データの座標のペアをプロットする |
PairwiseScatterPlotは三変量データから列のペアをプロットするのに使うことができる:
サウンドの生成
Wolframシステムを使えばグラフィックスだけでなくサウンドも作れる(一部のコンピュータではシステム的に制約がありこの機能がサポートされない場合がある).Wolframシステムでは,グラフィックスとサウンドはほとんど同じように扱われる.
例えば,グラフィックスでは,Plot[f,{x,xmin,xmax}]により関数をプロットする.これに対して,サウンドでは,Play[f,{t,0,tmax}]により関数を「プレイ」する.Playでは,関数が音の波形の定義に使われる.また,関数の値は,時間の関数である発生音の振幅を与える.
Play[f,{t,0,tmax}] | 振幅が時間 t の関数 f で与えられる音を演奏する(t は秒単位で入力する) |
Playのサウンドはどんな波形の音でもよい.例えば,倍音で構成されたものでなくてもよい.Playの引数として入力する振幅関数は,発生させたい音に対応した瞬間信号値を与えるものである.この信号は,まず電圧に変換され,そして,スピーカの振動に変換されて音を発生させる.文献によっては,振幅は音のピーク信号強度と定義するものもあるが,本書では,常に,時間の関数である瞬間的な信号強度とする.
Playで使う時間変数は常に秒単位で指定する.実際に音の生成が開始されると,音の振幅が毎秒決まった回数だけ標本化(サンプリング)される.この毎秒当りのサンプル数はサンプルレートと呼ばれ,オプションSampleRateを使うことで任意な値に設定することができる.
Play[f,{t,0,tmax},SampleRate->r] | サンプルレートを r にして,サウンドプレイを開始する |
一般に,サンプルレートを上げると,高い周波数帯域の音成分をより忠実に表現できるようになる.サンプルレートがr であれば再生可能な周波数域は Hzまでである.普通,人間の聴力は周波数で20〜22,000Hzの音を聞き取ることができるといわれている(年齢や性別等によって多少差はある).ちなみに,ピアノの持つ88音階は基本周波数で27.5〜4,096Hzに相当する.
また,CDプレーヤーで使われている標準サンプルレートは44,100Hzで,実効的な電話のサンプルレートは8,000Hz程度である.特別なシステム仕様でなければ,Wolframシステムにおけるサンプルレートは,規定で約8,000Hzに設定されている.
Play[{f1,f2,…]を使いステレオ効果を出すこともできる.2チャンネルにとどまらず,何チャンネルでも操作可能である.
ListPlay[{a1,a2,…},SampleRate->r] | 振幅の値の列に基づいてプレイする |
ListPlayを使いデータを音として聞くことが可能である.この場合,データはリスト形式で入力し,各データ点は特定のレートでサンプリングされた振幅の値とする.
Wolframシステムで実際にサウンドが生成される場合,一定範囲の振幅・音域だけが許される.これは,PlayまたはListPlayのコマンドにオプションPlayRangeを使った区間値を与えることでできる.この設定は,「プロット仕様の変更」のプロット範囲の指定で使ったPlotRangeと同じように行えばよい.
PlayRange->Automatic | 内部処理により自動的に振幅を調整する |
PlayRange->All | すべての振幅値が演奏可能音域に入るように調整する |
PlayRange->{amin,amax} | 振幅を amin〜 amax に制限する |
設定PlayRange->Automaticを使えば,適切なスケール率が選択され便利だが,PlayRangeを使い音域を限定した方が,内部でプレイ範囲の計算をする必要がなくなるため,Playの処理スピードが上がる.
EmitSound[snd] | 評価されたときにサウンドを発する |
出力のSoundオブジェクトは通常,サウンドの可視化を含むボタンとしてフォーマットされ,押されたときにサウンドを発する.サウンドはユーザが介入しなくても,またEmitSoundを使って出力を生成しなくてもプレイすることができる.事実,Soundボタンの内部の内装ではボタンが押されたときにEmitSoundが使われる.