2013-05-23 2 views
1

Возможно ли иметь подкатегории на гистограмме в d3? Я не думаю, что это возможно из коробки, но, возможно, у кого-то есть идея, как это сделать. Примером может служить реализация продукции (A, B, C) в месяц:d3 гистограмма с подкатегориями

= = 
    = =  = 
    = = = = = 
    = = = = = = 
+-+-+-+-+-+-+-+-+- ... 
| A B C | A B C | ... 
| Jan | Feb | ... 

Я не знаю, как я бы идти о добавлении другого набора данных в виде гистограммы.

+0

Аналогичный вопрос здесь: http://stackoverflow.com/questions/12180108/d3-create-a-grouped-bar-chart-from-json-objects – shauns

+0

Если бы D3 был коробкой, он появлялся как нож Стенли, толстый картон и металлическая линейка. Само сборка (почти) всегда требуется, но вы получаете именно то, что хотите. –

ответ

1

chart showing d3.js producing a grouped chart

Возьмите каждый набор данных, которые вы имеете, добавил его в список, а затем перенести данные.

var dataA = [1, 2, 3, 4, 5]; 
var dataB = [5, 4, 3, 2, 1]; 
var dataC = [5, 4, 3, 4, 5]; 

var dataAll = [dataA, dataB, dataC]; 
var dataT = d3.transpose(dataAll); 

В D3.js это не так уж сложно и d3.transpose будет транспозиция данных для вас. Самая сложная часть действительно делает так, что ее легко читать/обновлять. Привяжите внешний список к объекту g. Я бы использовал преобразование в этой группе, чтобы сдвинуть его вправо по позиции в списке. Затем, когда вы имеете дело с отдельными rect с, вам не нужно вычислять правильное положение месяца. Это также упростит этикетки и, как всегда, хорошее разделение проблем. Вы можете привязать внутренний список к rect и добавить немного цвета, чтобы отобразить приведенную выше диаграмму.

var chart = d3.selectAll('#chartArea') 
    .append('svg') 

var month = chart.selectAll('g') 
    .data(dataT) 
    .enter() 
     .append('g') 
     .attr('transform', function(d,i){return 'translate(' + x(i) + ', 0)';}); 

month.selectAll('rect') 
    .data(function (d) {return d;}) 
    .enter() 
     .append('rect') 
     .attr('x', function(d, i){return x(i/groups);}) 
     .attr('y', function(d){return h-y(d);}) 
     .attr('width', function(){return x(1/groups);}) 
     .attr('height', function(d){return y(d);}) 
     .attr('fill', function(d, i){return groupColor(i);}) 

рабочий пример на JSFiddle http://jsfiddle.net/hKvwa/

+0

Большое спасибо. Я понятия не имел, что d3 имеет дело с несколькими измерениями. Я играл с вашим jsfiddle, но я не мог понять, как добавить небольшую ось на диаграмму (т. Е. A, B, C в приведенном выше примере за каждый месяц). Есть ли что-нибудь, что d3 может мне помочь или я должен сам это сделать? Вот как я добрался до сих пор: http://jsfiddle.net/Y8yzd/1/ – orange

+0

Я проверил и масштабирование не принимает вложенный домен, который является позором. Вы можете сделать это самостоятельно вместе с каждым вашим баром, однако имейте в виду, что он может рассчитывать на «чарджук», поскольку информация будет повторяться столько раз http://en.wikipedia.org/wiki/Chartjunk. Позиционирование становится затруднительным, так как пространство быстро заканчивается. Ключ может быть более уместным. –

+0

С «ключевой картой» вы подразумеваете легенду диаграммы, я полагаю. Я попробую это вместо ... Спасибо за вашу помощь. – orange

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