2016-12-24 1 views
0

Ich versuche, mit d3.js ein Säulendiagramm zu erstellen, das sortiert werden kann und dynamisch die Höhe entsprechend der Schiebereglereingabe ändert. Bei der Arbeit mit Slidern hatte ich in zweierlei Hinsicht Probleme. DerzeitJS: Mit Schiebereglern arbeiten

(1), sieht die Seite wie folgt aus: enter image description here

ich nicht herausfinden können, wie Sie den Regler neu zu positionieren, so dass es auf der rechten Seite des Balkendiagramms ist nicht darunter . Ich habe versucht, das div-Tag für den Schieberegler mit Stil zu ändern, aber das hat nichts geändert.

(2) Als Anfänger für JS würde ich mich über jeden Rat freuen, wie man die Balkendiagrammhöhen basierend auf der Schiebereglereingabe dynamisch ändert. Wenn der Schieberegler größer ist, sollte die Höhe des Balkendiagramms größer sein.

+0

'Wenn Der Slider-Eingang ist größer, die Höhe des Balkendiagramms sollte größer sein. Was bedeutet das? Wenn Sie den Schieberegler nach rechts ziehen, werden die Balken größer? Wie passt es den "Ranking" -Wert an? – Mark

Antwort

2

Tough diese Frage zu beantworten, da ich Ihre wahre Endziele wissen nicht (mein Kommentar siehe oben), aber hier ist eine Möglichkeit, zu zeigen, was Sie nach:

<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <script data-require="[email protected]" data-semver="3.5.17" src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.js"></script> 
 
    <link rel="stylesheet" href="https://rawgit.com/sujeetsr/d3.slider/master/d3.slider.css" /> 
 
    <script src="https://rawgit.com/sujeetsr/d3.slider/master/d3.slider.js"></script> 
 
</head> 
 

 
<body> 
 
    <label> <input type="checkbox"> Sort values</label> 
 
    <div id="testslider"></div> 
 

 
    <style> 
 
    body { 
 
     font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 
 
     position: relative; 
 
    } 
 
    
 
    .axis text { 
 
     font: 8px sans-serif; 
 
    } 
 
    
 
    .axis path, 
 
    .axis line { 
 
     fill: none; 
 
     stroke: #000; 
 
     shape-rendering: crispEdges; 
 
    } 
 
    
 
    .bar { 
 
     fill: green; 
 
     fill-opacity: .9; 
 
    } 
 
    
 
    .x.axis path { 
 
     display: none; 
 
    } 
 
    
 
    label { 
 
     position: absolute; 
 
     top: 10px; 
 
     right: 10px; 
 
    } 
 
    
 
    #testslider { 
 
     position: absolute; 
 
     top: 25px; 
 
     right: 10px; 
 
     width: 200px; 
 
     margin-left: 30px; 
 
    } 
 
    </style> 
 

 
    <script type="text/javascript"> 
 
    var margin = { 
 
     top: 20, 
 
     right: 20, 
 
     bottom: 30, 
 
     left: 40 
 
     }, 
 
     width = 750 - margin.left - margin.right, 
 
     height = 375 - margin.top - margin.bottom; 
 

 
    var formatPercent = d3.format(".0"); 
 

 
    var x = d3.scale.ordinal() 
 
     .rangeRoundBands([0, width], .1, 1); 
 

 
    var y = d3.scale.linear() 
 
     .range([height, 0]); 
 

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

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

 
    var svg = d3.select("body").append("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 testerCallback = function() { 
 
     var val = slider.value(); 
 
     svg.selectAll(".bar") 
 
     .data(origData.map(function(d){ 
 
      return { 
 
      ranking: d.ranking * val, 
 
      drug: d.drug 
 
      }; 
 
     })) 
 
     .attr("y", function(d) { 
 
      return y(d.ranking); 
 
     }) 
 
     .attr("height", function(d) { 
 
      return height - y(d.ranking); 
 
     }); 
 
    }; 
 
    
 
    var data = [{ 
 
     drug: "A", 
 
     ranking: 0.1 
 
    }, { 
 
     drug: "B", 
 
     ranking: 0.3 
 
    }, { 
 
     drug: "C", 
 
     ranking: 0.3 
 
    }, { 
 
     drug: "D", 
 
     ranking: 0.5 
 
    }, { 
 
     drug: "E", 
 
     ranking: 0.5 
 
    }, { 
 
     drug: "F", 
 
     ranking: 0.4 
 
    }]; 
 

 
    var origData; 
 
    //d3.csv("data.tsv", function(error, data) { 
 
     
 
     data.forEach(function(d) { 
 
     d.ranking = +d.ranking; 
 
     }); 
 

 
     origData = data; 
 
    
 
     x.domain(data.map(function(d) { 
 
     return d.drug; 
 
     })); 
 

 
     svg.append("g") 
 
     .attr("class", "x axis") 
 
     .attr("transform", "translate(0," + height + ")") 
 
     .call(xAxis); 
 

 
     svg.append("g") 
 
     .attr("class", "y axis") 
 
     .call(yAxis) 
 
     .append("text") 
 
     .attr("transform", "rotate(-90)") 
 
     .attr("y", 5) 
 
     .attr("dy", ".71em") 
 
     .style("text-anchor", "end") 
 
     .text("Score (Higher is better)"); 
 

 
     svg.selectAll(".bar") 
 
     .data(data) 
 
     .enter().append("rect") 
 
     .attr("class", "bar") 
 
     .attr("x", function(d) { 
 
      return x(d.drug); 
 
     }) 
 
     .attr("width", x.rangeBand()) 
 
     .attr("y", function(d) { 
 
      return y(d.ranking); 
 
     }) 
 
     .attr("height", function(d) { 
 
      return height - y(d.ranking); 
 
     }); 
 

 
     d3.select("input").on("change", change); 
 

 
     function change() { 
 
     var x0 = x.domain(data.sort(this.checked ? 
 
       function(a, b) { 
 
       return b.ranking - a.ranking; 
 
       } : 
 
       function(a, b) { 
 
       return d3.ascending(a.drug, b.drug); 
 
       }) 
 
      .map(function(d) { 
 
       return d.drug; 
 
      })) 
 
      .copy(); 
 
     svg.selectAll(".bar") 
 
      .sort(function(a, b) { 
 
      return x0(a.drug) - x0(b.drug); 
 
      }); 
 
     var transition = svg.transition().duration(750), 
 
      delay = function(d, i) { 
 
      return i * 50; 
 
      }; 
 
     transition.selectAll(".bar") 
 
      .delay(delay) 
 
      .attr("x", function(d) { 
 
      return x0(d.drug); 
 
      }); 
 
     transition.select(".x.axis") 
 
      .call(xAxis) 
 
      .selectAll("g") 
 
      .delay(delay); 
 
     } 
 

 
    //}); 
 

 
    var tickFormatter = function(d) { 
 
     return d === 0 ? "not important" : "very important"; 
 
    }; 
 

 
    var slider = d3.slider().min(0).max(1).value(1).ticks(1).showRange(true).tickFormat(tickFormatter).callback(testerCallback); 
 
    d3.select('#testslider').call(slider); 
 
    d3.selectAll(".tick>text").style("text-anchor", "start"); 
 
    d3.selectAll(".tick:last-of-type>text").style("text-anchor", "end"); 
 
    </script> 
 
</body> 
 

 
</html>

+0

Vielen Dank! – user2657817

+0

Wenn Sie mehrere Schieberegler haben möchten, die das Balkendiagramm dynamisch ändern können, wie würden Sie das machen? – user2657817

Verwandte Themen