2013-02-02 6 views
3

http://bl.ocks.org/1667367의 d3 예제를 기반으로 Focus + Context + Tooltip 그래프를 만들려고합니다. 기본 차트가 작동하지만 초점 차트를 사용하여 영역을 확대하려고 할 때 툴팁에 사용할 계획 인 '원'이 움직이지 않습니다. 이것은 내 코드입니다D3에서 문맥 확대/축소 브러시로 움직이는 스 캐터 플롯 원 이동

var margin = {top: 10, right: 10, bottom: 100, left: 40}, 
margin2 = {top: 430, right: 10, bottom: 20, left: 40}, 
width = 960 - margin.left - margin.right, 
height = 500 - margin.top - margin.bottom, 
height2 = 500 - margin2.top - margin2.bottom; 

var data = [{ 
'Wed Jan 23 00:00:00 IST 2013': 3383387 
}, { 
'Thu Jan 24 00:00:00 IST 2013': 3883387 
}, { 
'Fri Jan 25 00:00:00 IST 2013': 4383387 
}, { 
'Sat Jan 26 00:00:00 IST 2013': 2383387 
}, { 
'Sun Jan 27 00:00:00 IST 2013': 5383387 
}, { 
'Mon Jan 28 00:00:00 IST 2013': 2283387 
}]; 

var format = d3.time.format("%a %b %d %H:%M:%S IST %Y"); 

var parseDate = d3.time.format("%b %Y").parse; 

var x = d3.time.scale().range([0, width]), 
x2 = d3.time.scale().range([0, width]), 
y = d3.scale.linear().range([height, 0]), 
y2 = d3.scale.linear().range([height2, 0]); 

var xAxis = d3.svg.axis().scale(x).orient("bottom"), 
xAxis2 = d3.svg.axis().scale(x2).orient("bottom"), 
yAxis = d3.svg.axis().scale(y).orient("left"); 

var brush = d3.svg.brush() 
.x(x2) 
.on("brush", brush); 

var area = d3.svg.area() 
.interpolate("monotone") 
.x(function(d) { return x(format.parse(d3.keys(d)[0])); }) 
.y0(height) 
.y1(function(d) { return y(d3.values(d)[0]); }); 

var area2 = d3.svg.area() 
.interpolate("monotone") 
.x(function(d) { return x2(format.parse(d3.keys(d)[0])); }) 
.y0(height2) 
.y1(function(d) { return y2(d3.values(d)[0]); }); 

var svg = d3.select("body").append("svg") 
.attr("width", width + margin.left + margin.right) 
.attr("height", height + margin.top + margin.bottom); 

svg.append("defs").append("clipPath") 
.attr("id", "clip") 
.append("rect") 
.attr("width", width) 
.attr("height", height); 

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

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

x.domain(d3.extent(data.map(function(d) { return format.parse(d3.keys(d)[0]); }))); 
y.domain([0, d3.max(data.map(function(d) { return d3.values(d)[0]; }))]); 
x2.domain(x.domain()); 
y2.domain(y.domain()); 

focus.append("path") 
    .datum(data) 
    .attr("clip-path", "url(#clip)") 
    .attr("d", area); 

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

focus.append("g") 
    .attr("class", "y axis") 
    .call(yAxis); 

context.append("path") 
    .datum(data) 
    .attr("d", area2); 

context.append("g") 
    .attr("class", "x axis") 
    .attr("transform", "translate(0," + height2 + ")") 
    .call(xAxis2); 

context.append("g") 
    .attr("class", "x brush") 
    .call(brush) 
    .selectAll("rect") 
    .attr("y", -6) 
    .attr("height", height2 + 7); 

focus.append("g").selectAll('dot') 
.data(data) 
.enter().append("svg:circle") 
.attr("cx",function(d){ return x(format.parse(d3.keys(d)[0]));}) 
.attr("cy", function(d){ return y(d3.values(d)[0]);}) 
.attr("r", function(d){ return 4;}) 
.on('mouseover', function(d){ d3.select(this).attr('r', 8)}) 
.on('mouseout', function(d){ d3.select(this).attr('r', 4)});  

function brush() { 
x.domain(brush.empty() ? x2.domain() : brush.extent()); 
focus.select("path").attr("d", area); 
focus.select(".x.axis").call(xAxis); 
focus.select("circle").attr("cx",function(d){ return x(format.parse(d3.keys(d)[0]));}).attr("cy", function(d){ return y(d3.values(d)[0]);}); 
} 

나는 여기에 대한 피들 : http://jsfiddle.net/PyvZ7/을 만들었습니다. 어떤 도움이나 단서도 좋습니다! 감사 ! 그룹에 clip-path을 적용하는 것을 잊지 마세요 http://jsfiddle.net/PyvZ7/7/

:

답변

11

나는에서 바이올린을 업데이트했습니다. 코드에서 selectAll 대신 select을 사용했습니다. 따라서 변환은 그룹 내의 모든 서클에 적용되지 않습니다. 또한 selectAll은 css3 선택 도구입니다. 후자가 태그를 의미하고, 전자는 클래스가 dot 인 요소를 의미하므로 selectAll('dot') 대신 selectAll('.dot')을 수행해야합니다.

var margin = {top: 10, right: 10, bottom: 100, left: 40}, 
    margin2 = {top: 430, right: 10, bottom: 20, left: 40}, 
    width = 960 - margin.left - margin.right, 
    height = 500 - margin.top - margin.bottom, 
    height2 = 500 - margin2.top - margin2.bottom; 

var data = [{ 
    'Wed Jan 23 00:00:00 IST 2013': 3383387 
}, { 
    'Thu Jan 24 00:00:00 IST 2013': 3883387 
}, { 
    'Fri Jan 25 00:00:00 IST 2013': 4383387 
}, { 
    'Sat Jan 26 00:00:00 IST 2013': 2383387 
}, { 
    'Sun Jan 27 00:00:00 IST 2013': 5383387 
}, { 
    'Mon Jan 28 00:00:00 IST 2013': 2283387 
}]; 

var format = d3.time.format("%a %b %d %H:%M:%S IST %Y"); 

var parseDate = d3.time.format("%b %Y").parse; 

var x = d3.time.scale().range([0, width]), 
    x2 = d3.time.scale().range([0, width]), 
    y = d3.scale.linear().range([height, 0]), 
    y2 = d3.scale.linear().range([height2, 0]); 

var xAxis = d3.svg.axis().scale(x).orient("bottom"), 
    xAxis2 = d3.svg.axis().scale(x2).orient("bottom"), 
    yAxis = d3.svg.axis().scale(y).orient("left"); 

var brush = d3.svg.brush() 
    .x(x2) 
    .on("brush", brush); 

var area = d3.svg.area() 
    .interpolate("monotone") 
    .x(function(d) { return x(format.parse(d3.keys(d)[0])); }) 
    .y0(height) 
    .y1(function(d) { return y(d3.values(d)[0]); }); 

var area2 = d3.svg.area() 
    .interpolate("monotone") 
    .x(function(d) { return x2(format.parse(d3.keys(d)[0])); }) 
    .y0(height2) 
    .y1(function(d) { return y2(d3.values(d)[0]); }); 

var svg = d3.select("body").append("svg") 
    .attr("width", width + margin.left + margin.right) 
    .attr("height", height + margin.top + margin.bottom); 

svg.append("defs").append("clipPath") 
    .attr("id", "clip") 
    .append("rect") 
    .attr("width", width) 
    .attr("height", height); 

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

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

    x.domain(d3.extent(data.map(function(d) { return format.parse(d3.keys(d)[0]); }))); 
    y.domain([0, d3.max(data.map(function(d) { return d3.values(d)[0]; }))]); 
    x2.domain(x.domain()); 
    y2.domain(y.domain()); 

    focus.append("path") 
     .datum(data) 
     .attr("clip-path", "url(#clip)") 
     .attr("d", area); 

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

    focus.append("g") 
     .attr("class", "y axis") 
     .call(yAxis); 

    context.append("path") 
     .datum(data) 
     .attr("d", area2); 

    context.append("g") 
     .attr("class", "x axis") 
     .attr("transform", "translate(0," + height2 + ")") 
     .call(xAxis2); 

    context.append("g") 
     .attr("class", "x brush") 
     .call(brush) 
    .selectAll("rect") 
     .attr("y", -6) 
     .attr("height", height2 + 7); 

    var circlegroup = focus.append("g"); 
    circlegroup.attr("clip-path", "url(#clip)"); 
    circlegroup.selectAll('.dot') 
    .data(data) 
    .enter().append("circle") 
    .attr('class', 'dot') 
    .attr("cx",function(d){ return x(format.parse(d3.keys(d)[0]));}) 
    .attr("cy", function(d){ return y(d3.values(d)[0]);}) 
    .attr("r", function(d){ return 4;}) 
    .on('mouseover', function(d){ d3.select(this).attr('r', 8)}) 
    .on('mouseout', function(d){ d3.select(this).attr('r', 4)});  

function brush() { 
    x.domain(brush.empty() ? x2.domain() : brush.extent()); 
    focus.select("path").attr("d", area); 
    focus.select(".x.axis").call(xAxis); 
    circlegroup.selectAll(".dot").attr("cx",function(d){ return x(format.parse(d3.keys(d)[0]));}).attr("cy", function(d){ return y(d3.values(d)[0]);}); 
} 
+1

고마워요! :

다음은 수정 된 코드입니다 –

+0

환영합니다 :) –

관련 문제