2016-01-08 3 views
0

Я застрял в попытке связать двумерные данные в d3. Я хочу отобразить матрицу зеленых квадратов. Я строю такую ​​матрицу:d3: как визуализировать простую двумерную матрицу?

var size = 10; 
dataset = []; 
for(var y = 0; y<size; y++){ 
    var tempData = [size]; 
    for(var x = 0; x<size; x++){ 
     tempData[x] = 5; 
    }; 
    dataset.push(tempData); 
}; 

Я не уверен, как правильно привязывать данные. Я вроде понимаю, что Майк Босток tutorial on nested selections, но он привязывает матрицу фиксированного размера к уже существующим элементам. Как использовать enter() для создания новых прямоугольников? Вот как я попытался применить совет учебника, чтобы сначала связать внешние, а затем внутренние массивы .. не удивил, что он не работает, но я также не знаю, куда идти отсюда.

svg.selectAll("rect") 
    .data(dataset) 
    .selectAll("rect") 
    .data(function (d,i) {return d;}) 
    .enter() 
    .append("rect") 
    .attr("x", function(d,i){ 
      return i*20}) 
    .attr("y", function(d,i){ 
      return i*20;}) 
    .attr("height", 15) 
    .attr("width", 15) 
    .attr("fill", "green"); 
+0

Является ли это принуждением использовать 2-мерный массив ... его можно достичь с помощью одномерного массива тоже http://plnkr.co/edit/FFzGpo2pGTni0wj2Pl4c?p=preview – Cyril

+0

Я не думаю, что это сейчас , спасибо за Ваш ответ! – speedymcs

ответ

4

Есть две проблемы. Сначала у вас есть второй .selectAll() сразу после первого .data(), что означает, что вы будете работать с выбором обновления. Это пусто, так как в DOM нет элементов для начала. Вы должны работать на выбор ввода вместо (и это хорошая практика, чтобы использовать g элементы здесь для первого уровня):

svg.selectAll("rect") 
    .data(dataset) 
    .enter() 
    .append("g") 
    .selectAll("rect") 
    .data(function (d,i) {return d;}) 

Во-вторых, вы кладете прямоугольники по диагонали (то же координаты х и у) , так что даже если имеется правильное количество элементов rect, вы не видите их всех, потому что они перекрываются. Чтобы исправить, вам нужно взять индекс в родительской группе во внимание для одной из координат (с помощью secret third argument):

.append("rect") 
.attr("x", function(d,i){ 
     return i*20; 
}) 
.attr("y", function(d, i, j){ 
     return j*20; 
}) 

Полная демо here.

+0

Ницца! Ты подтолкнул меня на это. Я знал, что вам нужно использовать элементы 'g', но я забыл использовать второй параметр' enter() '. Я становлюсь ржавым с d3 ... –

+0

Хороший улов! Имея дело с D3 в течение некоторого времени, я никогда не сталкивался с * секретным третьим аргументом *. Хотя я могу найти его в исходном коде, я никогда не видел, чтобы это было зарегистрировано где угодно. Знаете ли вы о какой-либо документации по этому параметру или действительно ли это * secret *? – altocumulus

+0

@altocumulus Я не видел документально нигде. –

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