2016-06-28 3 views
0

다음은 코드 http://jsfiddle.net/4tqn7162/1/에 대한 링크입니다 .svg 폭이 완전히 사라진 후 막대를 왼쪽 또는 오른쪽으로 끌면됩니다 .I 확대 작동에 영향을 미치지 않고 그것을 제한하고 싶습니다. 누구든지 저를 도울 수 있습니다. 그래프 플롯 사용D3.js : 그룹화 된 막 대형 차트에서 x 축 끌기를 제한하는 방법

var margin = {top: 20, right: 20, bottom: 30, left: 40}, 
    width = 300 - margin.left - margin.right, 
    height = 400 - margin.top - margin.bottom; 

데이터

var data = [ 
    { 
     "State": "CA", 
     "Under 5 Years": 2704659, 
     "5 to 13 Years": 4499890, 
     "14 to 17 Years": 2159981, 
     "18 to 24 Years": 3853788, 
     "25 to 44 Years": 10604510, 
     "45 to 64 Years": 8819342, 
     "65 Years and Over": 4114496 
    }, 
    { 
     "State": "TX", 
     "Under 5 Years": 2027307, 
     "5 to 13 Years": 3277946, 
     "14 to 17 Years": 1420518, 
     "18 to 24 Years": 2454721, 
     "25 to 44 Years": 7017731, 
     "45 to 64 Years": 5656528, 
     "65 Years and Over": 2472223 
    }, 
    { 
     "State": "NY", 
     "Under 5 Years": 1208495, 
     "5 to 13 Years": 2141490, 
     "14 to 17 Years": 1058031, 
     "18 to 24 Years": 1999120, 
     "25 to 44 Years": 5355235, 
     "45 to 64 Years": 5120254, 
     "65 Years and Over": 2607672 
    }, 
    { 
     "State": "FL", 
     "Under 5 Years": 1140516, 
     "5 to 13 Years": 1938695, 
     "14 to 17 Years": 925060, 
     "18 to 24 Years": 1607297, 
     "25 to 44 Years": 4782119, 
     "45 to 64 Years": 4746856, 
     "65 Years and Over": 3187797 
    }, 
    { 
     "State": "IL", 
     "Under 5 Years": 894368, 
     "5 to 13 Years": 1558919, 
     "14 to 17 Years": 725973, 
     "18 to 24 Years": 1311479, 
     "25 to 44 Years": 3596343, 
     "45 to 64 Years": 3239173, 
     "65 Years and Over": 1575308 
    }, 
    { 
     "State": "PA", 
     "Under 5 Years": 737462, 
     "5 to 13 Years": 1345341, 
     "14 to 17 Years": 679201, 
     "18 to 24 Years": 1203944, 
     "25 to 44 Years": 3157759, 
     "45 to 64 Years": 3414001, 
     "65 Years and Over": 1910571 
    }]; 
var x0 = d3.scale.ordinal() 
    .rangeRoundBands([0, width], .1); 

var x1 = d3.scale.ordinal(); 

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

var color = d3.scale.ordinal() 
    .range(["#98abc5", "#8a89a6", "#7b6888", "#6b486b", "#a05d56", "#d0743c", "#ff8c00"]); 

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

var yAxis = d3.svg.axis() 
    .scale(y) 
    .orient("left") 
    .tickFormat(d3.format(".1s")); 

var svg = d3.select("#chart").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 + ")") 
.call(d3.behavior.zoom().scaleExtent([1, 10]).on("zoom", zoom)); 

//d3.csv("data.csv", function(error, data) { 
var ageNames = d3.keys(data[0]).filter(function(key) { return key !== "State"; }); 
    console.log("ageNames="+JSON.stringify(ageNames)); 
data.forEach(function(d) { 
    d.ages = ageNames.map(function(name) { return {name: name, value: +d[name]}; }); 
     console.log("d.ages="+JSON.stringify(d.ages)); 
    }); 

    x0.domain(data.map(function(d) { return d.State; })); 
    x1.domain(ageNames).rangeRoundBands([0, x0.rangeBand()]); 
    y.domain([0, d3.max(data, function(d) { 
     console.log(" before retuen d.ages="+d.ages); 
    return d3.max(d.ages, function(d) 
    { console.log("d.value;="+d.value); 
    return d.value; }); 
    })]); 

    svg.append("g") 
     .attr("class", "y axis") 
     .call(yAxis) 
    .append("text") 
     .attr("transform", "rotate(-90)") 
     .attr("y", 6) 
     .attr("dy", ".5em") 
     .style("text-anchor", "end") 
     .text("Population"); 

var mask = svg.append("defs") 
    .append("clipPath") 
    .attr("id", "mask") 
    .append("rect") 
    .attr({ 
     x: 0, 
     y: 0, 
     width: width, 
     height: height + margin.bottom, 
    }) 

var masked = svg.append("g") 
    .attr("clip-path", "url(#mask)") 

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

var allStates = masked 
    .append("g") 
    .attr("class", "allStates"); 

    var state = svg.selectAll(".state") 
     .data(data) 
    .enter().append("g") 
     .attr("class", "state") 
     .attr("transform", function(d) { return "translate(" + x0(d.State) + ",0)"; }); 

var state = allStates.selectAll(".state") 
    .data(data) 
    .enter().append("g") 
    .attr("class", "state") 
    .attr("transform", function(d) { return "translate(" + x0(d.State) + ",0)"; }); 

    state.selectAll("rect") 
     .data(function(d) { return d.ages; }) 
    .enter().append("rect") 
     .attr("width", x1.rangeBand()) 
     .attr("x", function(d) { return x1(d.name); }) 
     .attr("y", function(d) { return y(d.value); }) 
     .attr("height", function(d) { return height - y(d.value); }) 
     .style("fill", function(d) { return color(d.name); }); 
var legnColorGap=height/17.5; 
    var legend = svg.selectAll(".legend") 
     .data(ageNames.slice().reverse()) 
    .enter().append("g") 
     .attr("class", "legend") 
     .attr("transform", function(d, i) { return "translate(0," + i * legnColorGap + ")"; }); 
var lwidth=width/75 , lht=height/22,lwidth1=lwidth+2; 
    legend.append("rect") 
     .attr("x", width - lwidth1) 
     .attr("width", lwidth) 
     .attr("height", lht) 
     .style("fill", color); 
var textht=lht/2,textwd=textht+lwidth; 
    legend.append("text") 
     .attr("x", width - textwd) 
     .attr("y", textht) 
     .attr("dy", ".35em") 
     .style("text-anchor", "end") 
     .text(function(d) { return d; }); 
function zoom() { 
svg.select(".allStates").attr("transform", "translate(" + d3.event.translate[0]+",0)scale(" + d3.event.scale + ",1)"); 
svg.select(".x.axis").attr("transform", "translate(" + d3.event.translate[0]+","+(height)+")").call(xAxis.scale(x0.rangeRoundBands([0, width * d3.event.scale],.5 * d3.event.scale))); 
svg.select(".y.axis").call(yAxis); 
} 

답변

0

넌 (d3.behavior.zoom()

.call을 변경하여 추가하여 이벤트 패닝하지 않도록 할 수있다. scaleExtent를 ([1, 10 ]). on ("zoom", zoom));

.call (d3.behavior.zoom() scaleExtent ([1, 10]) ("줌"을 줌)에서.). ("mousedown.zoom"NULL)에.;

+0

사용을 제한하지 않고 사용을 제한하고 싶지는 않습니다. 그래야 막대가 완전히 사라지지 않습니다. – Sarthak

+0

나는 드래그를 해제 한 후에 확대/축소를 할 수 있습니다. 그래프의 막대 중 일부는 드래그 옵션이 필요한 다른 막대를 볼 수 있습니다. 모든 막대를 보려면 스크롤 옵션을 추가하는 것과 같은 방법이 있습니까? – Sarthak

+0

내 코드의 막대 그래프를 확대 한 경우 확대/축소 후 끌기를 해제하면 상태 막대를보기 위해 하나의 상태 데이터 만 볼 수 있음을 볼 수 있습니다. 드래그 옵션이 필요합니다. 모든 상태 데이터를 볼 수있는 스크롤 옵션을 추가하는 것과 같은 방법이 있습니까? – Sarthak

관련 문제