[[FrontPage]] #contents 2011/06/16からのアクセス回数 &counter; ここで紹介したSageワークシートは、以下のURLからダウンロードできます。 http://www15191ue.sakura.ne.jp:8000/home/pub/4/ また、Sageのサーバを公開しているサイト(http://www.sagenb.org/, http://www15191ue.sakura.ne.jp:8000/)にユーザIDを作成することで、ダウンロードしたワークシートを アップロードし、実行したり、変更していろいろ動きを試すことができます。 ** グラフの使い方 [#qb8a1b08] Sageでのグラフの使い方について、説明します。 [[レファレンスマニュアル>http://sagemath.com/doc/reference/sage/plot/plot.html]] を参考にしながら見てください。 *** 3次元多項式をもう一度 [#x65b1b0b] [[sage/text/Sageを使ってみよう]] でプロットした3次元多項式について、plot関数の使い方も含めて詳しくみてみましょう。 plotの呼び出しは、以下の形式で覚えると便利です。 #pre{{ plot(関数, [変数名, 最小, 最大], オプション) }} オプションは、省略可能です。plotのオプションは、plot.optionsで知ることができます。 それ以外にもGraphicsのオプションも使えます。よく使うオプションを以下にしめします。 - 描画範囲指定のxmin, xmax, ymin, ymax - グラフの比率を指定するaspect_ratio - 線の色指定のrgbcolor 3次元多項式の場合には、最初にプロットで使用する変数xをvar関数で定義します。 次に関数fを定義します。今回はplotの結果をf_pltに代入していますので、最後に show関数でf_pltを表示します。 f_plt変数に代入することによって、後で他のグラフと重ね合わせて表示することが できます。 sageへの入力: #pre{{ x = var('x') f = x^3 - x^2 - 2*x f_plt = plot(f, [x, -2.5, 2.5]); show(f_plt) }} &ref(out1.png); plot.optionsを知るには、plot?でヘルプを表示したり、plot_optionsを表示するとよいでしょう。 sageへの入力: #pre{{ # plotのオプションを知る plot.options }} #pre{{ {'fillalpha': 0.5, 'detect_poles': False, 'plot_points': 200, 'thickness': 1, 'alpha': 1, 'adaptive_tolerance': 0.01, 'fillcolor': 'automatic', 'adaptive_recursion': 5, 'exclude': None, 'legend_label': None, 'rgbcolor': (0, 0, 1), 'fill': False} }} *** 接線を求める [#m6ca2018] 点\((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の微分をセットします。 sageへの入力: #pre{{ # (x0, y0)での接線を求める x0 = var('x0') y0 = f(x=x0) f1 = diff(f, x); view(f1) }} &ref(out2.png); 材料がそろったので、接線の式を定義し表示します。確認のために\(x_0 = 0\)での式も表示します。 \(x_0 = 0\)での接線は、原点を通り傾き-2と求まりました。 sageへの入力: #pre{{ # x0 = 0での接線の式 y = f1(x=x0)*(x - x0) + y0; view(y) view(y(x0 = 0)) }} &ref(out3.png); この直線をプロットしてみましょう。 x0=0での接線の式なので、plotの引数にはyではなく、y(x0=0)が渡されていることに注意してください。 重ね合わせたときに区別できるように線の色を緑にします。線の色は、rgbcolorオプションで指定します。 sageへの入力: #pre{{ y_plt = plot(y(x0=0), [x, -2.5, 2.5], rgbcolor='green') show(y_plt) }} &ref(out4.png); 接線を計算したポイントを示すために、point関数を使って点を表示します。 point関数の使い方は、以下の通りです。座標は、リストまたはタプル形式で与えます。 #pre{{ point(座標, オプション属性(pointsize, rgccolor, faceted等)) }} sageへの入力: #pre{{ # x = 0のポイントをセット pt = (0, f(x=0)) pt_plt = point(pt, rgbcolor='red', pointsize=30) }} *** グラフの重ね合わせ [#tc5697ee] Sageのグラフ表示機能の最大の特徴は、重ね合わせです。 これまで計算した以下の結果を同時に表示してみましょう。 - f_plt: 3次元多項式(青) - y_plt: 接線(緑) - pt_plt: 接点(赤) 重ね合わせは至って簡単で上記の3つの変数を足し合わせて、showメソッドで表示するだけです。 sageへの入力: #pre{{ (f_plt + y_plt + pt_plt).show() }} &ref(out5.png); *** ユーザ指定(インタラクティブ) [#mcedc362] Sageのノートブックでのもう一つの特徴にユーザが逐次値を指定することができる、 インタラクティブ機能があります。 接点の座標x0をユーザ任意に指定できるように、_MyGraph関数を定義して、 与えられたx1でのグラフの重ね合わせを返すようにします。 sageへの入力: #pre{{ # 与えられた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は先の結果を再利用 }} インタラクティブ機能を使う場合、 #pre{{ @interact }} の後に関数を定義します。ここでは、_(アンダーバー)という特殊な関数名を指定します。 関数の引数で与えられた変数をユーザが入力することができるようになります。 ここでは、slider関数を使って-2.5から2.5の範囲で1/10の刻みのスライダー バーを表示してx1を指定できるようにします。 関数の内容は、_MyGraph関数でx1で指定された座標の接線とポイントの重ね合わせ グラフを返し、showメソッドでグラフを表示します。グラフ表示範囲がx1の値でかわらない ようにymin, ymaxで範囲を指定します。 sageへの入力: #pre{{ @interact def _(x1 = slider(-2.5, 2.5, 1/10)): graph = _MyGraph(x1) graph.show(ymin=-20, ymax=10) }} &ref(out6.png); *** アニメーション [#bc31eb50] グラフの変化を分かりやすく表示する方法として、アニメーション機能も提供しています。 アニメーションでは、グラフのリストを作成し、それをanimate関数に渡し、描画範囲を xmin, xmax, ymin, ymaxで指定するだけで簡単にアニメーションが作成できます。 作成されたアニメーションの表示もshowメソッドを使います。 sageへの入力: #pre{{ 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() }} &ref(out7.gif); *** 並べて表示 [#u0bd618f] Sageのプロット結果は、縦に表示されてしまうため、結果を比較したときには不便です。 このような場合には、htmlコマンドにプロットしたいグラフのリストを渡すと、 表形式に変換して表示してくれます。表示するグラフのオプションにfigsizeでグラフの 大きさを小さくしておくとよいでしょう。 以下にsin曲線とcos曲線の表示例を示します。 sageへの入力: #pre{{ # グラフを並べて表示する 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]]) }} &ref(out8.png); *** リストプロット [#e1bf777f] データを表示するのに便利なのが、list_plot関数です。 list_plot関数は、以下のように使用します。 #pre{{ list_plot(プロットするリスト, オプション) }} リストの要素に[x, y]形式で座標を指定すると分布図が表示されます。 また、plot関数でエラーで表示できない場合の代替手段としてlist_plot関数を使うこともあります。 以下にデータ点のプロットの場合とデータを結ぶ場合の例を示します。 sageへの入力: #pre{{ # データを点でプロット list_plot([1, 2, 4, 3, 6]) }} &ref(out9.png); sageへの入力: #pre{{ # データを結ぶ list_plot([1, 2, 4, 3, 6], plotjoined=True) }} &ref(out10.png); 異なるデータを同時に表示する場合には、rgbcolorオプションで色をセットしたり、 legen_labelでデータの種類をセットすると便利です。 sageへの入力: #pre{{ # データ(座標)のプロット 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) }} &ref(out11.png); *** 関係を表示 [#y6836408] プロットしたい関数ではなく、条件などの関係式を表示したいときがあります。 このような場合には、implicit_plotを使うと便利です。 implicit_plotの例として、単位円を表示してみます。 単位円の条件は、以下のように与えられます。 $$ x^2 + y^2 = 1 $$ これをimplicit_plotで表示すると以下のようになります。 sageへの入力: #pre{{ # 関係を満たすグラフを表示する 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) }} &ref(out12.png); *** パラメトリックプロット(媒介変数表示) [#hac94f7f] x, yが時間変数t(パラメータ)によって表される場合、parametric_plot関数 を使って表示すると簡単です。 パラメトリックプロットの例として、以下のサイクロイド曲線をparametric_plot関数 で表示してみます。 $$ \begin{eqnarray} x = 2 (t - sin(t)) \\ y = 2 (1 - cos(t)) \end{eqnarray} $$ sageへの入力: #pre{{ # 媒介変数表示 t = var('t') x = 2*(t-sin(t)) y = 2*(1-cos(t)) # サイクロイドのプロット(パラメトリックプロットの例) parametric_plot([x, y], (t, 0, 2*pi)) }} &ref(out13.png); *** 3次元グラフ [#lfe23293] 3次元のグラフには、plot3d関数を使用します。重ね合わせは2次元のグラフと同じように使えます。 表示された3次元図形はマウスで自由に拡大、回転することができます。(驚きました) sageへの入力: #pre{{ x, y = var('x y') plot3d(sin(x*y),(x,-pi,pi),(y,-pi,pi), mesh=True) }} &ref(out14.png); *** 等高線図 [#u3ebd4f6] 3次元情報を表示する場合によく使用する方法に等高線図があります。 等高線図は、contour_plot関数を使って表示します。 前のグラフと同じものをcontour_plot関数で表示すると以下のようになります。 sageへの入力: #pre{{ var('x y') contour_plot(sin(x*y), [x, -pi, pi], [y, -pi, pi], aspect_ratio=1) }} &ref(out15.png); *** 基本図形 [#ddc273dd] 以下によく使う基本図形を以下に示します。 - 円: circle - 文字列: text - 線: line - 点: point - ポリゴン: polygon *** 円 [#m35b3026] 円は以下のように表示します。 #pre{{ circle((座標), 半径) }} circleの例を以下に示します。座標は原点(0, 0)、半径は1です。 sageへの入力: #pre{{ circle((0,0), 1) }} &ref(out16.png); *** 文字列 [#obf462af] 次に文字列textです。表示する文字列には、$で囲んでlatexの数式を表示することもできます。 残念ながら、日本語が含まれているとエラーまたは文字化けします。 textは以下の形式で使用します。文字列の中心が指定した座標になるようにプロットされます。 #pre{{ text(文字列, (座標)) }} textの例を以下に示します。 sageへの入力: #pre{{ 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) }} &ref(out17.png); *** 線 [#p51fd638] 線(line)は、指定された座標のリストを線で結びます。 lineの使い方は、簡単です。 #pre{{ line([(開始座標), (終了座標)]) }} 以下に例を示します。日本語が使えないため、タイトルをhtml関数で先に表示し、その後に図形を表示します。 show関数で表示領域を指定し、すべての図形が表示されるようにします。 sageへの入力: #pre{{ 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) }} &ref(out18.png); *** ポリゴンの塗りつぶし [#n47d3757] polygon関数を使うとリストで指定した座標の図形を塗りつぶします。 sageへの入力: #pre{{ polygon([(0,0), (1,1), (0,1)]) }} &ref(out19.png); ** コメント [#rdb2110b] #vote(おもしろかった[3],そうでもない[0],わかりずらい[0]) #vote(おもしろかった[4],そうでもない[0],わかりずらい[0]) 皆様のご意見、ご希望をお待ちしております。 - p=plot(sin,(-2*pi,2*pi); p.save('demo.png') で保存した図をノートブックに読み込む方法を教えてください。よろしくお願いします。 -- [[ysato ]] &new{2014-09-24 (水) 23:33:48}; - p=plot(sin,(-2*pi,2*pi)); 最後の括弧が抜けてしまったので訂正します。 -- [[ysato ]] &new{2014-09-24 (水) 23:36:30}; - ysatoさま、私はp.save(DATA + 'demo.png')で保存し、html('<img src="demo.png"/>)で表示しています。 -- [[竹本 浩]] &new{2014-09-26 (金) 23:02:54}; - 'sage/text/Rとの連携' で定義された関数 postGraph に使われていることを確認しました。ありがとうございました。 -- [[ysato]] &new{2014-09-28 (日) 22:44:59}; - h4>等高線図</h4>、h4>線</h4> の表示があります。小さなことですみません。 -- [[ysato]] &new{2014-09-29 (月) 12:11:09}; - ysatoさま、ご指摘ありがとうございます。修正しました。 -- [[竹本 浩]] &new{2014-10-02 (木) 00:17:10}; #comment_kcaptcha