JSONオブジェクトから円グラフを表示しようとしています。ディレクティブを使用してD3 Chartを表示する方法は?
私はそれが動作します。このオブジェクトで試してみてください。
[{
"id": "id1",
"name": "the name 1",
"values": [{
"age": "One",
"population": 5
}, {
"age": "Two",
"population": 2
}, {
"age": "Three",
"population": 9
}, {
"age": "Four",
"population": 7
}, {
"age": "Five",
"population": 4
}, {
"age": "Six",
"population": 3
}, {
"age": "Seven",
"population": 9
}]
}]
が、これだけで:
[{
"age": "One",
"population": 5
}, {
"age": "Two",
"population": 2
}, {
"age": "Three",
"population": 9
}, {
"age": "Four",
"population": 7
}, {
"age": "Five",
"population": 4
}, {
"age": "Six",
"population": 3
}, {
"age": "Seven",
"population": 9
}]
これは私のコードです:
var app = angular.module("d3Test", ['d3Test.directives']);
angular.module('d3Test.directives', [])
.controller('IndicatorsCtrl', function($scope, Indicators) {
$scope.datas = '[{ "age": "One", "population": 5 },{ "age": "Two", "population": 2 }]';
.factory('Indicators', function($resource) {
return $resource('datas.json');
})
angular.module('d3Test.directives', []).
directive('graph', function() {
\t return {
\t \t restrict: 'E',
\t \t scope: {
\t \t \t values: '='
\t \t },
\t \t link: function (scope, element, attrs) {
\t \t \t scope.$watch('values', function(values) {
\t \t \t \t if(values) {
\t \t \t \t \t console.log('values from directive: ', values);
\t \t \t \t \t
\t \t \t \t \t var width = 960,
\t \t \t \t \t height = 500,
\t \t \t \t \t radius = Math.min(width, height)/2;
\t \t \t \t \t
\t \t \t \t \t var color = d3.scale.ordinal()
\t \t \t \t \t \t .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);
\t \t \t \t \t
\t \t \t \t \t var arc = d3.svg.arc()
\t \t \t \t \t \t .outerRadius(radius - 10)
\t \t \t \t \t \t .innerRadius(0);
\t \t \t \t \t
\t \t \t \t \t var pie = d3.layout.pie()
\t \t \t \t \t \t .sort(null)
\t \t \t \t \t \t .value(function(d) {
\t \t \t \t \t \t \t return d.population;
\t \t \t \t \t \t });
\t \t \t \t \t
\t \t \t \t \t var svg = d3.select("body").append("svg")
\t \t \t \t \t \t .attr("width", width)
\t \t \t \t \t \t .attr("height", height)
\t \t \t \t \t \t .append("g")
\t \t \t \t \t \t .attr("transform", "translate(" + width/2 + "," + height/2 + ")");
\t \t \t \t \t
\t \t \t \t \t
\t \t \t \t \t
\t \t \t \t \t \t values.forEach(function(d) {
\t \t \t \t \t \t \t d.population = +d.population;
\t \t \t \t \t \t });
\t \t \t \t \t \t
\t \t \t \t \t \t var g = svg.selectAll(".arc")
\t \t \t \t \t \t \t .data(pie(values))
\t \t \t \t \t \t \t .enter().append("g")
\t \t \t \t \t \t \t .attr("class", "arc");
\t \t \t \t \t \t
\t \t \t \t \t \t g.append("path")
\t \t \t \t \t \t \t .attr("d", arc)
\t \t \t \t \t \t \t .style("fill", function(d) { return color(d.data.age); });
\t \t \t \t \t \t
\t \t \t \t \t \t g.append("text")
\t \t \t \t \t \t \t .attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
\t \t \t \t \t \t \t .attr("dy", ".35em")
\t \t \t \t \t \t \t .style("text-anchor", "middle")
\t \t \t \t \t \t \t .text(function(d) { return d.data.age; });
\t \t \t \t }
\t \t \t })
\t \t }
\t }
});
<!DOCTYPE html>
<html>
<head>
<script data-require="[email protected]*" data-semver="1.0.7" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.js"></script>
<script data-require="[email protected]" data-semver="1.0.7" src="http://code.angularjs.org/1.0.7/angular-resource.min.js"></script>
<script data-require="[email protected]*" data-semver="3.2.2" src="//cdnjs.cloudflare.com/ajax/libs/d3/3.2.2/d3.v3.min.js"></script>
<script src="script.js"></script>
</head>
<body ng-app="d3Test">
<div ng-controller="IndicatorsCtrl">
<p>datas: {{datas}}</p>
<p>values: {{datas[0].values}}</p>
</div>
</body>
</html>
このように動作するはずです、あなたの答えをありがとう..私は今NVD3角度で作業しています。 – LaymoO