javascript - D3 中的水平条形图条形标签

标签 javascript d3.js bar-chart label

我正在尝试显示水平条形图的条形标签,但它们没有显示在条形图的边缘,而是显示在条形图的顶部。我认为我的代码的“//水平条标签”部分有问题。代码如下,我还包含了我制作的图表的图片以及我希望它看起来像的图表:

 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="utf-8">
 <title>Housing Tenure of DC Residents</title>

 <style type="text/css">

  .axis text{
  font-family: Arial;
  font-size: 13px;
  color: #333333;
  text-anchor: end;
   }

  .axis path {
  fill:none;
  stroke:#333333 ;
  stroke-width: 1.5px;
  shape-rendering: crispEdges
 font-family: Arial;
  }


    .bar{
    stroke: none;
    fill: #037FAA;

   }
     .axis .label{
    font-family:  Arial;
    font-size:13px;
    color: #333333;
    text-anchor: middle;

    }
     .textlabel{
    font-family:  Arial;
    font-size:13px;
    color: #333333;
    text-anchor: left;
   }

  }

   </style>
    </head>
   <body>

   <script type="text/javascript" src="d3/d3.js"></script>
   <script>

    var outerWidth = 475;
    var outerHeight = 350;
    var margin = { left: 75, top: 20, right: 0, bottom: 60 };
    var padding = 100;



  var barPadding = 0.2;
  var barPaddingOuter = 0.1;
  var xColumn = "Percentage";
  var yColumn = "LabelD3";

  var xAxisLabelOffset = 75;


  var innerWidth  = outerWidth  - margin.left - margin.right;
  var innerHeight = outerHeight - margin.top  - margin.bottom;


  var svg = d3.select("body").append("svg")
    .attr("width",  outerWidth)
    .attr("height", outerHeight)
    .attr("viewBox", "0 0 " + outerWidth + " " + outerHeight); 


  var g = svg.append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");


  var xAxisG = g.append("g")
    .attr("class", "x axis")
    .attr("transform", "translate(0," + innerHeight + ")")



  var yAxisG = g.append("g")
    .attr("class", "y axis");


  var xScale = d3.scale.linear()
  .range([0, innerWidth - margin.right - margin.left], .1);


  var yScale = d3.scale.ordinal()
  .rangeRoundBands([innerHeight , 0], barPadding, barPaddingOuter);


  var xAxis = d3.svg.axis().scale(xScale).orient("bottom")
    .ticks(7)
    .tickFormat(function(d) {return d + "%"});


  var yAxis = d3.svg.axis().scale(yScale).orient("left")
    .outerTickSize(0);


    function render(data){
    xScale.domain([0, d3.max(data, function (d){ return d[xColumn]; })]);
    yScale.domain(       data.map( function (d){ return d[yColumn]; }));
    xAxisG.call(xAxis);
    yAxisG.call(yAxis);


    var bars = g.selectAll("rect").data(data);
    bars.enter().append("rect")
      .attr("height", yScale.rangeBand());
    bars
      .attr("x", 0)
      .attr("class", "bar")
      .attr("y",     function (d){ return yScale(d[yColumn]); })
      .attr("width", function (d){ return xScale(d[xColumn]); });


  // horizontal bar labels
   svg.append("g")
  .attr("transform", "translate(" + margin.left + "," + margin.top + ")")
    .selectAll(".textlabel")
   .data(data)
   .enter()
   .append("text")
 .attr("class", "textlabel")
 .style("font-family", "Arial")
.attr("x", function(d){ return xScale(d["Percentage"]) + (xScale.range()/2);  })
 .attr("y", function(d){ return yScale(d["LabelD3"]) - 3; })
.text(function(d){ return (d["Percentage"] + "%"); }); 


 // X-axis labels
svg.append("text")
.attr("text-anchor", "middle")
.style("font-size", "13px")
.style("color", "#333333")
.attr("transform", "translate("+ (outerWidth/2) + "," +(outerHeight-(padding/4)) + ")")
.text("% of Households")
.style("font-family", "Arial"); 

 //title for the chart 

svg.append("text")
.attr("text-anchor", "middle")
.style("font-size", "16px")
.style("color", "#333333")
.attr("transform", "translate("+ (outerWidth/3.78) + "," +(outerHeight/30) + ")")
.text("Housing Tenure of DC Residents")
.style("font-family", "Arial");

 //source

svg.append("text")
.attr("text-anchor", "middle")
.style("font-size", "13px")
.style("color", "#333333")
.attr("transform", "translate("+ (outerWidth/3.2) + "," +(outerHeight/1) + ")")
.text("Source: US Census ACS 5-year 2010-2014")
.style("font-family", "Arial")


 svg.append("text")
.attr("text-anchor", "left")
.style("font-size", "10x")
.style("color", "#333333")
.attr("transform", "translate("+ (outerWidth/28) + "," +(outerHeight/12) + ")")
.text("2014")
.style("font-family", "Arial")



    bars.exit().remove();
  }
  function type(d){
    d.population = +d.population;
    return d;
  }
  d3.csv("Housing.csv", type, render);
   </script>
  </body>
 </html>

This is the bar chart I want it look like

This is what I have right now

Percentage,LabelD3
41.6,Own home
58.6,Rent home

最佳答案

而不是对水平条标签执行此操作

.attr("x", function(d){ return xScale(d["Percentage"]) + (xScale.range()/2);  })

这样做

.attr("x", function(d){ return xScale(parseFloat(d["Percentage"])) ;  })
 .attr("y", function(d){ return yScale(d["LabelD3"]) + yScale.rangeBand()/2; })

工作代码here

关于javascript - D3 中的水平条形图条形标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36490422/

相关文章:

javascript - 我们如何以这种方式为导航栏设置动画?

javascript - 如何将 Tawk 聊天嵌入到 OpenCart 3

javascript - 将 slideToggle() 添加到函数中

javascript - 文本换行,使用call函数传递数据

javascript - 如何在 React 0.14 ES6 中单击时清除状态或清空数组?

d3.js - 如何为 D3js 进行几个月/几天的本地化?

javascript - D3.js:如何用特定颜色突出显示树状图中的节点?

表示范围的 Python 条形图

D3.js - 如何在条形图中突出显示最大和最小(最小和最大)列?

r - ggplot 在 x 轴上显示表达式