javascript - 尝试将 Tributary D3.js 示例转移到 JSFiddle

标签 javascript d3.js

我对 JS 和 D3.js 都是初学者; my JSFiddle is here .

JSHint 显示没有错误,所以我认为我做错了 D3。

我正在尝试做与这些问题相同的事情,调整支流示例以在该平台之外运行:"Exporting" a Tributary example that makes use of the tributary object - d3.jsGetting horizontal stack bar example to display using d3.js (我什至改编了与后者相同的代码)不幸的是,两个答案中都没有更正的 JSFiddle 或其他示例

这是我的代码:

var VanillaRunOnDomReady = function() { 
var margins = {
    top: 12,
    left: 48,
    right: 24,
    bottom: 24
};
var data = [
{"key":"Nonviolent", "cat1":0.69, "cat2":0.21, "cat3":0.10},
{"key":"Violent", "cat1":0.53, "cat2":0.29, "cat3":0.18}
];

var catnames = {cat1: "No mental illness",
                cat2: "Mild mental illness",
                cat3: "Moderate or severe mental illness"}; 

var svg = d3.select('body')
        .append('svg')
        .attr('width', width + margins.left + margins.right)
        .attr('height', height + margins.top + margins.bottom)
        .append('g')
        .attr('transform', 'translate(' + margins.left + ',' + margins.top + ')');

var n = 3, // number of layers
    m = data.length, // number of samples per layer
    stack = d3.layout.stack(),
    labels = data.map(function(d) {return d.key;}),

    //go through each layer (cat1, cat2 etc, that's the range(n) part)
    //then go through each object in data and pull out that objects's catulation data
    //and put it into an array where x is the index and y is the number
    layers = stack(d3.range(n).map(function(d) { 
                var a = [];
                for (var i = 0; i < m; ++i) {
                     a[i] = {x: i, y: data[i]['cat' + (d+1)]};  
                }
                return a;
             })),

    //the largest single layer
    yGroupMax = d3.max(layers, function(layer) { return d3.max(layer, function(d) { return d.y; }); }),
    //the largest stack
    yStackMax = d3.max(layers, function(layer) { return d3.max(layer, function(d) { return d.y0 + d.y; }); });

var margin = {top: 40, right: 10, bottom: 20, left: 50},
    width = 677 - margin.left - margin.right,
    height = 533 - margin.top - margin.bottom;

var y = d3.scale.ordinal()
    .domain(d3.range(m))
    .rangeRoundBands([2, height], 0.08);

var x = d3.scale.linear()
    .domain([0, yStackMax])
    .range([0, width]);

var color = d3.scale.linear()
    .domain([0, n - 1])
    .range(["#aad", "#556"]);

var layer = svg.selectAll(".layer")
    .data(layers)
  .enter().append("g")
    .attr("class", "layer")
    .style("fill", function(d, i) { return color(i); });

layer.selectAll("rect")
    .data(function(d) { return d; })
    .enter().append("rect")
    .attr("y", function(d) { return y(d.x); })
    .attr("x", function(d) { return x(d.y0); })
    .attr("height", y.rangeBand())
    .attr("width", function(d) { return x(d.y); });

var yAxis = d3.svg.axis()
    .scale(y)
    .tickSize(1)
    .tickPadding(6)
    .tickValues(labels)
    .orient("left");

svg.append("g")
    .attr("class", "y axis")
    .call(yAxis);

};

最佳答案

我认为你只是缺少一个 ();在函数末尾和分号之前。这将使它自动执行。我 fork 了你的fiddle .

var VanillaRunOnDomReady = function() { 
var margins = {
    top: 12,
    left: 48,
    right: 24,
    bottom: 24
};
var data = [
{"key":"Nonviolent", "cat1":0.69, "cat2":0.21, "cat3":0.10},
{"key":"Violent", "cat1":0.53, "cat2":0.29, "cat3":0.18}
];

var catnames = {cat1: "No mental illness",
                cat2: "Mild mental illness",
                cat3: "Moderate or severe mental illness"}; 

var svg = d3.select('body')
        .append('svg')
        .attr('width', width + margins.left + margins.right)
        .attr('height', height + margins.top + margins.bottom)
        .append('g')
        .attr('transform', 'translate(' + margins.left + ',' + margins.top + ')');

var n = 3, // number of layers
    m = data.length, // number of samples per layer
    stack = d3.layout.stack(),
    labels = data.map(function(d) {return d.key;}),

    //go through each layer (cat1, cat2 etc, that's the range(n) part)
    //then go through each object in data and pull out that objects's catulation data
    //and put it into an array where x is the index and y is the number
    layers = stack(d3.range(n).map(function(d) { 
                var a = [];
                for (var i = 0; i < m; ++i) {
                     a[i] = {x: i, y: data[i]['cat' + (d+1)]};  
                }
                return a;
             })),

    //the largest single layer
    yGroupMax = d3.max(layers, function(layer) { return d3.max(layer, function(d) { return d.y; }); }),
    //the largest stack
    yStackMax = d3.max(layers, function(layer) { return d3.max(layer, function(d) { return d.y0 + d.y; }); });

var margin = {top: 40, right: 10, bottom: 20, left: 50},
    width = 677 - margin.left - margin.right,
    height = 533 - margin.top - margin.bottom;

var y = d3.scale.ordinal()
    .domain(d3.range(m))
    .rangeRoundBands([2, height], 0.08);

var x = d3.scale.linear()
    .domain([0, yStackMax])
    .range([0, width]);

var color = d3.scale.linear()
    .domain([0, n - 1])
    .range(["#aad", "#556"]);

var svg = d3.select("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 layer = svg.selectAll(".layer")
    .data(layers)
  .enter().append("g")
    .attr("class", "layer")
    .style("fill", function(d, i) { return color(i); });

layer.selectAll("rect")
    .data(function(d) { return d; })
    .enter().append("rect")
    .attr("y", function(d) { return y(d.x); })
    .attr("x", function(d) { return x(d.y0); })
    .attr("height", y.rangeBand())
    .attr("width", function(d) { return x(d.y); });

var yAxis = d3.svg.axis()
    .scale(y)
    .tickSize(1)
    .tickPadding(6)
    .tickValues(labels)
    .orient("left");

svg.append("g")
    .attr("class", "y axis")
    .call(yAxis);

}();

关于javascript - 尝试将 Tributary D3.js 示例转移到 JSFiddle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26931082/

相关文章:

html - D3 路径缺少高度元素

d3.js - 使用d3 js中的对角线函数在两点之间绘制曲线

javascript - selection.data 返回不同类型的对象

javascript - 如何沿着向量移动节点?

javascript - 简单的 D3.js 折线图,其中包含每小时收集的值数据

javascript - 在 Gridster 上,拖动期间将小部件保持在鼠标下方

javascript - 维护CSS :hover effect for all items up a nested list chain

javascript - 如果已经选择了第一个,则从第二个选择中删除选项

javascript - 如何使用正则表达式搜索字符串并仅更改其中的一部分?

javascript - Highcharts 如何保存选定的图例