データベースを読み取り、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が初めてなので、ご容赦ください。
Pie Chart Update 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);
?>