sql - 我无法在 d3 中可视化数据
问题描述
我正在学习 D3,并尝试从数据库中加载数据并将其可视化在 HTML 页面上。
我在 PHP 中的代码:
$myquery = "SELECT COUNT(JOB) FROM EMP WHERE JOB = 'SALESMAN'";
$query = mysqli_query($conn,$myquery);
if ( ! $query ) {
echo mysqli_error($myquery);
die;
}
$data = array();
for ($x = 0; $x < mysqli_num_rows($query); $x++) {
$data[] = mysqli_fetch_assoc($query);
}
echo json_encode($data);
mysqli_close($conn);
我得到的数据:
[{"COUNT(JOB)":"4"}]
我的 HTML 代码:
<script>
d3.json("connect.php",function (data) {
var canvas = d3.select("body").append("svg")
.attr("width", 500)
.attr("height", 500)
canvas.selectAll("rect")
.data(data)
.enter()
.append("rect")
.attr("width", function(d){ return d.COUNT(JOB) * 100;})
.attr("height",48)
.attr("y", function (d, i){ return i * 50;})
.attr("fill", "black")
})
</script>
我认为问题可能出在 JSON 数据上,其中 '4' 是字符串而不是数字。所以我将数据源 [{"COUNT(JOB)":"4"}] 更改为 [{"COUNT(JOB)":4}]。但是,在 HTML 页面中,条形图仍然没有显示。我认为问题应该是javascript。我检查了每个单词,但找不到任何问题。
顺便一提。如果我从 connect.php 加载数据,如何将字符串 '4' 转换为数字 4?
解决方案
您的 JSON 将导致您的属性名称为COUNT(JOB)
. 这里:
function(d){ return d.COUNT(JOB) * 100;})
在这里,您传递JOB
给一个函数d.COUNT
,但d.COUNT
不是函数或数据的属性。这将产生错误并导致不绘制任何内容。相反,您可以将您的计数称为:
SELECT COUNT(JOB) as jobcount ...
并使用d.jobcount
其次,如果您使用的是 d3v5 或 d3v6,那么您使用的 d3.json 不正确。您使用的模式对 d3v4 及更早版本有效,但从 d3v5 开始,您需要使用以下格式:
d3.json("connect.php").then(function (data) {
...
})
否则,您的 javascript 可以工作:这是 javascript 的一个工作示例(在数据中进行硬编码以将其放入片段中):
var data = [{"jobcount":"4"}]
var canvas = d3.select("body").append("svg")
.attr("width", 500)
.attr("height", 500)
canvas.selectAll("rect")
.data(data)
.enter()
.append("rect")
.attr("width", function(d){ return d.jobcount * 100;})
.attr("height",48)
.attr("y", function (d, i){ return i * 50;})
.attr("fill", "black")
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
最后,在这种情况下,您不需要将字符串强制"4"
转换为数字,正如您在上面看到的(当将其与数字相乘时,javascript 将其视为数字)。如果您真的想将值强制为数字,可以使用一元+
,例如:
`data.forEach(function(d) { d.jobcount = +d.jobcount })`
或者
.attr("width", function(d) { return +d.jobcount; })
推荐阅读
- openldap - LMDB:如何有效地存储大值大小
- javascript - What is the correct way to use object destructing in this situation?
- javascript - 是否可以根据 activeRange 更改公式中的单元格引用?
- c - 如何修复函数“_start”中的错误:(.text+0x20):未定义对“main”的引用
- java - 带有内容 Uri 的 Android VIEW 意图
- html - How to build a responsive CSS grid with square items to display images with multiple aspect ratios
- php - 从数据库生成 Doctrine 实体但不覆盖当前实体中的自定义代码
- sql - SQL插入多个选择
- c# - 在 Mono/Linux 中使用 FFmpeg.Autogen 4.1.0.2 时未找到 Kernel32
- python - NodeVisitor class for PEG parser in Python