text_040_graph

3189 days ago by takepwave

Hiroshi TAKEMOTO (take@pwv.co.jp)

グラフの使い方

Sageでのグラフの使い方について、説明します。 レファレンスマニュアル を参考にしながら見てください。

3次元多項式をもう一度

Sageを使ってみよう でプロットした3次元多項式について、plot関数の使い方も含めて詳しくみてみましょう。

plotの呼び出しは、以下の形式で覚えると便利です。

plot(関数, [変数名, 最小, 最大], オプション)
オプションは、省略可能です。plotのオプションは、plot.optionsで知ることができます。 それ以外にもGraphicsのオプションも使えます。よく使うオプションを以下にしめします。
  • 描画範囲指定のxmin, xmax, ymin, ymax
  • グラフの比率を指定するaspect_ratio
  • 線の色指定のcolor

3次元多項式の場合には、最初にプロットで使用する変数xをvar関数で定義します。 次に関数fを定義します。今回はplotの結果をf_pltに代入していますので、最後に show関数でf_pltを表示します。

f_plt変数に代入することによって、後で他のグラフと重ね合わせて表示することが できます。

x = var('x') f = x^3 - x^2 - 2*x f_plt = plot(f, [x, -2.5, 2.5]); show(f_plt) 
       

plot.optionsを知るには、plot?でヘルプを表示したり、plot_optionsを表示するとよいでしょう。

# plotのオプションを知る plot.options 
       
{'adaptive_recursion': 5,
 'adaptive_tolerance': 0.01,
 'alpha': 1,
 'aspect_ratio': 'automatic',
 'detect_poles': False,
 'exclude': None,
 'fill': False,
 'fillalpha': 0.5,
 'fillcolor': 'automatic',
 'legend_label': None,
 'plot_points': 200,
 'rgbcolor': (0, 0, 1),
 'thickness': 1}
{'adaptive_recursion': 5,
 'adaptive_tolerance': 0.01,
 'alpha': 1,
 'aspect_ratio': 'automatic',
 'detect_poles': False,
 'exclude': None,
 'fill': False,
 'fillalpha': 0.5,
 'fillcolor': 'automatic',
 'legend_label': None,
 'plot_points': 200,
 'rgbcolor': (0, 0, 1),
 'thickness': 1}

接線を求める

点$(x_0, y_0)$での接線の傾きは、関数fの微分の$x_0$での値から得ることができますので、 接線の式は、以下のように求めることができます。 $$ (y - y_0) = f'(x_0) (x - x_0) $$ $y_0$の値は、$f(x_0)$ですから、接線の式は以下のようになります。 $$ y = f'(x_0) (x - x_0) + f(x_0) $$

この計算をSageを使って計算してみましょう。まずSageの変数x0を定義し、y0にf(x=x0)の値を代入します。 f1にfの微分をセットします。

# (x0, y0)での接線を求める x0 = var('x0') y0 = f(x=x0) f1 = diff(f, x); view(f1) 
       

材料がそろったので、接線の式を定義し表示します。確認のために$x_0 = 0$での式も表示します。

$x_0 = 0$での接線は、原点を通り傾き-2と求まりました。

# x0 = 0での接線の式 y = f1(x=x0)*(x - x0) + y0; view(y) view(y(x0 = 0)) 
       

この直線をプロットしてみましょう。 x0=0での接線の式なので、plotの引数にはyではなく、y(x0=0)が渡されていることに注意してください。

重ね合わせたときに区別できるように線の色を緑にします。線の色は、rgbcolorオプションで指定します。

y_plt = plot(y(x0=0), [x, -2.5, 2.5], rgbcolor='green') show(y_plt) 
       

接線を計算したポイントを示すために、point関数を使って点を表示します。

point関数の使い方は、以下の通りです。座標は、リストまたはタプル形式で与えます。

point(座標, オプション属性(pointsize, rgccolor, faceted等))

# x = 0のポイントをセット pt = (0, f(x=0)) pt_plt = point(pt, rgbcolor='red', pointsize=30) 
       

グラフの重ね合わせ

Sageのグラフ表示機能の最大の特徴は、重ね合わせです。 これまで計算した以下の結果を同時に表示してみましょう。

  • f_plt: 3次元多項式(青)
  • y_plt: 接線(緑)
  • pt_plt: 接点(赤)

重ね合わせは至って簡単で上記の3つの変数を足し合わせて、showメソッドで表示するだけです。

(f_plt + y_plt + pt_plt).show() 
       

ユーザ指定(インタラクティブ)

Sageのノートブックでのもう一つの特徴にユーザが逐次値を指定することができる、 インタラクティブ機能があります。

接点の座標x0をユーザ任意に指定できるように、_MyGraph関数を定義して、 与えられたx1でのグラフの重ね合わせを返すようにします。

# 与えられたx座標でのfと接線のグラフを返す関数を定義 def _MyGraph(x1): y_plt = plot(y(x0=x1), [x, -2.5, 2.5], rgbcolor='green') pt = (x1, f(x=x1)) # x0, y0の座標をセット pt_plt = point(pt, rgbcolor='red', pointsize=30) return (f_plt + y_plt + pt_plt) # f_pltは先の結果を再利用 
       

インタラクティブ機能を使う場合、

@interact	
の後に関数を定義します。ここでは、_(アンダーバー)という特殊な関数名を指定します。

関数の引数で与えられた変数をユーザが入力することができるようになります。 ここでは、slider関数を使って-2.5から2.5の範囲で1/10の刻みのスライダー バーを表示してx1を指定できるようにします。

関数の内容は、_MyGraph関数でx1で指定された座標の接線とポイントの重ね合わせ グラフを返し、showメソッドでグラフを表示します。グラフ表示範囲がx1の値でかわらない ようにymin, ymaxで範囲を指定します。

@interact def _(x1 = slider(-2.5, 2.5, 1/10)): graph = _MyGraph(x1) graph.show(ymin=-20, ymax=10) 
       
x1 

Click to the left again to hide and once more to show the dynamic interactive window

アニメーション

グラフの変化を分かりやすく表示する方法として、アニメーション機能も提供しています。

アニメーションでは、グラフのリストを作成し、それをanimate関数に渡し、描画範囲を xmin, xmax, ymin, ymaxで指定するだけで簡単にアニメーションが作成できます。 作成されたアニメーションの表示もshowメソッドを使います。

g_list = [_MyGraph(x1) for x1 in srange(-2.5,2.5,0.2)] a = animate(g_list, xmin=-2.5, xmax=2.5, ymin=-20, ymax=10) a.show() 
       

並べて表示

Sageのプロット結果は、縦に表示されてしまうため、結果を比較したときには不便です。

このような場合には、htmlコマンドにプロットしたいグラフのリストを渡すと、 表形式に変換して表示してくれます。表示するグラフのオプションにfigsizeでグラフの 大きさを小さくしておくとよいでしょう。

以下にsin曲線とcos曲線の表示例を示します。

# グラフを並べて表示する sin_plt = plot(sin(x), [x, -pi, pi], rgbcolor= 'green', figsize=4) cos_plt = plot(cos(x), [x, -pi, pi], figsize=4) html.table([['sin曲線', 'cos曲線'], [sin_plt, cos_plt]]) 
       
sin曲線 cos曲線
sin曲線 cos曲線

リストプロット

データを表示するのに便利なのが、list_plot関数です。

list_plot関数は、以下のように使用します。

list_plot(プロットするリスト, オプション)	

リストの要素に[x, y]形式で座標を指定すると分布図が表示されます。 また、plot関数でエラーで表示できない場合の代替手段としてlist_plot関数を使うこともあります。

以下にデータ点のプロットの場合とデータを結ぶ場合の例を示します。

# データを点でプロット list_plot([1, 2, 4, 3, 6]) 
       
# データを結ぶ list_plot([1, 2, 4, 3, 6], plotjoined=True) 
       

異なるデータを同時に表示する場合には、rgbcolorオプションで色をセットしたり、 legen_labelでデータの種類をセットすると便利です。

# データ(座標)のプロット c1 = [[1,2],[1,4],[2,4]] c2 = [[2,1],[5,1],[4,2]] # プロットして分布を確認 pl1 = list_plot(c1, rgbcolor='red', legend_label='c1') pl2 = list_plot(c2, rgbcolor ='blue', legend_label='c2') (pl1+pl2).show(xmin=0, xmax=5, ymin=0) 
       

関係を表示

プロットしたい関数ではなく、条件などの関係式を表示したいときがあります。 このような場合には、implicit_plotを使うと便利です。

implicit_plotの例として、単位円を表示してみます。 単位円の条件は、以下のように与えられます。 $$ x^2 + y^2 = 1 $$

これをimplicit_plotで表示すると以下のようになります。

# 関係を満たすグラフを表示する x, y = var('x y') i_plt = implicit_plot(x^2 + y^2 == 1, [x, -1.5, 1.5], [y, -1.5, 1.5]) i_plt.show(aspect_ratio=1) 
       

パラメトリックプロット(媒介変数表示)

x, yが時間変数t(パラメータ)によって表される場合、parametric_plot関数 を使って表示すると簡単です。

パラメトリックプロットの例として、以下のサイクロイド曲線をparametric_plot関数 で表示してみます。 $$ \begin{eqnarray} x = 2 (t - sin(t)) \\ y = 2 (1 - cos(t)) \end{eqnarray} $$

# 媒介変数表示 t = var('t') x = 2*(t-sin(t)) y = 2*(1-cos(t)) # サイクロイドのプロット(パラメトリックプロットの例) parametric_plot([x, y], (t, 0, 2*pi)) 
       

3次元グラフ

3次元のグラフには、plot3d関数を使用します。重ね合わせは2次元のグラフと同じように使えます。

表示された3次元図形はマウスで自由に拡大、回転することができます。(驚きました)

x, y = var('x y') plot3d(sin(x*y),(x,-pi,pi),(y,-pi,pi), mesh=True) 
       

等高線図

3次元情報を表示する場合によく使用する方法に投稿線図があります。

投稿線図は、contour_plot関数を使って表示します。 前のグラフと同じものをcontour_plot関数で表示すると以下のようになります。

var('x y') contour_plot(sin(x*y), [x, -pi, pi], [y, -pi, pi], aspect_ratio=1) 
       

基本図形

計算結果の表示の他に、補足説明などのために基本図形を表示したい場合があります。

以下によく使う基本図形を以下に示します。

  • 円: circle
  • 文字列: text
  • 線: line
  • 点: point
  • ポリゴン: polygon

円は以下のように表示します。
circle((座標), 半径)
circleの例を以下に示します。座標は原点(0, 0)、半径は1です。
circle((0,0), 1) 
       

文字列

次に文字列textです。表示する文字列には、$で囲んでlatexの数式を表示することもできます。 残念ながら、日本語が含まれているとエラーまたは文字化けします。

textは以下の形式で使用します。文字列の中心が指定した座標になるようにプロットされます。

text(文字列, (座標))
textの例を以下に示します。

test_plt = text('test', (1, 1)) eq_plt = text('$f(x) = x^2 + 1$', (0.5,0.5)) (test_plt + eq_plt).show(xmin=0, ymin=0) 
       

線(line)は、指定された座標のリストを線で結びます。 lineの使い方は、簡単です。

line([(開始座標), (終了座標)])

以下に例を示します。日本語が使えないため、タイトルをhtml関数で先に表示し、その後に図形を表示します。 show関数で表示領域を指定し、すべての図形が表示されるようにします。

html('<center>テスト</center>') c = circle((0.5,0.5), 1) l = line([(0,0), (1, 1)]) pt = point((0.5, 0.5), rgbcolor='white', pointsize=30, faceted=True) (c + l + pt).show(xmin=-1, xmax=2) 
       
テスト
テスト

ポリゴンの塗りつぶし

polygon関数を使うとリストで指定した座標の図形を塗りつぶします。

polygon([(0,0), (1,1), (0,1)])