Столбчатая диаграмма D3JS на временной шкале

1

Мой JSON выглядит так (с некоторыми дополнительными записями, которые я не включаю для краткости)

[{"name":"Jim","category":"TechSupport","month":"8",year:"2012","Date":"2012-08-01T04:00:00.000Z", "TechSupport":2,"Management":0,"Sales":0},
{"name":"Jim","category":"Management","month":"8",year:"2012","Date":"2012-08-01T04:00:00.000Z", "TechSupport":0,"Management":3,"Sales":0}]

Мой стек выглядит так

var stack = d3.stack().keys(["TechSupport", "Management", "Sales"])
var series = stack(data)

Результаты моего стека выглядят как [[0,2],[0,0]],[[2,2],[3,3]],[[1,1],[3,3]]

Мой код для отображения барчата по шкале времени выглядит так:

var groups = mainChart.selectAll("g")
.data(series)
.append("g")

groups.selectAll("rect")
.attr("id","bar")
.attr("fill", function(d){return colors(d.data.category)})
.attr("x", function(d){return xScale(d.data.Date);}}
.attr("y", function(d){return yScale(d[1]);})
.attr("width", 20)
.attr("height" return yScale(d[0]) - yScale(d[1])})

Я могу получить все, чтобы отображать по шкале времени правильно, за исключением случаев, когда у меня есть элементы, имеющие одну и ту же дату, которые не складываются, и я не уверен, почему?

  • 1
    Можете ли вы сделать скрипку и быть более конкретным, что вы пытаетесь достичь? Я думаю, что это поможет мне понять проблему.
  • 0
    Да, вот и вы. Если вы заметили, что это не наложение, оно просто накладывается на ту же дату, где и должно складываться. jsfiddle.net/jamiebrs/pzdbddah
Показать ещё 4 комментария
Теги:
d3.js

1 ответ

1
Лучший ответ

Подготовка набора данных - forEach()

В вашей функции forEach я изменил две небольшие ошибки.

Измененный Tech s upport для Tech S upport, как я упоминал ранее:

else if(d.category == 'Techsupport')

и с помощью cattotal of Management я добавил + к нему:

d.Management = +d.cattotal;

Подготовка набора данных - уменьшение()

У вас есть JSON с несколькими объектами, основанными на исходном наборе данных. Этот набор данных должен быть уменьшен на основе уникальных записей даты. Значения объекта должны быть объединены. Тогда у вас есть хороший JSON для функции стека.

Это может быть достигнуто несколькими способами. Я использую функцию reduce(), как показано ниже:

var dataset = [];
data.reduce(function(res,obj){
   var key = obj.Date;
   if (res[key]){
       res[key].Sales +=obj.Sales;
       res[key].Techsupport +=obj.Techsupport;
       res[key].Management +=obj.Management;
   } else {
       dataset.push(o);
       res[key] = obj;
   }
   return res;
}, {});

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

data = dataset;

Разумеется, вы можете свободно выбирать.

Отзывчивая ось y:

Ось y должна автоматически адаптироваться к штабелированным барам, поэтому я изменил ваш yMax следующим образом:

var yMax = d3.max(series[series.length - 1], function(d) { return d[1]; });

Обновление чертежа штабелированных баров и всплывающих подсказок

Наконец, я обновил ваши штабелированные бары, установив атрибут fill. Я изменил его как для вашей основной, так и для навигационной диаграммы.

.attr("fill", function(d){ return colors(d3.select(this.parentNode).datum().key)})

Для всплывающих подсказок я обновил ключевые и общие значения:

div.html("Date: " +d.data.Date + "<br>" + "Category: " + d3.select(this.parentNode).datum().key + "<br>" + "Total:" + (d[1]-d[0]))

В этой скрипте вы можете найти рабочий пример.

  • 1
    БИНГО!!! Спасибо!!
  • 0
    Добро пожаловать +1
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню