2013-04-22 167 views
0

我需要帮助将第二系列数据添加到我的条形图中。目前我正在填充我的数据集中的glob键的条形图。这将是第一个系列。我希望成为的第二个系列是当地。 我如何着手添加?创建配对条形图d3.js

Play with my JSFiddle here

var w = 300; 
var h = 200; 

var colors = ["#377EB8", "#4DAF4A"]; 

var dataset = [ 
      {"keyword": "payday loans", "glob": 1500000, "local": 673000, "cpc": "14.11"}, 
      {"keyword": "title loans", "glob": 165000, "local": 165000, "cpc": "12.53" }, 
      {"keyword": "personal loans", "glob": 550000, "local": 301000, "cpc": "6.14"} 
     ]; 

var data = [[1500000, 165000, 550000], 
     [673000, 165000, 301000]]; 

var tdata = d3.transpose(dataset.glob, dataset.local); 

var series = 2; // Global & Local 

var x0Scale = d3.scale.ordinal() 
      .domain(d3.range(dataset.length)) 
      .rangeRoundBands([0, w], 0.05); 
var x1Scale = d3.scale.ordinal() 
      .domain(d3.range(dataset.length)) 
      .rangeRoundBands([0, w], 0.05); 

var yScale = d3.scale.linear() 
      .domain([0, d3.max(dataset, function(d) {return d.glob;})]) 
      .range([0, h]); 

var glob = function(d) { 
return d.glob; 
}; 
var cpc = function(d) { 
return d.cpc; 
}; 

var commaFormat = d3.format(','); 

//SVG element 
var svg = d3.select("#searchVolume") 
     .append("svg") 
     .attr("width", w) 
     .attr("height", h);  

// Graph Bars 
svg.selectAll("rect") 
.data(dataset, cpc, glob) 
.enter() 
.append("rect") 
.attr("x", function(d, i){ 
    return x0Scale(i); 
}) 
.attr("y", function(d) { 
    return h - yScale(d.glob); 
}) 
.attr("width", x0Scale.rangeBand()) 
.attr("height", function(d) { 
    return yScale(d.glob); 
}) 
.attr("fill", colors[1]) 
.on("mouseover", function(d) { 
    //Get this bar's x/y values, then augment for the tooltip 
    var xPosition = parseFloat(d3.select(this).attr("x")) + x0Scale.rangeBand()/3; 
    var yPosition = parseFloat(d3.select(this).attr("y")) + yScale; 

    //Update Tooltip Position & value 
    d3.select("#tooltip") 
     .style("left", xPosition + "px") 
     .style("top", yPosition + "px") 
     .select("#cpcVal") 
     .text(d.cpc); 
    d3.select("#tooltip").classed("hidden", false); 
}) 
.on("mouseout", function() { 
    //Remove the tooltip 
    d3.select("#tooltip").classed("hidden", true); 
}); 

//Create labels 
svg.selectAll("text") 
    .data(dataset, glob) 
    .enter() 
.append("text") 
.text(function(d) { 
    return commaFormat(d.glob); 
}) 
.attr("text-anchor", "middle") 
.attr("x", function(d, i) { 
    return x0Scale(i) + x0Scale.rangeBand()/2; 
}) 
.attr("y", function(d) { 
    return h - yScale(d.glob) + 14; 
}) 
.attr("font-family", "sans-serif") 
.attr("font-size", "11px") 
.attr("fill", "white"); 
+0

你有没有看这个分组条形图例如:http://bl.ocks .org/mbostock/3887051 – 2013-04-22 23:59:41

+0

我曾看过那个。然而,他们正在从CSV获取数据,并且在我使用其他数据源时,我很难理解这些事情。 – EnigmaRM 2013-04-23 17:47:25

+0

当我第一次使用d3时,我一直在努力处理数据。与Mike Bostock的这种交流提供了很多帮助:http://stackoverflow.com/questions/11672438这个案例的具体细节并不像观察到他浪费时间试图处理我给他的数据结构一样重要。他正确地将其转化为一个更容易让d3使用的结构。通过映射,for循环和array.forEach函数,在创建d3中的连接之前,有大量资源可用于将数据转换为平易近人的结构。 – 2013-04-23 22:58:44

回答

4

这是最简单的创建SVG组(<g>)对于每一组数据元素,然后各部件添加到每个组。例如,大致为:

http://jsfiddle.net/WXMwv/1/

var sets = svg.selectAll(".set") 
    .data(dataset) 
    .enter().append("g") 
      .attr("class","set") 
    .attr("transform",function(d,i){ 
     return "translate(" + x0Scale(i) + ",0)" 
    }) 
    .on("mouseover", function(d,i) { 
     //Create x value from data index 
     var xPosition = parseFloat(x0Scale(i) + x0Scale.rangeBand()/6); 
     var yPosition = 0; 
     //Update Tooltip Position & value 
     d3.select("#tooltip") 
      .style("left", xPosition + "px") 
      .style("top", yPosition + "px") 
      .select("#cpcVal") 
      .text(d.cpc); 
     d3.select("#tooltip").classed("hidden", false); 
    }) 
    .on("mouseout", function() { 
     //Remove the tooltip 
     d3.select("#tooltip").classed("hidden", true); 
    }); 

sets.append("rect") 
    .attr("class","glob") 
    .attr("width", x0Scale.rangeBand()/2) 
    .attr("y", function(d) { 
     return yScale(d.glob); 
    }) 
    .attr("height", function(d){ 
     return h - yScale(d.glob); 
    }) 
    .attr("fill", colors[1]) 

sets.append("rect") 
    .attr("class","local") 
    .attr("width", x0Scale.rangeBand()/2) 
    .attr("y", function(d) { 
     return yScale(d.local); 
    }) 
    .attr("x", x0Scale.rangeBand()/2) 
    .attr("height", function(d){ 
     return h - yScale(d.local); 
    }) 
    .attr("fill", colors[0]) 

的文本元素被作为练习留给读者:)

+0

我将文本添加到'sets.append(“rect”)'。使用Firebug检查元素,我可以看到正确的文本已被绑定到正确的栏,但没有出现在屏幕上。你知道这是为什么吗? – EnigmaRM 2013-04-23 18:01:41

+0

以相同的方式将它们添加到集合中:http://jsfiddle.net/WXMwv/3/。您需要添加svg,因为您希望对它进行分层 - 首先是底部,然后是顶部。 – minikomi 2013-04-23 22:59:38