PDLによるグラフの作成
PDLを使ってグラフを作成する方法を解説します。
PDL::Graphics::PLplotのインストール
グラフを描画するためにはPDL::Graphics::PLplotというモジュールをインストールします。(先にPDLをインストールしておく必要があります。)
Windows
ppmでインストールする場合は以下のコマンドを実行します。
ppm install http://www.sisyphusion.tk/ppm/PDL-Graphics-PLplot.ppd --force
Enterを押してインストールを完了します。環境変数の設定する必要があるので、表示された環境変数PLPLOT_LIBを設定してください。たとえば、以下のように表示されます。
In order to utilise the built in plplot capability set your PLPLOT_LIB environment variable to C:\Perl\site\lib\PDL\plplot_supp
pngがサポートされているバージョン
pngの出力がサポートされていたほうが便利なので、pngをサポートしているバージョンをインストールしたい場合は、次のコマンドを実行してください。
ppm install http://www.sisyphusion.tk/ppm_alt/PDL-Graphics-PLplot_alt.ppd --force
Enterを押してインストールを完了します。環境変数の設定する必要があるので、表示された環境変数PLPLOT_LIBとPLPLOT_DRV_DIRを設定してください。たとえば、以下のように表示されます。
Running PDL-Graphics-PLplot-0.62 install script... In order to utilise the built in plplot capability set your PLPLOT_LIB environment variable to: C:\Perl64\site\lib\PDL\plplot_supp And set your PLPLOT_DRV_DIR environment variable to: C:\Perl64\site\bin
簡単なグラフの作成
PDLでグラフを描画してみましょう。グラフを描画するために、PDL::Graphics::PLplotというモジュールを使います。
一次関数のグラフ
ではまず最初に一番簡単な「y = 2x」という一次関数のグラフを描いてみましょう。xyのグラフを作成するにはxyplotメソッドを使用します。
use PDL; use PDL::Graphics::PLplot; # PLPlotオブジェクトの作成(PNG形式でgraph.pngという名前で出力) my $pl = PDL::Graphics::PLplot->new(DEV => 'png', FILE => 'graph.png'); # xの値として0~99までを表すPDL変数を作成 my $x = pdl->sequence(100); # y = 2x my $y = 2 * $x; # グラフを作成 $pl->xyplot($x, $y); # クローズ $pl->close;
次のように1次関数のグラフを作成することができます。
[f:id:perlcodesample:20131106082618p:image:w500]
newのオプション
グラフのオプションをいくつか紹介しておきます。newメソッドの引数として渡すことができます。
my $pl = PDL::Graphics::PLplot->new( DEV => 'png', FILE => 'graph.png', PAGESIZE => [500, 400] );
グラフのサイズ
PAGESIZEで出力するグラフのサイズを指定できます。
PAGESIZE => [500, 400]
グラフを描画するときのオプション
グラフを描画するときに指定するオプションです。
$pl->xyplot($x, $y, XLAB => 'x', YLAB => 'y');
x軸のラベル
XLABでx軸のラベルを指定できます。
XLAB => 'x'
y軸のラベル
YLABでy軸のラベルを指定できます。
YLAB => 'y'
描画領域
BOXオプションで描画領域を指定できます。
BOX => [xの開始, xの終了, yの開始, yの終了]
以下のように指定します。
BOX => [0, 150, 0, 300]
x軸の目盛りラベルの幅
XTICKでx軸の目盛りラベルの幅を指定できます。
XTICK => 10
y軸の目盛りラベルの幅
YTICKでy軸の目盛りラベルの幅を指定できます。
YTICK => 10
タイトル
TITLEでグラフのタイトルを指定することができます。
TITLE => 'y = 2x'
ビューポート
VIEWPORTでグラフを実際にどの部分に描画するかを指定できます。0~1の割合で指定します。
VIEWPORT => [xの最小値の位置, xの最大値の位置, yの最小値の位置, yの最大値の位置]
以下のように指定します。
VIEWPORT => [0.1, 0.5, 0.1, 0.5]
x軸を描画する
x軸を描画するにはXBOXにbcnstaを指定します。この値のデフォルトはbcnstでaを加えると、x軸を描画できます。
XBOX => 'bcnsta',
x軸を描画する
y軸を描画するにはYBOXにbcnstaを指定します。この値のデフォルトはbcnstでaを加えると、y軸を描画できます。
YBOX => 'bcnsta',
グラフの色
COLORでグラフの色を指定できます。
COLOR => 'RED'
以下が色の種類です。
BLACK GREEN WHEAT BLUE RED AQUAMARINE GREY BLUEVIOLET YELLOW PINK BROWN CYAN TURQUOISE MAGENTA SALMON WHITE ROYALBLUE DEEPSKYBLUE VIOLET STEELBLUE1 DEEPPINK MAGENTA DARKORCHID1 PALEVIOLETRED2 TURQUOISE1 LIGHTSEAGREEN SKYBLUE FORESTGREEN CHARTREUSE3 GOLD2 SIENNA1 CORAL HOTPINK LIGHTCORAL LIGHTPINK1 LIGHTGOLDENROD
サンプル
「y = 1/2 x + 10」という一次関数のグラフを書いてみました。
[f:id:perlcodesample:20131106082619p:image:w500]
use PDL; use PDL::Graphics::PLplot; # PLPlotオブジェクトの作成(PNG形式でgraph.pngという名前で出力) my $pl = PDL::Graphics::PLplot->new( DEV => 'png', FILE => 'graph.png', PAGESIZE => [600, 300], ); # xの値として0~99までを表すPDL変数を作成 my $x = pdl->sequence(100) - 50; # y = 2x my $y = (1/2) * $x + 10; # グラフを作成 $pl->xyplot( $x, $y, XLAB => 'x', YLAB => 'y', TITLE => 'y = 1/2 x + 10', XBOX => 'bcnsta', YBOX => 'bcnsta', COLOR => 'RED', JUST => 1 ); # クローズ $pl->close;
n次関数のグラフ
では3次関数を描画してみましょう。どんな形をしているのかをすぐに知れるのは面白いですね。
[f:id:perlcodesample:20131106102521p:image:w500]
use strict; use warnings; use PDL; use PDL::Graphics::PLplot; # PLPlotオブジェクトの作成 my $pl = PDL::Graphics::PLplot->new(DEV => 'png', FILE => 'graph.png'); # xの値(0~4まで0.1きざみ) my $x = pdl->sequence(40) * 0.1; # y = x^3 - 6x^2 + 11x -6 my $y = ($x ** 3) - 6 * ($x ** 2) + (11 * $x) - 6; # グラフを作成 $pl->xyplot($x, $y); # クローズ $pl->close;
三角関数
次は三角関数(sin)のグラフです。三角関数の計算を行うにはsinメソッドを使用します。これはPDL::Mathで定義されています。
[f:id:perlcodesample:20131106102522p:image:w500]
use strict; use warnings; use PDL; use PDL::Graphics::PLplot; # PLPlotオブジェクトの作成 my $pl = PDL::Graphics::PLplot->new(DEV => 'png', FILE => 'graph.png'); # xの値 my $x = pdl->sequence(200) * 0.1; # y = sin(x) my $y = $x->sin; # グラフを作成 $pl->xyplot($x, $y); # クローズ $pl->close;
指数関数
次は指数関数のグラフです。演算する値eをPDL変数として作成しているところに注意してください。
[f:id:perlcodesample:20131106102523p:image:w500]
use strict; use warnings; use PDL; use PDL::Graphics::PLplot; # PLPlotオブジェクトの作成 my $pl = PDL::Graphics::PLplot->new(DEV => 'png', FILE => 'graph.png'); # e my $e = pdl [exp(1)]; # xの値 my $x = pdl->sequence(60) * 0.1 - 3; # y = e^x my $y = $e ** $x; # グラフを作成 $pl->xyplot($x, $y); # クローズ $pl->close;
対数関数(自然対数)
最後は対数関数(自然対数)のグラフです。対数関数(自然対数)の計算を行うにはlogメソッドを使用します。これはPDL::Mathで定義されています。log0の値は無限小になるので、グラフは0.1からスタートしていることに注意してください。
[f:id:perlcodesample:20131106102524p:image:w500]
use strict; use warnings; use PDL; use PDL::Graphics::PLplot; # PLPlotオブジェクトの作成 my $pl = PDL::Graphics::PLplot->new(DEV => 'png', FILE => 'graph.png'); # xの値 my $x = pdl->sequence(100) * 0.1 + 0.1; # y = log(x) my $y = $x->log; # グラフを作成 $pl->xyplot($x, $y); # クローズ $pl->close;
ストリッププロット - 1つのx軸と複数のy軸のグラフ
一つのx軸と複数のy軸のグラフはストリッププロットと呼ばれstripplotsメソッドを使って描画することができます。
[f:id:perlcodesample:20131107113838p:image:w500]
use strict; use warnings; use PDL; use PDL::Graphics::PLplot; # PLPlotオブジェクトの作成 my $pl = PDL::Graphics::PLplot->new(DEV => 'png', FILE => 'graph.png'); # データ my $x = pdl->sequence(20); my $pi = 4 * atan2(1,1); my $y1 = $x ** 2; my $y2 = sqrt $x; my $y3 = $x ** 3; my $y4 = sin(($x/20) * 2 * $pi); my $ys = $y1->cat($y2, $y3, $y4); # ストリッププロット $pl->stripplots( $x, $ys, PLOTTYPE => 'LINE', TITLE => 'functions', YLAB => ['x**2', 'sqrt(x)', 'x**3', 'sin(x/20*2pi)'], COLOR => ['GREEN', 'DEEPSKYBLUE', 'DARKORCHID1', 'DEEPPINK'], XLAB => 'X label' ); $pl->close;