【问题标题】:grouped bar chart from JSON data instead of CSV来自 JSON 数据而不是 CSV 的分组条形图
【发布时间】:2017-01-03 08:12:23
【问题描述】:

我正在尝试重新创建分组条形图示例,但不使用 CSV,我更喜欢 JSON 数据:

var data = [
  {
    "State": "CA",
    "Under 5 Years": 2704659,
    "5 to 13 Years": 4499890,
    "14 to 17 Years": 2159981,
    "18 to 24 Years": 3853788,
    "25 to 44 Years": 10604510,
    "45 to 64 Years": 8819342,
    "65 Years and Over": 4114496
  },
  {
    "State": "TX",
    "Under 5 Years": 2027307,
    "5 to 13 Years": 3277946,
    "14 to 17 Years": 1420518,
    "18 to 24 Years": 2454721,
    "25 to 44 Years": 7017731,
    "45 to 64 Years": 5656528,
    "65 Years and Over": 2472223
  },
  {
    "State": "NY",
    "Under 5 Years": 1208495,
    "5 to 13 Years": 2141490,
    "14 to 17 Years": 1058031,
    "18 to 24 Years": 1999120,
    "25 to 44 Years": 5355235,
    "45 to 64 Years": 5120254,
    "65 Years and Over": 2607672
  },
  {
    "State": "FL",
    "Under 5 Years": 1140516,
    "5 to 13 Years": 1938695,
    "14 to 17 Years": 925060,
    "18 to 24 Years": 1607297,
    "25 to 44 Years": 4782119,
    "45 to 64 Years": 4746856,
    "65 Years and Over": 3187797
  },
  {
    "State": "IL",
    "Under 5 Years": 894368,
    "5 to 13 Years": 1558919,
    "14 to 17 Years": 725973,
    "18 to 24 Years": 1311479,
    "25 to 44 Years": 3596343,
    "45 to 64 Years": 3239173,
    "65 Years and Over": 1575308
  },
  {
    "State": "PA",
    "Under 5 Years": 737462,
    "5 to 13 Years": 1345341,
    "14 to 17 Years": 679201,
    "18 to 24 Years": 1203944,
    "25 to 44 Years": 3157759,
    "45 to 64 Years": 3414001,
    "65 Years and Over": 1910571
  }
]

这是我尝试重新创建的示例:

https://bl.ocks.org/mbostock/3887051

任何帮助将不胜感激我真的是一个 JavaScript 菜鸟。

【问题讨论】:

    标签: javascript json csv d3.js


    【解决方案1】:

    通过将数组转换为所需的格式,可以轻松实现此 cab:

    对于转换,您可以使用:

    for(var x in data){
    var currData = [];    
    for(var y in data[x]){
             currData.push(data[x][y]);
         }
    dataArr.push(currData);
    }
    
    var tdata = d3.transpose(dataArr);
    

    然后使用:http://bl.ocks.org/3532324

    D3: Create a grouped bar chart from json objects

    Grouped Bar Chart From JSON D3.JS

    D3.js : How to read data from JSON in Grouped Bar Chart

    【讨论】:

    • 我看过这些例子。如第一个链接所示,我无意将 JSON 数据转换为数组。在这一点上,其他两个对我来说意义不大。我只是在这里弄湿我的脚......
    • 好的,那么您想要一个将 JSON 转换为 CSV 并直接插入其中的模块还是坚持使用 json 到分组图表
    • JSON 到分组图表...我认为转换成 CSV 会很浪费
    • 这似乎在 JS Bin jsbin.com/nuyipikaye/edit?js,output 中工作,但是当我复制粘贴代码时,我无法让它在我的驱动器上的静态 HTML 页面中工作。
    • 您是否在 HTML 页面中包含了所需的 JS 依赖项?
    【解决方案2】:

    因此,我只需删除样本的 CSV 部分即可解决此问题。这是链接到本地​​ d3.v3.js 文件的静态版本:

    <!DOCTYPE html>
    <meta charset="utf-8">
    <script type="text/javascript" src="file:///C:/Users/userName/d3/d3.v3.min.js"></script>
    <style>
    
    body {
      font: 10px sans-serif;
    }
    
    .axis path,
    .axis line {
      fill: none;
      stroke: #000;
      shape-rendering: crispEdges;
    }
    
    .bar {
      fill: steelblue;
    }
    
    .x.axis path {
      display: none;
    }
    
    </style>
    <body>
    <script type="text/javascript">
    
    var data = [
      {
        "State": "CA",
        "Under 5 Years": 2704659,
        "5 to 13 Years": 4499890,
        "14 to 17 Years": 2159981,
        "18 to 24 Years": 3853788,
        "25 to 44 Years": 10604510,
        "45 to 64 Years": 8819342,
        "65 Years and Over": 4114496
      },
      {
        "State": "TX",
        "Under 5 Years": 2027307,
        "5 to 13 Years": 3277946,
        "14 to 17 Years": 1420518,
        "18 to 24 Years": 2454721,
        "25 to 44 Years": 7017731,
        "45 to 64 Years": 5656528,
        "65 Years and Over": 2472223
      },
      {
        "State": "NY",
        "Under 5 Years": 1208495,
        "5 to 13 Years": 2141490,
        "14 to 17 Years": 1058031,
        "18 to 24 Years": 1999120,
        "25 to 44 Years": 5355235,
        "45 to 64 Years": 5120254,
        "65 Years and Over": 2607672
      },
      {
        "State": "FL",
        "Under 5 Years": 1140516,
        "5 to 13 Years": 1938695,
        "14 to 17 Years": 925060,
        "18 to 24 Years": 1607297,
        "25 to 44 Years": 4782119,
        "45 to 64 Years": 4746856,
        "65 Years and Over": 3187797
      },
      {
        "State": "IL",
        "Under 5 Years": 894368,
        "5 to 13 Years": 1558919,
        "14 to 17 Years": 725973,
        "18 to 24 Years": 1311479,
        "25 to 44 Years": 3596343,
        "45 to 64 Years": 3239173,
        "65 Years and Over": 1575308
      },
      {
        "State": "PA",
        "Under 5 Years": 737462,
        "5 to 13 Years": 1345341,
        "14 to 17 Years": 679201,
        "18 to 24 Years": 1203944,
        "25 to 44 Years": 3157759,
        "45 to 64 Years": 3414001,
        "65 Years and Over": 1910571
      }
    ]
    
    var margin = {top: 20, right: 20, bottom: 30, left: 40},
        width = 960 - margin.left - margin.right,
        height = 500 - margin.top - margin.bottom;
    
    var x0 = d3.scale.ordinal()
        .rangeRoundBands([0, width], .1);
    
    var x1 = d3.scale.ordinal();
    
    var y = d3.scale.linear()
        .range([height, 0]);
    
    var color = d3.scale.ordinal()
        .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]);
    
    var xAxis = d3.svg.axis()
        .scale(x0)
        .orient("bottom");
    
    var yAxis = d3.svg.axis()
        .scale(y)
        .orient("left")
        .tickFormat(d3.format(".2s"));
    
    var svg = d3.select("body").append("svg")
        .attr("width", width + margin.left + margin.right)
        .attr("height", height + margin.top + margin.bottom)
      .append("g")
        .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
    
    var ageNames = d3.keys(data[0]).filter(function(key) { return key !== "State"; });
    
    data.forEach(function(d) {
        d.ages = ageNames.map(function(name) { return {name: name, value: +d[name]}; });
      });
    
    x0.domain(data.map(function(d) { return d.State; }));
    x1.domain(ageNames).rangeRoundBands([0, x0.rangeBand()]);
    y.domain([0, d3.max(data, function(d) { return d3.max(d.ages, function(d) { return d.value; }); })]);
    
    svg.append("g")
          .attr("class", "x axis")
          .attr("transform", "translate(0," + height + ")")
          .call(xAxis);
    
    svg.append("g")
          .attr("class", "y axis")
          .call(yAxis)
          .append("text")
          .attr("transform", "rotate(-90)")
          .attr("y", 6)
          .attr("dy", ".71em")
          .style("text-anchor", "end")
          .text("Population");
    
    var state = svg.selectAll(".state")
          .data(data)
          .enter().append("g")
          .attr("class", "state")
          .attr("transform", function(d) { return "translate(" + x0(d.State) + ",0)"; });
    
    state.selectAll("rect")
          .data(function(d) { return d.ages; })
          .enter().append("rect")
          .attr("width", x1.rangeBand())
          .attr("x", function(d) { return x1(d.name); })
          .attr("y", function(d) { return y(d.value); })
          .attr("height", function(d) { return height - y(d.value); })
          .style("fill", function(d) { return color(d.name); });
    
    var legend = svg.selectAll(".legend")
          .data(ageNames.slice().reverse())
          .enter().append("g")
          .attr("class", "legend")
          .attr("transform", function(d, i) { return "translate(0," + i * 20 + ")"; });
    
    legend.append("rect")
          .attr("x", width - 18)
          .attr("width", 18)
          .attr("height", 18)
          .style("fill", color);
    
    legend.append("text")
          .attr("x", width - 24)
          .attr("y", 9)
          .attr("dy", ".35em")
          .style("text-anchor", "end")
          .text(function(d) { return d; });
    
    </script>
    </body>
    </html>
    

    这里是 JS Bin 版本:http://jsbin.com/nuyipikaye/edit?html,js,output

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 2013-01-11
      • 1970-01-01
      相关资源
      最近更新 更多