0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PHPAdvent Calendar 2024

Day 18

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

Posted at

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

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

JpGraphのダウンロード

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

image.png

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

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

こういう表示になるそうだが...

サンプル上のページにある表示では
image.png

実際には

こちらで動作させてみると
image.png

// 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が効かない問題)

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

解決策1「テーマを適用させない」

先ほどのstack overflowの2、3つ目の回答にありました。

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

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

image.png

これでヨシ!

解決策2 (推奨)「Plotをデザイン変更前にグラフへ追加しておく」

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

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

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

// 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

いざグラフを作ってみる

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

<?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

日本語を使いたい!

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

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

image.png

zipを解凍したらfontsに移動させます。
image.png

image.png

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

image.png

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

エラーについて

JpGraph Error: 25046

image.png

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

JpGraph Error: 25049

image.png

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?