我有一个读取数据库并返回 JSON 的 PHP 脚本(现在,每个图表都有 1 个 php 文件,因为我不知道更好的方法)。然后使用此数据填充 D3 饼图。我有 20 多个图表,所以我希望能够在用户单击<div>
. 我做了一些研究,我发现了这个:
http://bl.ocks.org/j0hnsmith/5591116
这个例子几乎是我想要做的,但我似乎无法将它融入我现有的代码中。这是一个与我所拥有的类似的 JSFiddle(我的 .JS 代码在链接下方。不同之处在于数据的加载方式):
var w = 670,
h = 400,
r = 180,
inner = 70,
color = d3.scale.category20c();
var enterAntiClockwise = {
startAngle: Math.PI * 2,
endAngle: Math.PI * 2
};
d3.json("script.php", function (data) {
var vis = d3.select("#chart")
.append("svg:svg")
.data([data])
.attr("width", w)
.attr("height", h)
.append("svg:g")
.attr("transform", "translate(" + (w * 0.5) + "," + (r + 10) + ")")
var arc = d3.svg.arc()
.innerRadius(inner)
.outerRadius(r);
var arcOver = d3.svg.arc()
.innerRadius(inner + 5)
.outerRadius(r + 5);
var arcLine = d3.svg.arc()
.innerRadius(inner)
.outerRadius(inner + 5);
var pie = d3.layout.pie()
.value(function(d) { return d.value; });
var textTop = vis.append("text")
.attr("dy", ".35em")
.style("text-anchor", "middle")
.attr("class", "textTop"),
textBottom = vis.append("text")
.attr("dy", ".35em")
.style("text-anchor", "middle")
.attr("class", "textBottom");
var arcs = vis.selectAll("g.slice")
.data(pie)
.enter()
.append("svg:g")
.attr("class", "slice")
.on("mouseover", function(d) {
d3.select(this).select("path").transition()
.duration(100)
.attr("d", arcOver)
textTop.text( d3.select(this).datum().data.label ).attr("y", -10)
textBottom.text( d3.select(this).datum().data.value.toFixed(2) + "m").attr("y", 10);
})
.on("mouseout", function(d) {
d3.select(this).select("path").transition()
.duration(100)
.attr("d", arc)
textTop.text( "" );
textBottom.text( "" );
});
arcs.append("svg:path")
.attr("fill", function(d, i) { return color(i); } )
.attr("d", arc)
})
d3.selectAll("input").on("change", change);
/*
var timeout = setTimeout(function() {
d3.select("input[value=\"oranges\"]").property("checked", true).each(change);
}, 2000);
*/
function change() {
clearTimeout(timeout);
path = path.data(pie(dataset[this.value]));
path.enter().append("path")
.attr("fill", function (d, i) {
return color(i);
})
.attr("d", arc(enterAntiClockwise))
.each(function (d) {
this._current = {
data: d.data,
value: d.value,
startAngle: enterAntiClockwise.startAngle,
endAngle: enterAntiClockwise.endAngle
};
});
path.exit()
.transition()
.duration(750)
.attrTween('d', arcTweenOut)
.remove() // now remove the exiting arcs
path.transition().duration(750).attrTween("d", arcTween);
}
function arcTween(a) {
var i = d3.interpolate(this._current, a);
this._current = i(0);
return function(t) {
return arc(i(t));
};
}
function arcTweenOut(a) {
var i = d3.interpolate(this._current, {startAngle: Math.PI * 2, endAngle: Math.PI * 2, value: 0});
this._current = i(0);
return function (t) {
return arc(i(t));
};
}
我怎样才能完成这项工作?我是 D3 的新手,所以请多多包涵。
我还找到了饼图更新 I 和 II(以及其他一些示例),但我无法在此处链接它们,因为我的声誉不够高。我也尝试实现它们,但它们都没有d3.json
用来获取数据,所以我不知道该怎么做。
感谢所有的帮助!
编辑:这是我的 PHP
<?php
$myServer = "servername";
$myDB = "dbname";
$conn = sqlsrv_connect ($myServer, array('Database'=>$myDB));
$sql ="SELECT col1 AS 'label', SUM(col2) AS 'value'
FROM dbname.dbo.tablename
GROUP BY col1";
$data = sqlsrv_query ($conn, $sql);
$result = array();
do {
while ($row = sqlsrv_fetch_array ($data, SQLSRV_FETCH_ASSOC)) {
$result[] = $row;
}
} while (sqlsrv_next_result($data));
echo json_encode ($result);
sqlsrv_free_stmt ($data);
sqlsrv_close ($conn);
?>