ローレンツ曲線作成ツール PHP-LorenzCurve を作りました。(PHP >= 8.1)
Githubで公開しています。Composerでインストールできます。
このような感じのローレンツ曲線を簡単に作ることができます。



前提条件
- PHP 8.1以降インストール済
- Imagick PHP Extension インストール済
- Composerインストール済
- 当記事はUbuntu24.04(WSL2)で作業
PHP + Imagick (Ubuntu)の環境構築については次の記事をご覧ください。
インストール
ローカルの作業用フォルダを作り、作業用フォルダ内で次のコマンドを実行します。
mkdir lorenz-curve
cd lorenz-curve
composer require macocci7/php-lorenz-curve

使用例のコピー
使用例が同梱されているので、それをコピーしていじってみるのが良いと思います。
examplesフォルダをコピーして中に入ります。
cp -ra vendor/macocci7/php-lorenz-curve/examples ./
cd examples

基本的な使い方
基本的な使い方は次の通りです。
- autoload.php 取り込み
- インスタンス生成
- データセット
- 階級幅セット
- 画像保存
▼「examples/BasicUsage.php」
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Macocci7\PhpLorenzCurve\LorenzCurve;
$lc = new LorenzCurve(); // インスタンス生成
$lc
->setData([1, 5, 10, 15, 20]) // データセット
->setClassRange(5) // 階級幅セット
->create('img/BasicUsage.png'); // 画像保存
実行してみます。
php -f BasicUsage.php

「examples/img/BasicUsage.png」が生成されます。

グリッド表示
グリッドを表示させるには「grid()」メソッドを使います。
▼引数
- グリッド線の幅(ピクセル)
- グリッド線の色(16進数カラーコード)
▼「examples/DrawGrid.php」
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Macocci7\PhpLorenzCurve\LorenzCurve;
$lc = new LorenzCurve();
$lc
->setData([1, 5, 10, 15, 20])
->setClassRange(5)
->grid(1, '#ffcccc') // 幅:1ピクセル、色:薄ピンク
->create('img/DrawGrid.png');
実行してみます。
php -f DrawGrid.php

「examples/img/DrawGrid.png」が生成されます。

上に凸の曲線
ローレンツ曲線は基本的には下に凸となりますが、
度数分布表の階級をデフォルトの小さい順ではなく、
大きい順に並べ替えることで上に凸となります。
「reverseClasses()」メソッドを使うことで階級を大きい順に並べ替えます。
▼「examples/UpwardConvexCurve.php」
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Macocci7\PhpLorenzCurve\LorenzCurve;
$lc = new LorenzCurve();
$lc
->setData([1, 5, 10, 15, 20])
->setClassRange(5)
->reverseClasses() // 階級を大きい順に並べ替える
->grid(1, '#ffcccc')
->create('img/UpwardConvexCurve.png');
実行してみます。
php -f UpwardConvexCurve.php
「examples/img/UpwardConvexCurve.png」が生成されます。

画像サイズ
デフォルトの画像サイズは
- 幅:400ピクセル
- 高さ:300ピクセル
となっています。
「resize()」メソッドで画像サイズを指定できます。
▼引数
- 幅:ピクセル(正の整数)
- 高さ:ピクセル(正の整数)
▼「examples/ResizeImage.php」
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Macocci7\PhpLorenzCurve\LorenzCurve;
$lc = new LorenzCurve();
$lc
->setData([1, 5, 10, 15, 20])
->setClassRange(5)
->grid(1, '#ffcccc')
->resize(450, 400) // 幅450ピクセル、高さ400ピクセル
->create('img/ResizeImage.png');
▼実行結果

プロットエリア
ローレンツ曲線を描画する矩形領域(0≦x≦1, 0≦y≦1 に相当)
をプロットエリアと呼んでいますが、
デフォルトの属性は次のようになっています。
- x方向オフセット: 画像幅の10%
- y方向オフセット: 画像高さの10%
- 幅: 画像幅の80%
- 高さ: 画像高さの70%
- 背景色: null (透明)
「plotarea()」メソッドでこれらの属性を変更できます。
▼引数
- offset:配列([int $offsetX, int $offsetY])
- width: プロットエリアの幅(ピクセル)
- height: プロットエリアの高さ(ピクセル)
- backgroundColor:背景色(16進数カラーコード)
▼「examples/SetPlotareaAttrs.php」
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Macocci7\PhpLorenzCurve\LorenzCurve;
$lc = new LorenzCurve();
$lc
->setData([1, 5, 10, 15, 20])
->setClassRange(5)
->grid(1, '#ffcccc')
->plotarea( // プロットエリアの属性変更
offset: [80, 50], // xオフセット80ピクセル、yオフセット50ピクセル
width: 280, // 幅280ピクセル
height: 200, // 高さ200ピクセル
backgroundColor: '#eeeeee', // 背景色:薄いグレー
)
->create('img/SetPlotareaAttrs.png');
▼実行結果

キャプションとラベル
キャプションは「caption()」メソッド、
ラベルは「labelX()」「labelY()」メソッドで設定できます。
▼「caption()」メソッドの引数
- caption:キャプション文字列
- offsetX:x方向オフセット(ピクセル)
- offsetY:y方向オフセット(ピクセル)
▼「labelX()」メソッドの引数
- label:x方向ラベル文字列
- offsetX:x方向オフセット(ピクセル)
- offsetY:y方向オフセット(ピクセル)
▼「labelY()」メソッドの引数
- label:y方向ラベル文字列
- offsetX:x方向オフセット(ピクセル)
- offsetY:y方向オフセット(ピクセル)
▼「examples/CaptionLabels.php」
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Macocci7\PhpLorenzCurve\LorenzCurve;
$lc = new LorenzCurve();
$lc
->setData([1, 5, 10, 15, 20])
->setClassRange(5)
->grid(1, '#ffcccc')
->plotarea(offset: [60, 40])
->caption('CAPTION')
->labelX('Cumulative Relative Frequency', offsetX: 0, offsetY: 10)
->labelY('Cumulative Relative Subtotal')
->create('img/CaptionLabels.png');
▼実行結果

配列による属性変更
「config()」メソッドに、属性名をキーとしたハッシュ配列を渡すことで各属性を変更可能です。
変更可能な属性については「変更可能な属性」をご覧ください。
▼「examples/ConfigFromArray.php」
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Macocci7\PhpLorenzCurve\LorenzCurve;
$lc = new LorenzCurve();
$lc
->setData([1, 5, 10, 15, 20])
->setClassRange(5)
->config([
'canvasBackgroundColor' => '#3333cc',
'showGrid' => true,
'gridWidth' => 1,
'gridColor' => '#0066ff',
'axisWidth' => 3,
'axisColor' => '#ffffff',
'scaleWidth' => 2,
'scaleLength' => 6,
'scaleColor' => '#ffffff',
'scaleFontSize' => 14,
'scaleFontColor' => '#ffffff',
'lorenzCurveWidth' => 1,
'lorenzCurveColor' => '#ffff00',
'lorenzCurveBackgroundColor' => null, // transparent
'completeEqualityLineWidth' => 3,
'completeEqualityLineColor' => '#ffffff',
'completeEqualityLineDash' => [8, 8],
'fontColor' => '#ffffff',
'caption' => 'Config From Array',
])
->create('img/ConfigFromArray.png');
▼実行結果

Neonファイルによる属性変更
「config()」メソッドの引数に、Neon形式で各属性の設定を記述したNeonファイルのパスを渡すことで、各属性を変更可能です。
Neonについては次の記事をご覧ください。
変更可能な属性については「変更可能な属性」をご覧ください。
▼「examples/ConfigFromFile.neon」
canvasBackgroundColor: '#3333cc'
showGrid: true
gridWidth: 1
gridColor: '#0066ff'
axisWidth: 3
axisColor: '#ffffff'
scaleWidth: 2
scaleLength: 6
scaleColor: '#ffffff'
scaleFontSize: 14
scaleFontColor: '#ffffff'
lorenzCurveWidth: 1
lorenzCurveColor: '#ffff00'
lorenzCurveBackgroundColor:
completeEqualityLineWidth: 3
completeEqualityLineColor: '#ffffff'
completeEqualityLineDash: [8, 8]
fontColor: '#ffffff'
caption: 'Config From File'
▼「examples/ConfigFromFile.php」
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Macocci7\PhpLorenzCurve\LorenzCurve;
$lc = new LorenzCurve();
$lc
->setData([1, 5, 10, 15, 20])
->setClassRange(5)
->config('ConfigFromFile.neon')
->create('img/ConfigFromFile.png');
▼実行結果

変更可能な属性
変更可能な属性は次の通りです。
属性 | 型 | デフォルト | 例 | 説明 |
---|---|---|---|---|
canvasSize[‘width’] | int | 400 | 450 | 画像幅 |
canvasSize[‘height’] | int | 300 | 400 | 画像高さ |
canvasBackgroundColor | string | #ffffff | #0000ff | 画像背景色 |
plotarea[‘offset’] | int[] | 画像サイズの10% | [40, 50] | プロットエリアのオフセット |
plotarea[‘width’] | int | 画像幅の80% | 500 | プロットエリアの幅 |
plotarea[‘height’] | int | 画像高さの70% | 400 | プロットエリアの高さ |
plotarea[‘backgroundColor’] | string | null | #cccccc | プロットエリアの背景色 |
showGrid | bool | false | true | グリッド線表示可否 |
gridWidth | int | 1 | 2 | グリッド線の幅 |
gridColor | string | #cccccc | #0099ff | グリッド線の色 |
axisWidth | int | 2 | 3 | 座標軸の幅 |
axisColor | string | #000000 | #ffffff | 座標軸の色 |
scaleWidth | int | 1 | 2 | 目盛線の幅 |
scaleLength | int | 3 | 6 | 目盛線の長さ |
scaleColor | string | #000000 | #ffffff | 目盛線の色 |
scaleFontSize | int | 16 | 14 | 目盛値のフォントサイズ |
scaleFontPath | string | fonts/ipaexg.ttf | fonts/myfont.ttf | 目盛値のフォントパス |
scaleFontColor | string | #000000 | #ffffff | 目盛値の色 |
lorenzCurveWidth | int | 2 | 1 | ローレンツ曲線の幅 |
lorenzCurveColor | string | #000000 | #ffff00 | ローレンツ曲線の色 |
lorenzCurveBackgroundColor | string | #ffcc00 | null | ローレンツ曲線と完全平等線とで囲まれた領域の色 |
completeEqualityLineWidth | int | 1 | 3 | 完全平等線の幅 |
completeEqualityLineColor | string | #999999 | #ffffff | 完全平等線の色 |
completeEqualityLineDash | int[] | [4, 4] | [8, 8] | 完全平等線の破線パターン(実線と空白のピクセル数) |
fontPath | string | fonts/ipaexg.ttf | fonts/myfont.ttf | フォントパス |
fontSize | int | 16 | 14 | フォントサイズ |
fontColor | string | #333333 | #ffffff | フォントカラー |
labelX | string | (空文字列) | 累積相対度数 | x方向ラベル |
labelXOffsetX | int | 0 | -10 | x方向ラベルのx方向オフセット |
labelXOffsetY | int | 0 | 10 | x方向ラベルのy方向オフセット |
labelY | string | (空文字列) | 累積相対小計 | y方向ラベル |
labelYOffsetX | int | 0 | -10 | y方向ラベルのx方向オフセット |
labelYOffsetY | int | 0 | -10 | y方向ラベルのy方向オフセット |
caption | string | (空文字列) | 見出し | キャプション |
captionOffsetX | int | 0 | 10 | キャプションのx方向オフセット |
captionOffsetY | int | 0 | -10 | キャプションのy方向オフセット |
ジニ係数
「getGinisCoefficient()」メソッドを使うことで、
画像を生成せずに、ジニ係数だけを取得することが可能です。
▼「examples/GinisCoefficient.php」
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Macocci7\PhpLorenzCurve\LorenzCurve;
$lc = new LorenzCurve();
var_dump(
$lc
->setData([1, 5, 10, 15, 20])
->setClassRange(5)
->getGinisCoefficient()
);
▼実行結果
double(0.37647058823529)
ジニ係数0のローレンツ曲線
すべて同じ値のデータをセットしてローレンツ曲線を生成すると、
ローレンツ曲線が完全平等線と一致し、
ジニ係数はゼロ(データの偏り無し)となります。
▼「examples/GinisCoefficient0.php」
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Macocci7\PhpLorenzCurve\LorenzCurve;
$lc = new LorenzCurve();
$lc
->setData([1, 1, 1, 1, 1])
->setClassRange(5)
->grid(1, '#ffcccc')
->create('img/GinisCoefficient0.png');
var_dump($lc->getGinisCoefficient());
▼実行結果

ジニ係数ほぼ1のローレンツ曲線
多数のデータがあり、1個を除いて他がすべてゼロのデータをセットしてローレンツ曲線を生成すると、ジニ係数がほぼほぼ直角となり、ローレンツ曲線はほぼほぼ1となります。
▼「examples/GinisCoefficientAlmost1.php」
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Macocci7\PhpLorenzCurve\LorenzCurve;
$lc = new LorenzCurve();
$data = array_fill(0, 500, 0);
$data[] = 5;
$lc
->setData($data)
->setClassRange(5)
->grid(1, '#ffcccc')
->create('img/GinisCoefficientAlmost1.png');
var_dump($lc->getGinisCoefficient());
▼実行結果

double(0.99800399201597)
ジニ係数1のローレンツ曲線
ゼロでない1個だけのデータをセットしてローレンツ曲線を生成すると、ローレンツ曲線が直角となり、ジニ係数が1になります。
▼「examples/GinisCoefficient1.php」
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Macocci7\PhpLorenzCurve\LorenzCurve;
$lc = new LorenzCurve();
$lc
->setData([1])
->setClassRange(5)
->grid(1, '#ffcccc')
->create('img/GinisCoefficient1.png');
var_dump($lc->getGinisCoefficient());
▼実行結果

double(1)
コメント