|
2.10.1 グラフィックスオブジェクトの構造
1.9 において, Plotと ListPlot等のプロット関数の使い方を説明した.ここでは,プロット関数で生成したグラフィックスが Mathematica内部でどのような形式で保管されているか,また,より複雑なグラフィックスを作成するには Mathematicaをどのようなプログラムしたらよいかを説明していく.
基本的にグラフィックスはプリミティブ(基本単位)の集合体である.これはすべてのグラフィックスで共通である.プリミティブとはグラフィックスの各基本要素にあたる Point, Line,Polygon等のオブジェクトのことである.また,RGBColor,Thickness, SurfaceColorの指示子もプリミティブにあたる.
Tableでデータ点を生成した後,プロットする.
In[1]:= ListPlot[ Table[Prime[n], {n, 20}] ]

Out[1]= 
グラフィックスをInputForm(入力形)に変換し,グラフィックスが内部でどう表現されているか見てみる.プリミティブである Pointで各データ点が表されており,また,グラフィックス設定値も与えられている.
In[2]:= InputForm[%]
Out[2]//InputForm= Graphics[{Point[{1, 2}], Point[{2, 3}], Point[{3, 5}], Point[{4, 7}], Point[{5, 11}], Point[{6, 13}], Point[{7, 17}], Point[{8, 19}], Point[{9, 23}], Point[{10, 29}], Point[{11, 31}], Point[{12, 37}], Point[{13, 41}], Point[{14, 43}], Point[{15, 47}], Point[{16, 53}], Point[{17, 59}], Point[{18, 61}], Point[{19, 67}], Point[{20, 71}]}, {PlotRange -> Automatic, AspectRatio -> GoldenRatio^(-1), DisplayFunction :> $DisplayFunction, ColorOutput -> Automatic, Axes -> Automatic, AxesOrigin -> Automatic, PlotLabel -> None, AxesLabel -> None, Ticks -> Automatic, GridLines -> None, Prolog -> {}, Epilog -> {}, AxesStyle -> Automatic, Background -> Automatic, DefaultColor -> Automatic, DefaultFont :> $DefaultFont, RotateLabel -> True, Frame -> False, FrameStyle -> Automatic, FrameTicks -> Automatic, FrameLabel -> None, PlotRegion -> Automatic, ImageSize -> Automatic, TextStyle :> $TextStyle, FormatType :> $FormatType}]
グラフィックスとして自立する要素は,グラフィックスオブジェクトとして扱われる.グラフィックスオブジェクトには各型に応じていくつか種類があり,そのひとつひとつには型を指定する頭部が付いている.

グラフィックスオブジェクトの種類
1.9で説明した Plotや ListPlot等のプロット関数はすべてグラフィックスオブジェクトを組み合せることで最終的に表示するグラフィックスを構成している.

グラフィックスオブジェクトの型に対応する関数プロットとデータプロットの種類
ユーザ定義のグラフィックスオブジェクトを組み合せ,上記以外のグラフィカルイメージが作成できる.さらに,グラフィックスオブジェクトも式として表すので,標準的な Mathematicaの関数を使いグラフィックスをいろいろ操作できる.
グラフィックスオブジェクトを作成すると,次はそれを表示しなければいけない.表示するには Showを使う.

グラフィックスオブジェクトの描画
Tableを使い多角形(polygon)のプリミティブのリストを作っておく.
In[3]:= poly = Polygon[ Table[N[{Cos[n Pi/5], Sin[n Pi/5]}], {n, 0, 5}] ]
Out[3]= 
作った要素リストから2Dグラフィックスオブジェクトを作る.標準的な出力表記では,実際のオブジェクトではなく, -Graphics-と単なるラベルがふられる.
In[4]:= Graphics[ poly ]
Out[4]= 
InputFormに変換すると,完全なオブジェクトとして表示される.
In[5]:= InputForm[%]
Out[5]//InputForm= Graphics[Polygon[{{1., 0.}, {0.8090169943749475, 0.5877852522924731}, {0.30901699437494745, 0.9510565162951535}, {-0.30901699437494745, 0.9510565162951535}, {-0.8090169943749475, 0.5877852522924731}, {-1., 0.}}]]
オブジェクトを描画してみる.
In[6]:= Show[%]

Out[6]= 

グラフィックス変更のための局所的手法と大域的手法
グラフィックスプリミティブをもとにしたグラフィックスの作成では,普通,各種の修正操作を繰り返すことで最終的な形を得る. Mathematicaでは修正作業のため2つの方法が用意されている.その1つは,グラフィックスにグラフィックス指示子を与える方法である.グラフィックス指示子をグラフィックスプリミティブのリストに加えると,指示内容が続くグラフィックス要素に適用される.すると,グラフィックス単位で描画要素をどう表示するか指定できるようになる.グラフィックス指示子の一例に RGBColorがある.
上の例で作成したプリミティブをまた使う.今度はグラフィックス指示子 GrayLevel[0.3]を加えておく.
In[7]:= Graphics[ {GrayLevel[0.3], poly} ]
Out[7]= 
描画させると,灰色表示が得られる.
In[8]:= Show[%]

Out[8]= 
グラフィックス指示子を与えることで,特定の描画要素をどう表示したらよいかを指定することができる.しかし,多くの場合,グラフィックス全体の構図等の設定は大域的に変更したい.設定を変更するにはグラフィックスオプションを使う.
オプションFrameを加える.グラフィックス全体の見栄えに影響がでる.
In[9]:= Show[%, Frame -> True]

Out[9]= 
InputFormを使い調べてみると,Showがオプションを含めてグラフィックスオブジェクトを生成していることが分かる.
In[10]:= InputForm[%]
Out[10]//InputForm= Graphics[{GrayLevel[0.3], Polygon[{{1., 0.}, {0.8090169943749475, 0.5877852522924731}, {0.30901699437494745, 0.9510565162951535}, {-0.30901699437494745, 0.9510565162951535}, {-0.8090169943749475, 0.5877852522924731}, {-1., 0.}}]}, {Frame -> True}]
Showではグラフィックスオプションを指定できる.オプションの設定値をいろいろ変えながら同じプロットデータをもとにグラフィックスをいろいろと再表示でき,違った描画条件下でグラフィックスがどう映るかをすばやく見ていけるので便利である.
注意点として, Showの返すグラフィックスオブジェクトは表示したままのものである.つまり, Showで設定条件を変更した場合,変更した条件も Showの返すオブジェクトに入る.このため,再度同じオブジェクトに Showを使うと,設定条件を変更しない限り,前と同じ仕様で表示されることになる.新たに設定値を指定すれば,もとの値は上書きされる.

グラフィックスオブジェクトに付随したグラフィックスオプションの参照
いくつかのグラフィックスオプションは特定の値が指定されるときだけ機能する.また,他のグラ フィックスオプションには設定を自動(Automatic)にしておくことができるものがある.自動設定の場合, Mathematicaの内部アルゴリズムが使われ適切な値が自動的に選択される.オプションが自動設定になっていても, AbsoluteOptionsを使えば実際に採用された設定値を参照することができる.
プロットしてみる.
In[11]:= zplot = Plot[Abs[Zeta[1/2 + I x]], {x, 0, 10}]

Out[11]= 
プロット範囲(PlotRange)がどうなっているか確認する.自動設定(Automatic)になっているので,内部アルゴリズムで範囲が決定する.
In[12]:= Options[zplot, PlotRange]
Out[12]= 
AbsoluteOptionsでもう一度確かめる.今度は実際に採用された範囲が返ってくる.
In[13]:= AbsoluteOptions[zplot, PlotRange]
Out[13]= 

グラフィックス構成の詳細参照
グラフィックスオプションを指定すると,指定した通りにオブジェクトを表す描画要素のリストを効果的に生成する.Axesがよい例である.通常軸のオブジェクトは描画要素のリストに含まれないが,グラフィックスオプションにAxesを指定することによりリストに入れることができる.これはときに有用なものである.FullGraphicsはオプションを指定することなしに,詳細なプロットを生成するのに必要なグラフィックスプリミティブのリストを生成する.
数値データをプロットする.
In[14]:= ListPlot[ Table[EulerPhi[n], {n, 10}] ]

Out[14]= 
FullGraphicsを使い座標軸等のプリミティブも含むグラフィックスオブジェクトを生成する.
In[15]:= Short[ InputForm[ FullGraphics[%] ], 6]
Out[15]//Short= 
標準設定では, Plotや Show等の関数を使うと直ちにグラフィックスが出力される.出力の仕方はグラフィックスオプションの1つである DisplayFunctionによって制御できる. DisplayFunctionのデフォルト値は大域変数 $DisplayFunctionの持つ値である.
通常, $DisplayFunctionと DisplayFunctionに指定された表示用関数は Displayになっている. Displayは前処理の後に使われる低レベルの描画関数で,グラフの出力作業を行う.ときには, Plot等の関数を使いグラフィックスを単にグラフィックスオブジェクトとして出力させ,表示したくない場合がある.オブジェクトの生成だけを行うならば, DisplayFunction -> Identityの指定を与えておけばよい.詳細は 2.10.14を参照のこと.

グラフィックスオブジェクトの生成と描画
グラフィックスのオブジェクトだけ生成する.表示禁止にしておく.
In[16]:= Plot[BesselJ[0, x], {x, 0, 10}, DisplayFunction -> Identity]
Out[16]= 
前の設定が生きているので,再描画させるとオブジェクトは更新されるが表示はされない.
In[17]:= Show[%, Frame -> True]
Out[17]= 
グラフィックスを表示するには,デフォルトの表示関数を使うよう具体的に指定しなければいけない.
In[18]:= Show[%, DisplayFunction -> $DisplayFunction]

Out[18]= 
|