dimple - 将金额绘制为 52 周的堆积条
dimple - Plotting amounts as stacked bars for 52 weeks
我正在尝试为一年中的每个星期绘制带有酒窝的堆叠数量。
- x 轴需要显示周数,从 1 到 52。
- y轴
显示我们想要绘制为的来自 3 table 的堆叠数量
类别 A、B、C。
上图几乎是我想要实现的,但是缺少没有数量的周(例如第 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>
以避免图例中出现空类别。
我正在尝试为一年中的每个星期绘制带有酒窝的堆叠数量。
- x 轴需要显示周数,从 1 到 52。
- y轴 显示我们想要绘制为的来自 3 table 的堆叠数量 类别 A、B、C。
上图几乎是我想要实现的,但是缺少没有数量的周(例如第 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 代码或酒窝代码。
在应用程序级别,问题来自于 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>
以避免图例中出现空类别。