2015-09-05 4 views
0

Я рисую простую гистограмму с d3, и у меня есть установка оси x и настройка кисти, чтобы я мог «выбрать» группу баров. Я хотел бы затем развернуться и масштабировать диаграмму, чтобы содержать только эти столбцы. Следующий код работает, а цвета баров внутри и коснулись кисти, поворачивая правильный цвет, но я не могу сделать объект масштабированием.Как увеличить с помощью d3

Я посмотрел на это: http://bl.ocks.org/mbostock/1667367 и кучу других вещей и просто не могу понять это.

Here is a fiddle, can someone show me how to simply zoom the darn thing?

var brush; 

function go3() 
{ 
    var dataset = []; 
    var m = 40; 
    var count = 500; 
    dataset.push(m); 
    for (var i = 0; i < 150; i++) {   //Loop 25 times 
     var newNumber = Math.random() * m; //New random number (0-30) 
     dataset.push(newNumber);    //Add new number to array 
    } 

    margin = {top: 10, right: 10, bottom: 30, left: 10}, 
    width = 960 - margin.left - margin.right, 
    height = 500 - margin.top - margin.bottom 


    w = width; 
    h = height; 

    yScale = d3.scale.linear().domain([0, d3.max(dataset)]).range([0, h * .95]); 
    xScale = d3.scale.linear() 
     .range([0, w]) 
     .domain([0, w]); 
    var xAxis = d3.svg.axis().scale(xScale).orient("bottom"); 

    console.log("Max: " + d3.max(dataset)); 

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

    svg.append("rect") 
     .attr("stroke", "grey") 
     .attr("stroke-width", 1) 
     .attr("width", w + margin.left + margin.right) 
     .attr("height", h + margin.top + margin.bottom) 
     .attr("fill", "#FFFFFF") 
     .classed("main-container", true); 

    svg.append("rect") 
     .attr("width", w) 
     .attr("height", h) 
     .attr("stroke", "grey") 
     .attr("stroke-width", 0) 
     .attr("fill", "#EEFFEE") 
     .attr("x", margin.left) 
     .attr("y", margin.top) 
     .classed("brushable-container", true) 
    ; 

    xAxisGroup = svg.append("g") 
     .attr("transform", "translate(" + margin.left + "," + (h + margin.top) + ")") 
     .call(xAxis) 

    padding=2; 

    rects = svg.append("g").selectAll(".brushable") 
     .data(dataset) 
     .enter() 
     .append("rect") 
     .classed("brushable", true); 


    brush = d3.svg.brush() 
     .x(xScale) 
     .on("brush", brushmove) 
     .on("brushend", brushend); 

    context = svg.append("g") 
     .attr("class", "context") 
     .attr("transform", "translate(" + margin.left + "," + margin.top + ")") 
     .attr("class", "brush") 
     .call(brush) 
     .selectAll('rect') 
     .attr('height', h); 

    barWidth = w/dataset.length; 
    console.log("Width: " + barWidth); 
    rects 
     .attr("width", 4) 
     .attr("height", function(d, i){ return yScale(d)}) 
     .attr("stroke", "yellow") 
     .attr("stroke-width", .3) 
     .attr("x", function(d, i){ return (i * barWidth + margin.left) }) 
     .attr("y", function(d, i){ return h - yScale(d) + margin.top}) 
    ; 
} 

function brushend(){ 
    var extent = brush.extent(); 
    var min = extent[0] >= extent[1] ? extent[1] : extent[0]; 
    var max = extent[0] >= extent[1] ? extent[0] : extent[1]; 

    var lolobb = d3.selectAll("rect.brushable"); 
    var lob = lolobb[0]; 
    console.log(min + " - " + max); 
    var i = 0; 
    while(i < lob.length){ 
     var bbb = lob[i]; 
     try { 
      var p = parseFloat(bbb.attributes.x.value); 
      if(min <= p && max >= p) { 
       d3.select(bbb).attr("fill", "#00FF00"); 
      } else { 
       d3.select(bbb).attr("fill", "#000000"); 
      } 
      i++; 
     } catch(r) { 
      console.log("BBB"); 
      console.log(bbb); 
      console.log("Error with " + i); 
      console.log(typeof(bbb)); 
      console.log(r); 
     } 
    } 
    console.log(min + " - " + max); 
    console.log(lolobb); 
} 

function brushmove() { 
    var extent = brush.extent(); 
} 
+0

Ваш пример скрипки, похоже, не работает для меня (может быть, мой конец, хотя). В любом случае вы взглянули на [github doc on Zooming] (https://github.com/mbostock/d3/wiki/Zoom-Behavior)? Я смог получить масштабирование, чтобы работать над моим приложением d3 таким образом. У них есть [пример базового масштабирования] (http://bl.ocks.org/mbostock/3680999). –

+0

Ничего, я смог заставить его работать с помощью [отдельной скрипки с тем же кодом] (http://jsfiddle.net/a3ubzjgL/). –

ответ

0

Вы можете сделать это, добавив вызов zoom функцию на "body", вы можете сделать это, выполнив:

svg = d3.select("body") 
    .append("svg") 
    .attr("width", w + margin.left + margin.right) 
    .attr("height", h + margin.top + margin.bottom) 
    .append("g") 
    .call(d3.behavior.zoom().scaleExtent([1, 8]).on("zoom", zoom)) 
; 

зумирования часть:

.append("g") 
    .call(d3.behavior.zoom().scaleExtent([1, 8]).on("zoom", zoom)) 

Затем добавьте функцию zoom():

function zoom() { 
    svg.attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")"); 
} 

Here is a Fiddle Example. Используйте колесо прокрутки для увеличения.

+0

Я вижу, что я действительно хочу, чтобы увеличить, когда кто-то заканчивает чистку. Когда вы проверяете скрипку, вы можете видеть, что «выбранные» прямоугольники меняют цвет (с помощью изменения стиля). Я хочу, чтобы он тоже увеличивался. Не с колесиком прокрутки – mikeb

+0

@mikeb Колесо прокрутки по умолчанию при масштабировании, есть причина, по которой вы не хотите его использовать? Будет ли базовое масштабирование по центру графика работать? Или вы хотите масштабировать на основе выбранной области? –

+0

Да, причина в том, что у меня есть настройка, чтобы вы могли выбрать раздел гистограммы, и я хочу увеличить масштаб до этого раздела. Это может быть 10% от диаграммы в самом низу, или это может быть верхние 80%, или это могут быть средние 2%. У меня есть настройка «кисти», чтобы «выбрать» раздел для увеличения, и я хочу увеличить его. – mikeb

Смежные вопросы