PHP可以使用 JpGraph 来生成图表,仅依赖 PHP 内置 GD 扩展即可。JpGraph 是一个开源的PHP库,它可以帮助您快速方便地创建各种图表,包括饼图、折线图、柱状图等。
背景
关联上篇文章,邮件中嵌入统计图表图片问题。生成图表大家都在用 JpGraph 这个库,但默认的中文字体渲染有问题,表现为乱码或者方块。
该文章使用 composer 类库: "mitoteam/jpgraph": "^10.2.5"
, 内置依赖的 JpGraph 的版本 4.4.1
JpGraph 官网:JpGraph – Most powerful PHP-driven charts
前置条件
配置相关字体到系统,如中文使用 simsum.ttc
将字体文件复制到系统目录下,该扩展库会自动寻找系统默认字体库路径。
Windows字体路径:C:\Windows\Fonts
Linux字体路径:/usr/share/fonts/truetype
docker 环境如无此路径需要创建并复制文件
JpGraph配置
修改源码文件:vendor/mitoteam/jpgraph/src/lib/jpgraph_ttf.inc.php
// define('CHINESE_TTF_FONT','bkai00mp.ttf');
define('CHINESE_TTF_FONT','simsun.ttc');
代码实现
以柱状图为例,仅展示核心代码:
MtJpGraph::load('bar');
$graph = new Graph($width, $height);
// Titles 设置图片标题
$graph->title->Set('图表标题');
$graph->title->SetFont(FF_CHINESE, FS_NORMAL);
// 设置 x 轴标签
$lbl = ['产品分类1', '产品分类2'];
$graph->xaxis->SetTickLabels($lbl);
$graph->xaxis->SetFont(FF_CHINESE, FS_NORMAL, 8); // 8px
// 设置 legend
$graph->legend->SetFont(FF_CHINESE, FS_NORMAL);
// 设置 x 轴标题
$graph->xaxis->title->Set("这是xaxis标题");
$graph->xaxis->title->SetFont(FF_CHINESE, FS_NORMAL);
// 设置 y 轴标题
$graph->yaxis->title->Set("这是xaxis标题");
$graph->yaxis->title->SetFont(FF_CHINESE, FS_NORMAL);
其他
另一个思路是不用修改库源码,需要把业务代码中的字体 常量 FF_CHINESE
替换为 FF_SIMSUN
,之后使用 iconv 函数 把 中文转为 GB2312 编码即可。
原因是 JpGraph 默认中文的编码应该是 GB2312,所以直接传入 UTF8 的编码是使用其他字体,会出现方块或者乱码导致不能正常渲染。
延伸
关于文章背景的实现,这里其实还有其他思路。
比如:
- 使用 svg 库(SVGGraph – a PHP SVG graph library (goat1000.com))生成图表,然后 svg 转为图片(这里可能依赖 php imagick c扩展,或者使用 node js 库来外部调用),这里懒得编译安装新扩展了并没有去做实验;
- 使用 puppeteer 等无头浏览器来直接渲染网页为图片,考虑到这么一个小功能需要依赖一个外部浏览器有点杀鸡用牛刀的感觉,没有去使用。