2013-09-12 2 views
2

Я загружаю данные из электронной таблицы google, которая содержит ВВП отдельных стран с 1955 по 2012 год. Из этого я хочу нарисовать treemap. Все идет нормально.переход treemap диаграмма в d3.js

Я загрузил данные через внутреннюю ссылку и отформатирован в объект, который может обрабатывать d3, затем получил макет, чтобы рисовать на экране - все хорошо и хорошо. Я основывал его на учебнике Майка Бостока по адресу http://bl.ocks.org/mbostock/4063582.

Проблема возникает, когда я пытаюсь перейти от набора данных с 1955 по 2010 год. Я уверен, что функция, которую я использую для создания шаблона treemap, работает, потому что исходный дисплей правильный. Я передаю ему дату и создает структуру treemap.

Однако, когда я вызываю изменение, происходит переход, и отдельные квадраты меняют размер. Но когда я их изучаю, я понимаю, что они все ошибаются и что, похоже, я сопоставлял новый набор ценностей с неправильными странами.

Новая структура выглядит визуально правильно, но все имена ошибочны. Таким образом, я получаю такие вещи, как кипр, имеющий самый большой ВВП в 2012 году. Как будто у меня есть список в алфавитном порядке, у которого есть другой набор значений по порядку величины, применимый к скорее, чем новое значение, например, для США, старое значение.

В кругах здесь крутится, так как я все еще не готов к работе d3, поэтому все они с благодарностью получили.

код выглядит следующим образом:

/*global app:true JST:true d3:true*/ 

(function (window, $) { 

'use strict'; 

var menuItems = []; 
var menuType='measure'; 
var checboxItems= ['advanced','emerging']; 
var ddID = '0'; 
var model=[]; 
var yearValue="2012" 
var group="gdp"; 
var treeStruc={ 
name:[], 
children:[] 
} 

var margin = {top: 25, right: 5, bottom: 5, left: 5}, 
width = 965 - margin.left - margin.right, 
height = 650 - margin.top - margin.bottom; 

var color = d3.scale.category10(); 



app.spreadsheet.get(function (data) { 
// TODO: process the data 
menuItems = data.measures 
//console.log(data); 
//console.log('menuItems', menuItems); 
//crete dropdown and use toggle to swich display on and off 
$('#dropDown').click(function() { 
    $('ul.ddMenuList').toggle(); 
}); 
//populate the dropdown menu 
for (var k = 0; k <menuItems.length; k++) { 
    $('#ddList').append('<li id="dd_' + k + '"><a href="#">'+menuItems[k].menulist  +'</li>'); 
}; 
//add functionality to dropDown menu 
$('#ddList li').bind('click', function() { 
    ddID = this.id.split('_')[1]; 
     var text = $(this).text(); 
    //console.log ("ID=",ddID); 
    //console.log (text, "Measure=",menuItems[ddID].type); 
    $('#ddTitle').empty(); 
    $('#ddTitle').append(text); 
    createCheckboxes() 
}); 

function createCheckboxes() { 
//decide which check boxes to populate 
if (menuItems[ddID].type==="measure") { 
    group=menuItems[ddID].type 
    checboxItems=[]; 
    $.each(menuItems, function (i) { 
    if (menuItems[i].type==="group"){ 
     checboxItems.push (menuItems[i].checkbox); 
    } 
    //console.log (checboxItems); 
    }); 
} 
    else { 
    group=menuItems[ddID].type 
    checboxItems=[]; 
    $.each(menuItems, function (i) { 
    if (menuItems[i].type==="measure"){ 
     checboxItems.push (menuItems[i].checkbox); 
    } 
    //console.log (checboxItems); 
    }); 
} 
//Populate the check boxes 
console.log ("Populating check boxes"); 
$('#cbHolder').empty(); 
$('#cbHolder').append('<form>'); 
    $.each(checboxItems, function (i) { 
    $('#cbHolder').append('<input type="checkbox" id="cb_'+i+'">'+checboxItems[i]); 
    $('#cbHolder').append('</form>'); 
    //console.log ("checkboxItems",checboxItems[i]); 
}); 
changed3() 

} 

//creates an object containing just the advanced countries 
treeStruc={name:[],children:[]}; 
console.log ("group=",group); 
$.each(checboxItems, function (k) { 
    console.log("Parent",checboxItems[k]) 
    model=jQuery.grep(data.stats,function(e,i){return e[checboxItems[k]];}); 
    console.log('model', model); 
    treeStruc.children.push({"name":checboxItems[k],"children":[]}); 
    //Construct the children of 1 big group to be completed to be updated for each sheet 
    $.each(model, function (i) { 
    treeStruc.children[k].children.push({'name':model[i].countryname,'size':model[i] [group]}); 
    }); 
}); 



console.log('treeStruc', treeStruc) 
Handlebars.createOptionsHelper(data.options); 
drawd3(); 
}); 


function generateTreemapLayout(filter){ 
    return d3.layout.treemap() 
    .size([width, height]) 
    .sticky(true) 
    .value(function(d) { 
     if(d.size[filter] < 0){ 
     return 0; 
     } 
    return d.size[filter]; 
    }); 
    } 

function drawd3() { 
    console.log ("function drawd3"); 
    var treemap = generateTreemapLayout('y'+yearValue) 



    var div = d3.select("#d3Object").append("div") 
    .style("position", "relative") 
    .style("width", (width + margin.left + margin.right) + "px") 
    .style("height", (height + margin.top + margin.bottom) + "px") 
    .style("left", margin.left + "px") 
    .style("top", margin.top + "px"); 

    var node = div.datum(treeStruc).selectAll(".node") 
     .data(treemap.nodes) 
    .enter().append("div") 
     .attr("class", "node") 
     .call(position) 
     .attr("id",function(d){ 
     return d.name; 
     }) 
     .style("background", function(d) { return d.children ? color(d.name) : null; }) 
     .text(function(d) { return d.children ? null : d.name; }); 

    }; 
    function position() { 
     this.style("left", function(d) { return d.x + "px"; }) 
      .style("top", function(d) { return d.y + "px"; }) 
      .style("width", function(d) { return Math.max(0, d.dx - 1) + "px"; }) 
      .style("height", function(d) { return Math.max(0, d.dy - 1) + "px"; }); 
} 


function changed3() { 
    console.log ("function changed3"); 
    //make a new treemap layout 
    var treemap = generateTreemapLayout('y'+1955); 
    console.log('treeStruc',treeStruc); 
    //redraw the treemap using transition instead of enter 


    var node = d3.select("#d3Object") 
    .datum(treeStruc).selectAll(".node") 
    .data(treemap.nodes) 
    .transition() 
    .duration(1500) 
    .call(position) 

    } 

}(this, jQuery)); 
+0

Ничего не пришло мне в голову, читая код. Не могли бы вы поставить полную версию где-нибудь, как jsfiddle, пожалуйста? –

ответ

2

Большое спасибо Том Пирсон мой коллега по работе для этого. Проблема заключается в том, где данные привязаны к элементу на странице. Когда вы приходите, чтобы повторно нарисовать treemap, потому что данные не привязаны к div с помощью идентификатора nique, такого как имя объекта, он переводит данные в первый элемент o списка как он где. Это означает, что что-то вроде Китая получает информацию Бельгии. Простое решение заключается в следующем Вместо

.data(treemap.nodes) 

использования

.data(treemap.nodes,function(d){ 
    return d.name; 
}) 

Существуют два экземпляра этого в оригинале drawd3 функционировать их в функции changed3. Надеюсь, что кто-то застрял с чем-то похожим.

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