Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

d3js json pie chart

Tags:

json

d3.js

I am trying to create a piechart for some data I have in a JSON file, however I keep getting an error and I am not sure why. My JSON file is like this:

{"data":[
    {"ap": [
        {"floorratio": [
            {"floor":"Basement", "ratio": 0.20},
            {"floor":"Ground", "ratio": 0.20},
            {"floor":"First Floor", "ratio": 0.15},
            {"floor":"Second Floor", "ratio": 0.20},
            {"floor":"Third Floor", "ratio": 0.25}
        ]}
    ]},
    {"ap": [
        {"floorratio": [
            {"floor":"Basement", "ratio": 0.10},
            {"floor":"Ground", "ratio": 0.30},
            {"floor":"First Floor", "ratio": 0.10},
            {"floor":"Second Floor", "ratio": 0.15},
            {"floor":"Third Floor", "ratio": 0.35}
        ]}
    ]}
]}

and my HTML code is:

<!doctype html>
<html>
<head>
    <title>Pie Chart Test</title>
    <script src="d3.min.js"></script>
</head>
<style>

body {
  font: 10px sans-serif;
}

.arc path {
  stroke: #fff;
}
</style>

<body>


<script>
var width = 960,
    height = 500,
    radius = Math.min(width, height) / 2;

var color = d3.scale.ordinal()
    .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);

var arc = d3.svg.arc()
    .outerRadius(radius - 10)
    .innerRadius(0);

var pie = d3.layout.pie()
    .sort(null)
    .value(function (d) {
    return d.data[0].ap[0].floorratio[0].ratio;
});

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height)
    .append("g")
    .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

d3.json("APCategories.json", function (data) {

    var g = svg.selectAll(".arc")
        .data(pie(function (d) { return d.data[0].ap[0].floorratio[0]}))
        .enter().append("g")
        .attr("class", "arc");

    g.append("path")
        .attr("d", arc)
        .style("fill", function (d) {
        return color[d.data[0].ap[0].floorratio[0].floor];
    });

    g.append("text")
        .attr("transform", function (d) {
        return "translate(" + arc.centroid(d) + ")";
    })
        .attr("dy", ".35em")
        .style("text-anchor", "middle")
        .text(function (d) {
        return d.data[0].ap[0].floorratio[0].floor;
    });

});
</script>
</body>
</html>

I keep getting the error when I inspect the element that i.map is not a function. Am I reading the data into the code incorrectly? Any help would be appreciated.

edit: I am currently only trying to load the first ap, the json file will be much bigger and I will be creating a pie chart that changes so that it represents each ap.floorratio. So for now, only the data from the first floorratio array needs to go into the pie chart.

like image 760
KNN. T Avatar asked Jul 11 '26 08:07

KNN. T


1 Answers

Here's a working version.

var width = 960,
    height = 500,
    radius = Math.min(width, height) / 2;
var color = d3.scale.ordinal()
    .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);
var arc = d3.svg.arc()
    .outerRadius(radius - 10)
    .innerRadius(0);

// defines wedge size
var pie = d3.layout.pie()
    .sort(null)
    .value(function (d) { return d.ratio; });

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height)
  .append("g")
    .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");

d3.json("APCategories.json", function(error, data) {
  node = data.data[0].ap[0].floorratio;  // <------ here

  var g = svg.selectAll(".arc")
      .data(pie(node))
      .enter().append("g")
      .attr("class", "arc");

  g.append("path")
      .attr("d", arc)
      .style("fill", function(d) { return color(d.data.floor); });

  g.append("text")
      .attr("transform", function (d) { return "translate(" + arc.centroid(d) + ")"; })
      .attr("dy", ".35em")
      .style("text-anchor", "middle")
      .text(function (d) { return d.data.floor; });
});

The [0] after floorratio wasn't necessary.

http://bl.ocks.org/steveharoz/0638d230c133da1de385

like image 67
sharoz Avatar answered Jul 13 '26 09:07

sharoz



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!