2016-06-28 49 views
1

我目前正在製作一個條形圖,它顯示的數據以水平條形式顯示,該條形根據放入代碼的數據增長。我在這裏試圖做的是讓文本出現在條的旁邊,並隨着數據的變化而變化。我已經創建了一個可以改變數據顯示的監聽器,我只是不知道如何使數據顯示和更改。將文本添加到我的酒吧 - D3

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <meta> 
 
    <meta name="description" content="Drawing Shapes w/ D3 - " /> 
 
    <meta charset="utf-8"> 
 
    <title>Resources per Project</title> 
 
    <script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script> 
 

 
    <style type="text/css"> 
 
    h1 { 
 
     font-size: 35px; 
 
     color: darkgrey; 
 
     font-family: Helvetica; 
 
     border-bottom-width: 3px; 
 
     border-bottom-style: dashed; 
 
     border-bottom-color: black; 
 
    } 
 
    
 
    h2 { 
 
     font-size: 20px; 
 
     color: black; 
 
     font-family: Helvetica; 
 
     text-decoration: underline; 
 
     margin-left: 350px; 
 
     margin-top: 0px; 
 
    } 
 
    </style> 
 
</head> 
 

 
<body> 
 
    <h1>Resources used per Project</h1> 
 

 
    <p>Choose Month: 
 
    <select id="label-option"> 
 
     <option value="April">April</option> 
 
     <option value="May">May</option> 
 
     <option value="June">June</option> 
 
     <option value="July">July</option> 
 
     <option value="August">August</option> 
 
     <option value="September">September</option> 
 
    </select> 
 
    <script type="text/javascript"> 
 
     var width = 800 
 
     var height = 500 
 
     var emptyVar = 0 
 
     var dataArrayProjects = ['2G', 'An', 'At', 'Au', 'AW', 'Ch', 'CI', 'CN'] 
 
     var April = [0.35, 1.66, 3.04, 1.54, 3.45, 2.56, 2.29, 1.37] 
 
     var May = [0.36, 1.69, 3.08, 1.54, 3.62, 2.61, 2.22, 1.44] 
 
     var June = [0.34, 1.7, 3.08, 1.63, 3.66, 2.68, 2.24, 1.51] 
 
     var July = [0.3, 1.72, 3.17, 1.67, 3.56, 2.56, 2.17, 1.44] 
 
     var August = [0.28, 1.79, 3.18, 1.71, 3.62, 2.73, 2.26, 1.54] 
 
     var September = [1.23, 1.74, 3.12, 1.61, 3.66, 2.71, 2.2, 1.48] 
 

 
     d3.select("#label-option").on("change", change) 
 

 
     function change() { 
 
     var data = April; 
 
     if (this.selectedIndex == 1){ 
 
      data = May; 
 
     } else if (this.selectedIndex == 2){ 
 
      data = June; 
 
     } else if (this.selectedIndex == 3){ 
 
      data = July; 
 
     } else if (this.selectedIndex == 4){ 
 
      data = August; 
 
     } else if (this.selectedIndex == 5){ 
 
      data = September; 
 
     } 
 
     canvas.selectAll("rect") 
 
     .data(data) 
 
     .attr("width", emptyVar) 
 
     .attr("height", 50) 
 
     .attr("fill", function(d) { 
 
      return color(d) 
 
     }) 
 
     .attr("y", function(d, i) { 
 
      return i * 55 
 
     }) 
 

 
     bars.transition() 
 
     .duration(1500) 
 
     .delay(200) 
 
     .attr("width", function(d) { 
 
      return widthScale(d); 
 
     })   
 
     } 
 

 
     var widthScale = d3.scale.linear() 
 
     .domain([0, 4]) 
 
     .range([0, width - 60]); 
 

 
     var heightScale = d3.scale.ordinal() 
 
     .domain(dataArrayProjects) 
 
     .rangePoints([10, height - 85]); 
 

 
     var color = d3.scale.linear() 
 
     .domain([0, 4]) 
 
     .range(["#000033", "#22cdff"]) 
 

 
     var xAxis = d3.svg.axis() 
 
     .ticks("30") 
 
     .scale(widthScale); 
 

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

 
     var canvas = d3.select("body") 
 
     .append("svg") 
 
     .attr("width", width) 
 
     .attr("height", height) 
 
     .append("g") 
 
     .attr("transform", "translate(40, 0)"); 
 

 
     var bars = canvas.selectAll("rect") 
 
     .data(April) 
 
     .enter() 
 
     .append("rect") 
 
     .attr("width", emptyVar) 
 
     .attr("height", 50) 
 
     .attr("fill", function(d) { 
 
      return color(d) 
 
     }) 
 
     .attr("y", function(d, i) { 
 
      return i * 55 
 
     }) 
 
     
 
     canvas.append("g") 
 
     .attr("transform", "translate(0, 430)") 
 
     .attr("font-family", "Helvetica") 
 
     .attr("font-size", "15px") 
 
     .call(xAxis); 
 

 
     canvas.append("g") 
 
     .attr("font-family", "Helvetica") 
 
     .attr("font-size", "15px") 
 
     .style("fill", "black") 
 
     .attr("class", "y axis") 
 
     .call(yAxis); 
 

 
     bars.transition() 
 
     .duration(1500) 
 
     .delay(200) 
 
     .attr("width", function(d) { 
 
      return widthScale(d); 
 
     }) 
 

 
     var yAxisLine = canvas.append("line") 
 
         .attr("x1", -3) 
 
         .attr("y1", 0) 
 
         .attr("x2", -3) 
 
         .attr("y2", 436) 
 
         .attr("stroke-width", 6) 
 
         .attr("stroke", "black"); 
 

 
     canvas.selectAll("text") 
 
     .data(April) 
 
     .enter() 
 
      .append("text") 
 
       .text(function(d) { 
 
      return April; 
 
    }) 
 
     .attr("x", function(d, i) { 
 
     return i * (width/April.length); 
 
    }) 
 
     .attr("y", function(d) { 
 
     return height - (April * 4); 
 
    }); 
 

 

 
    </script> 
 
    <h2>Resources</h2> 
 
</body> 
 
</html>

正如你可以看到的數據不容易讀取和硬不知道所述數據內的精確數量理解。如何讓數字顯示在顯示數據的確切數量的小節旁邊。請不要將其他條形圖與他們自己的工具提示鏈接起來,因爲我對d3.js不太熟悉,也不瞭解其他圖形。

回答

1

你可以做到這一點,首先創建標籤象下面這樣:

var texts = canvas.selectAll(".label")//select all DOMs with class label. 
     .data(April) 
     .enter() 
     .append("text") 
     .attr("class", "label") 
     .attr("x", function(d) { 
      return widthScale(d) + 10;//x location of the label 
     }) 
     .attr("fill", function(d) { 
      return color(d) 
     }) 
     .attr("y", function(d, i) { 
      return (i * 55) + 25; //y location of the label 
     }) 
     .text(function(d, i) { 
      return d; 
     }) 

終於在更新部分做如下更新標籤。

texts = canvas.selectAll(".label") 
    .data(data) 
    .attr("x", function(d) { 
     return widthScale(d) + 10; 
    }) 
    .attr("fill", function(d) { 
     return color(d) 
    }) 
    .attr("y", function(d, i) { 
     return (i * 55) + 25 
    }) 
    .text(function(d, i) { 
     return d; 
    })   

工作代碼here