我试图用jpgraph创建一个简单的图形(对我来说这是一个新的东西,我已经使用了他们网站上的条形图的例子。)并希望y轴返回整数/舍入数。 所以我在网上搜索过,发现我必须使用textint。
所以现在我已经有了这两行:
$graph->SetScale("textint");
$graph->yaxis->SetTickPositions(array(0,1,2,3,4,5);
但不管怎么说,不是返回一个整数,我现在在y轴上的每一步得到0f。 我只是无法弄清楚为什么它会导致0f :( 有人对我有神奇的答案吗?我做错了什么,或者把它变成值0f?
更多代码:
$graphSettings = [
'tick_positions' => [0, 1, 2, 3, 4, 5],
'tick_labels' => ['Q1 2017', 'Q2 2017', 'Q3 2017', 'Q4 2017', 'Q1 2018'],
];
$graphs = [];
foreach ($questions as $key => $question) {
$graphs[] = $this->generateGraph($graphSettings, $question, $key);
}
public function generateGraph($settings, $question, $key) {
$data1y = $question['bar_plots']; // height of bars
// Create the graph. These two calls are always required
$graph = new \Graph(500, 200, 'auto');
$graph->SetScale("textint");
$theme_class = new \UniversalTheme;
$graph->SetTheme($theme_class);
$graph->yaxis->SetTickPositions($settings['tick_positions']); // array y numbers, array y between dashes
$graph->SetBox(false);
$graph->ygrid->SetFill(false);
$graph->xaxis->SetTickLabels($settings['tick_labels']);
$graph->yaxis->HideLine(false);
$graph->yaxis->HideTicks(false, false);
// Create the bar plots
$b1plot = new \BarPlot($data1y);
// ...and add it to the graPH
$graph->Add($b1plot);
$b1plot->SetColor("white");
$b1plot->SetFillColor("#41b6e6");
// Return the graph
$contentType = 'image/png';
ob_start();
$graph->Stroke();
$image_data = ob_get_clean();
$str = "data:$contentType;base64," . base64_encode($image_data);
return $str;
}
编辑: 我刚刚注意到在更改图形的高度设置(现在是500乘180而不是500乘200)时它现在开始显示我期待的数字。这是插件本身的错误吗?
答案 0 :(得分:2)
这是插件的问题。 从PHP5.6迁移到PHP7时,我也遇到了这个问题。
问题:
jpgraph.php中的LinearTicks类中的方法_doLabelFormat()计算$precision
值,然后将其用作sprintf
调用中公式的一部分。此$precision
值有时是负数,这使得sprintf公式在PHP7中无效。
解决方案:
LinearTicks-> _doLabelFormat()方法中的最后一次else
调用如下所示:
$l = sprintf('%01.'.$precision.'f',round($aVal,$precision));
并在我的文件中显示#4306行
只需添加以下上方:
$precision = abs( $precision );
这可确保您的$precision
值始终为正数,并应修复传递给sprintf调用的所有格式问题。