PDLによるグラフの作成




  1. Perl




  2. モジュール



  3. 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::Lite;
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次関数のグラフを作成することができます。

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軸を描画するにはXBOXbcnstaを指定します。この値のデフォルトはbcnstaを加えると、x軸を描画できます。

XBOX => 'bcnsta',

x軸を描画する

 y軸を描画するにはYBOXbcnstaを指定します。この値のデフォルトはbcnstaを加えると、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」という一次関数のグラフを書いてみました。

use PDL::Lite;
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次関数を描画してみましょう。どんな形をしているのかをすぐに知れるのは面白いですね。


use strict;
use warnings;

use PDL::Lite;
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で定義されています。


use strict;
use warnings;

use PDL::Lite;
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変数として作成しているところに注意してください。


use strict;
use warnings;

use PDL::Lite;
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からスタートしていることに注意してください。


use strict;
use warnings;

use PDL::Lite;
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メソッドを使って描画することができます。


use strict;
use warnings;

use PDL::Lite;
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;