2013-10-29 75 views
3

我在D3.js.写入简化的柱形图脚本上d3.js:突出显示的x轴标记的列/条形图

这里有一个小提琴:http://jsfiddle.net/rolfsf/F36Vw/

的目的是比较一些小的项目,比重点项目大的。

这样的:

enter image description here

如何选择和突出$ 750K x轴的标签,我怎么可以添加额外的标签,以识别焦点项(ACE小工具)?

我正在寻找的东西比瞄准中间;-)

我的数据更精确目前看起来是这样的(可以很容易地改变):

var data = { 

    "sales": [ 
      [600, 1], 
      [650, 2], 
      [700, 3], 
      [750, 2], 
      [800, 1], 
      [850, 2], 
      [900, 3] 
    ] 
}; 

和列脚本在这里:

function miniColumnChart(){ 

    var barWidth = 20; 
    var margin = { 
     top: 64, 
     right: 32, 
     bottom: 64, 
     left: 32, 
     labels: 32 
    }; 
    var height = 300; //overridden by width in call 
    var width = 500; //overridden by width in call  
    var chartTitle = ["test"]; 
    var yAxisLabel = "y axis label"; 
    var xAxisLabel = "x axis label"; 
    var xformat = function(d){return d;}; 
    var focus; 

    function chart(selection) { 
     var maxBarHeight = height - (margin.top + margin.bottom); 
     var chartWidth = width - margin.right - margin.left; 

     d3.select('svg').remove();//remove old charts 

     selection.each(function(data) { 

      var xValue = function(d) { return d[0]; }; 
      var yValue = function(d) { return d[1]; }; 

      var x = d3.scale.ordinal() 
       .domain(data.map(function(d) { return d[0]; })) 
       .rangeRoundBands([margin.labels, chartWidth], 0); 

      var y = d3.scale.linear() 
       .domain([0, d3.max(data, function(d) { return d[1]; })]) 
       .range([maxBarHeight, 0]) 
       .nice(); 

      var xAxis = d3.svg.axis().scale(x).orient("bottom").tickFormat(xformat); 

      //var yAxis = d3.svg.axis().scale(y).orient("left"); 

      var svgContainer = d3.select(this).append("svg") 
       .attr("class", "chart mini-column-chart") 
       .attr("width", width) 
       .attr("height", height).append("g") 
       .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 

      svgContainer.append("g") 
       .attr("class", "x axis") 
       .attr("transform", "translate(0," + (height - margin.top - margin.bottom) + ")") 
       .call(xAxis) 

       .append("text") 
       .attr("class", "axis-label") 
       .attr("x", width/2) 
       .attr("text-anchor", "middle") 
       .attr("dy", 48) 
       .text(xAxisLabel); 

      var header = svgContainer.append("text") 
       .attr("class", "chart-title") 
       .attr("x", width/2) 
       .attr("text-anchor", "middle") 
       .attr("dy", -32) 
       .text(chartTitle); 

      var barValues = svgContainer.append("g") 
       .attr("class", "bar-values"); 

      barValues.selectAll("text") 
       .data(data) 
        .enter().append("text") 
       .attr("x", function(d, i) { 
        return ((i+1) * x.rangeBand()); 
       }) 
       .attr("y", function(d) { return y(d[1]);}) 
       .attr("dy", -5) 
       .attr("text-anchor", "middle") 
       .text(function(d) {return d[1];}); 

      svgContainer.append("g") 
       .attr("class", "y axis")//.call(yAxis) 
       .append("text") 
       .attr("class", "axis-label") 
       .attr("transform", "rotate(-90)") 
       .attr("y", 8) 
       .attr("x", -(height-margin.top-margin.bottom)) 
       //.attr("dy", ".71em") 
       .style("text-anchor", "start") 
       .text(yAxisLabel); 

      var bars = svgContainer.append("g") 
       .attr("class", "bars"); 

      bars.selectAll(".bar") 
       .data(data) 
        .enter().append("rect") 
       .attr("class", "bar") 
       .attr("x", function(d, i) { 
        return ((i+1) * x.rangeBand())-(barWidth/2); 
       }) 
       .attr("y", function(d) { return y(d[1]);}) 
       .attr("width", barWidth) 
       .attr("height", function(d) { 
        return (maxBarHeight -y(d[1])); 
       }); 
     }); 
    } 


    chart.title = function(_) { 
     if (!arguments.length) return chartTitle; 
     chartTitle = _; 
     return chart; 
    }; 

    chart.x = function(_) { 
     if (!arguments.length) return xValue; 
     xValue = _; 
     return chart; 
    }; 

    chart.y = function(_) { 
     if (!arguments.length) return yValue; 
     yValue = _; 
     return chart; 
    }; 

    chart.width = function(_) { 
     if (!arguments.length) return width; 
     width = _; 
     return chart; 
    }; 

    chart.height = function(_) { 
     if (!arguments.length) return height; 
     height = _; 
     return chart; 
    }; 

    chart.barWidth = function(_) { 
     if (!arguments.length) return barWidth; 
     barWidth = _; 
     return chart; 
    }; 

    chart.xformat = function(_) { 
     if (!arguments.length) return xformat; 
     xformat = _; 
     return chart; 
    }; 

    chart.yAxisLabel = function(_) { 
     if (!arguments.length) return yAxisLabel; 
     yAxisLabel = _; 
     return chart; 
    }; 

    chart.xAxisLabel = function(_) { 
     if (!arguments.length) return xAxisLabel; 
     xAxisLabel = _; 
     return chart; 
    }; 

    return chart; 
} 

d3.select('#chart') 
    .datum(data.sales) 
    .call(miniColumnChart() 
    .title("Similar Companies") 
    .xformat(function(d){return '$' + d + 'K';}) 
    .yAxisLabel("# of Similar Companies") 
    .xAxisLabel("Company Size") 
); 

回答

5

首先,存储到g选择你绘制的轴线成一个参考:

var xAxisG = svgContainer.append("g") 
    .attr("class", "x axis") 
    .attr("transform", "translate(0," + (height - margin.top - margin.bottom) + ")") 
    .call(xAxis) 

然后,您可以选择所有的蜱里面:

xAxisG.selectAll('.tick') 

蜱是含textline,这d3.axis为您创建g元素。然后在蜱迭代在此选择:

.each(function(d, i) { 
    // In here, d is the ordinal value associated with each tick 
    // and 'this' is the dom element 
}) 

在循环中,你可以“挑”你有兴趣更新蜱,你可以颜色的文字等:

.each(function(d, i) { 
    if(d == 750) { 
     d3.select(this) 
      .append('text') 
      .text("Ace Widgets") 
      .attr({ 
       "text-anchor": "middle", 
       dy: 33, 
       "font-size": ".8em" 
      }) 
     d3.select(this) 
      .selectAll('text') 
       .style("fill", "red") 
    } 

这里的在updated jsfiddle

+0

东西问题的是源于这是,如果你有这个包裹的动态数据更新功能中,那么.append(文本)部分将继续添加文本元素,并不会改变什么已经存在。试图找出解决方案,如果我这样做,会发布。 – Adam

+0

@Adam这意味着,'xAxisG'也被复制在每个更新,因为'VAR xAxisG = svgContainer.append(“G”)'上的每个更新运行。如果是这样,你必须修改的东西只创建一次轴。 – meetamit

+0

这一定是真的吗?你可以在你的更新函数之外有'var xAxisG = svgContainer.append(“g”)',如果这个轴没有改变,除了在代码的'.each()'位中操作的文本。 – Adam