dimple - 将金额绘制为 52 周的堆积条

dimple - Plotting amounts as stacked bars for 52 weeks

我正在尝试为一年中的每个星期绘制带有酒窝的堆叠数量。

上图几乎是我想要实现的,但是缺少没有数量的周(例如第 22 周和第 24 周)以及从第 28 周到第 52 周的所有周。

我添加了一个“周”table,它列出了从 1 到 52 的所有周。 对周数执行外部联接以格式化 x 轴,如第二个图所示。

为上图提取数据的PHP代码如下所示:

    function utf8ize($d) {
    if (is_array($d)) 
        foreach ($d as $k => $v) 
            $d[$k] = utf8ize($v);
     else 
        return utf8_encode($d);

    return $d;
}

$sql="SELECT s.num_week, category, amount_to_plot FROM weeks RIGHT OUTER JOIN
((SELECT WEEK(date,3) AS week,'A' AS category,SUM(amount) AS amount_to_plot FROM amounts_A GROUP BY WEEK(date,3))
UNION (SELECT WEEK(date,3) AS week,'B' AS category,SUM(amount) AS amount_to_plot FROM amounts_B GROUP BY WEEK(date,3))
UNION (SELECT WEEK(date,3) AS week,'C' AS category,SUM(amount) AS amount_to_plot FROM amounts_C GROUP BY WEEK(date,3)) 
 ) r
ON s.num_week = r.week WHERE s.num_week!=53 ORDER BY s.date_debut ASC
";

$result = mysqli_query($connection, $sql) or die("Error in Selecting " . mysqli_error($connection));

$amounts = array();
while($row =mysqli_fetch_assoc($result))
  {
    $amounts[] = $row;
  }
$data = json_encode(utf8ize($amounts),JSON_UNESCAPED_UNICODE);
echo $data;

在上面的代码中,通过将“RIGHT OUTER JOIN”替换为“LEFT OUTER JOIN”,缺少周数的 json 记录(即 A、B 或 C 中没有任何金额的记录) 也会生成,这就是我们想要的。这些看起来像:

{"num_week":"22","category":"","amount_to_plot":""}
{"num_week":"24","category":"","amount_to_plot":""}
{"num_week":"28","category":"","amount_to_plot":""}
(...)
{"num_week":"52","category":"","amount_to_plot":""}

但是,有一个副作用,图表看起来完全荒谬,每个数量都绘制为 1,包括空值。

我不确定这种副作用是否来自“类别”值为空以及要绘制的数量(“”而不是“0.00”)这一事实。

我的问题是如何修补这个? 我对多种方法持开放态度:修改 SQL 查询、PHP 代码或酒窝代码。

有两个罪魁祸首,一个在应用程序级别,另一个在我的 PHP 代码中。

在应用程序级别,问题来自于 dimple 图表库不喜欢绘制量的空值: ... {"num_week":"22","category":"","amount_to_plot":""} ...

使用静态 json 字符串,我可以通过添加“0.00”值确认问题已解决: ... {"num_week":"22","category":"","amount_to_plot":"0.00"} ...

但是 最简单的解决方案是调整 PHP 代码。 这个问题是由我的 PHP 代码中的 utf8ize() 函数引起的,它将空值替换为“0.00”。

而不是 $data = json_encode(utf8ize($amounts),JSON_UNESCAPED_UNICODE);

简单使用 $data = json_encode($amounts); 将数据传递给酒窝。

然后数据看起来像 ...{"num_week":"22","category":null,"amount_to_plot":null} ...

如果打印 json 字符串,直接在 PHP 中回显它,重音字符看起来会很奇怪(因为将使用 utf-8 编码),但它会完美地工作作为酒窝图的数据源,也作为其图例。

进一步可能的改进是将 "category":null 替换为 "category":<some-existing-category> 以避免图例中出现空类别。