酒窝 - 将数量绘制为 52 周的堆积条形图

问题描述

我试图用酒窝绘制一年中每周的堆积量。

  • x 轴需要显示周数,从 1 到 52。
  • y 轴 显示来自我们想要绘制的 3 个表的堆叠数量 A、B、C 类。

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

dimple amounts from categories plotted by week number

添加一个“周”表,其中列出了从 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,'B' AS category,SUM(amount) AS amount_to_plot FROM amounts_B GROUP BY WEEK(date,'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”,也会生成缺失周(即 A、B 或 C 中没有任何金额的那些)的 json 记录以及这就是我们想要的。这些看起来像:

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

然而,有一个副作用,图表看起来完全荒谬,以 1 的数量绘制每个数量包括空值。

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

我的问题是如何修补这个? 我对多种方法持开放态度:修改 sql 查询PHP 代码或凹坑代码

解决方法

解决了! enter image description here 有两个罪魁祸首,一个在应用程序级别,另一个在我的 PHP 代码中。

在应用程序级别,问题来自这样一个事实,即酒窝图表库不喜欢要绘制的数量的空值: ... {"num_week":"22","category":"","amount_to_plot":""} ...

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

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

代替 $data = json_encode(utf8ize($amounts),JSON_UNESCAPED_UNICODE);

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

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

如果 json 字符串被打印出来,直接在 PHP 中回显后,重音字符看起来会很奇怪(因为将使用 utf-8 编码),但它可以完美地作为酒窝图表的数据馈送,也适用于它的传奇。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...