PHPでJpGraphを使ってグラフ生成してみる

PHPでグラフ生成できるライブラリないかなーとか思って調べたところ「JpGraph」があったのでそれを使ってみるだけです

:::note warn
JpGraphコミュニティ版はQPL 1.0とされており、非営利目的であれば利用できます
:::

# JpGraphのダウンロード
https://jpgraph.asial.co.jp/download/

上記のリンクより`jpgraph-x.x.x.tar.gz`をダウンロードして任意の場所で解凍します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/dc98ad1f-edc9-0a9b-dfa3-21b276f01a02.png)

# とりあえずサンプルを動かしてみる

https://jpgraph.asial.co.jp/examples/accbarex1

上記のページのaccbarex1.phpをコピペして実行してみた。

### こういう表示になるそうだが...
サンプル上のページにある表示では
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/aa871f12-9cd9-10d9-d0ae-4833e22d5c6b.png)

### 実際には
こちらで動作させてみると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/9e0f8496-666a-2023-0b4d-a3c0c318a6db.png)

```php
// Create the bar plots
$b1plot = new BarPlot($data1y);
$b1plot->SetFillColor("orange");
$b1plot->value->Show();
$b2plot = new BarPlot($data2y);
$b2plot->SetFillColor("blue");
$b2plot->value->Show();
```
SetFillColorで色が指定されているのにもかかわらず水色とピンク色になってるじゃないか！

## 解決策 (SetFillColorが効かない問題)
https://stackoverflow.com/questions/6989701/jpgraph-wont-change-colors-on-my-barplot

いろいろ試したり調べてみたりすると最終的にたどり着いたのがこのstack overflowのページだった。

### 解決策1「テーマを適用させない」
先ほどのstack overflowの2、3つ目の回答にありました。

```php
$graph = new Graph(500,400);
$graph->ClearTheme(); // これを追加する
$graph->SetScale("textlin");
```

バージョンによってはデフォルトのテーマが設定されているようで、サンプルのコードが最新のJpGraphでは動作しなくなっているようだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/2bff0466-bc84-b8b6-7782-38e8e2732bd1.png)

これでヨシ！

### 解決策2 (推奨)「Plotをデザイン変更前にグラフへ追加しておく」
https://webdeveloperoddities.blogspot.com/2010/10/jpgraph-cannot-change-line-colour-or.html

上記リンクによるとこれについて問い合わせたようで以下の返答が来たようです。

>バージョン 3.5.0b1 では、各プロットのデザインを変更するメソッドは、 $graph->add($plot) メソッドの後に使用する必要があります。

`$data2y=array(18,2,1,7,5,4);` と `$graph->title->Set("Accumulated bar plots");`の間のコードを以下のように作成したBarPlotを先に追加するよう順序を変更してみた。

```php
// Create the graph. These two calls are always required
$graph = new Graph(500,400);
$graph->SetScale("textlin");

$b1plot = new BarPlot($data1y);
$b2plot = new BarPlot($data2y);

// Create the grouped bar plot
$gbplot = new AccBarPlot(array($b1plot,$b2plot));

// ...and add it to the graPH
$graph->Add($gbplot);

$graph->SetShadow();
$graph->img->SetMargin(40,30,20,40);

// Create the bar plots
$b1plot->SetFillColor("orange");
$b1plot->value->Show();
$b2plot->SetFillColor("blue");
$b2plot->value->Show();
```

これはデフォルトのテーマ(UniversalTheme)が設定されているのでサンプル通りの表示ではないが、解決策1は無理くりなので解決策2の書き方の方が良さそうだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/db121406-6e13-558c-8e86-9b12212c43ec.png)

# いざグラフを作ってみる
2024年12月のプログラミング言語ランキングTOP5でもつくってみる。
データは以下のTIOBE インデックスが記載しているものを使います。

https://www.tiobe.com/tiobe-index/

```php
<?php
// ライブラリ jpgraph.phpが入っているところを指定する
require_once "src/jpgraph.php";
require_once "src/jpgraph_bar.php";

// データやらの配列
$name = ["Python", "C++", "Java", "C", "C#"];
$data = [23.84, 10.82, 9.72, 9.10, 4.87];

$graph = new Graph(540, 360); // グラフを作成
$graph->SetScale("textlin"); // 目盛の指定
$graph->img->SetMargin(35, 35, 35, 35); // 余白の指定

$graph->title->Set("Programinng Lang Ranking"); // タイトル

$graph->xaxis->SetTickLabels($name); // X座標のラベル

$barplot = new BarPlot($data); // $dataから棒プロット(グラフ)を作成
$graph->Add($barplot); // グラフにプロットを追加

// 棒プロット
$barplot->SetColor("#2f6fbf"); // 枠の色
$barplot->SetFillColor("#2f6fbf"); // 塗りつぶしの色
$barplot->value->Show(); // 数値の表示
$barplot->value->SetFormat('%d%%'); // 数値のフォーマット
$barplot->value->SetColor("black"); // 数値の文字色

$graph->Stroke(); // グラフを表示
```

こんな感じでシンプルなグラフが作れました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/b1fc1cd8-fca2-3684-dee1-a2159611fe9f.png)

## 日本語を使いたい！
jpgraph_ttf.inc.php で `GOTHIC_TTF_FONT` が定義されているのでそれを使うことができるが...
その前にフォントが入っていないようなので日本語フォントをIPAとかから引っ張ってきてfontsにぶち込んでやる必要がある。

http☆//mix-mplus-ipa.sourceforge.jp/ から取得できるとのことだが、今じゃsourceforge.jpは残念ながらお亡くなりになっているので文字情報技術促進協議会からIPAフォントをDLする。

https://moji.or.jp/ipafont/ipa00303/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/9e0619f6-a16b-7136-e5cb-69e307323b83.png)

zipを解凍したらfontsに移動させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/31de5f67-a0e9-d7be-fbf2-345a3238bd2c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/742bdded-f6fb-c843-f2e3-21e825bd22b1.png)

```php
$graph->title->Set("プログラミング言語ランキング"); // タイトル
$graph->title->SetFont(FF_GOTHIC); // ゴシック体を指定する
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/bf1eeff6-8b81-a3ba-9b61-610656fa5dd2.png)

IPAフォントじゃなくてもいいようだが、他のフォント使う場合はjpgraph_ttf.nc.phpを編集する必要があるようだ。

# エラーについて
## JpGraph Error: 25046
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/54c35f72-40d6-f59c-0d66-7aec80084af0.png)

存在しないフォントファミリー(FF)を指定すると25046というエラーが出ます。
使ってる定数間違ってないか確認してください。

## JpGraph Error: 25049
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1015774/e0fbae84-6940-818e-b127-cccad227e67d.png)

そもそもフォントのファイルがないエラーです。
JpGraphの仕様的におそらくまず、JpGraphのfontsフォルダを確認して存在しなければOS上のフォントを使おうとするみたいです。