творю интерактивную версию this infographicСоздание многомасштабных, вложенные, порядковые гистограмм с D3
Это оказывается трудным в D3. Там будет несколько порядковых шкал:
- Один Y шкала для каждой страны
- Одна шкала Y для каждого периода в каждой стране
- One X шкала
Для каждого периода, будет два значения (визуализируются как две разные цветные полосы). Главная проблема заключается в том, что не во всех странах будет три периода; данные не имеют абсолютно ровной формы. Это означает, что некоторые сегменты первой шкалы Y будут иметь разную высоту. Я не уверен, как позаботиться об этом.
Предположим, у меня есть эти данные:
CountryName Period ValueA ValueB
Argentina 2004-2008 12 5
Argentina 2004-2013 10 5
Argentina 2008-2013 8 4
Bolivia 2002-2008 4 2
Bolivia 2002-2013 6 18
Brazil 2003-2008 9 2
Brazil 2003-2013 2 19
Brazil 2008-2013 1 3
И я использую функцию d3.nest():
d3.nest()
.key(function(d) { return d.CountryName; })
.key(function(d) { return d.Period; })
.map(data);
Теперь я буду иметь данные в форме, что я хочу его, но обратите внимание, что есть некоторые недостающие данные. В этом случае в Боливии имеется только два периода данных. Я создал для этого JSFiddle, но, как вы можете видеть, у него есть некоторые проблемы. Высота баров должна быть одинаковой, всегда. Я хочу использовать yScale.rangeBand(), но проблема в том, что некоторые страны будут иметь три периода, в которых у некоторых будет только два. Мне также нужно найти способ отображения названий стран и периодов слева от баров.
Если у кого-то есть лучшее средство для решения этой проблемы, пожалуйста, дайте мне знать. Я боролся за это пару дней. Как видно из JSFiddle, у меня есть только один yScale, но я уверен, что предпочтительнее использовать две приведенные мной ситуации - я не знаю, как это реализовать.
Любые и вся помощь очень ценится
Спасибо за это! Это определенно помогает. У меня были некоторые вопросы, хотя я заметил, что на диаграмме не отображаются правильные значения на данные. Например, Аргентина, 2004-2008, должна иметь 12 и 5, но она отображает ваш фрагмент как 17 и 10. Похоже, что ширина отключена на 5 единиц? Кроме того, я не понимаю эту анонимную функцию: '.style ("дисплей", функция (s) { если ((yScale (s.label) - yScale.rangeBand()) <0) { возвращение «нет»; // не показывать сетки, когда у приходит отрицательный } ' Почему она называется с функцией (ы) вместо функции (г) Можете ли вы пожалуйста, смотрите? –
Я установил 5-секундную смену, из-за которой база данных @ 17 приходит 12. Вы можете написать это: 'style (" display ", function (s) {}' или 'style (" display ", function (d) {} 'его просто имя параметра, которое изменяется вместо' d' я делаю его '..simple .. :) Цель функции' style ("display", function (s) { if ((yScale (s.label) - yScale.rangeBand()) <0) {return "none"; // не показывать сетки, когда y приходит отрицательный} '- это скрыть горизонтальную сетку для argentina coz, она наступает отрицательная. line и увидеть его для себя, что происходит и что делает эта строка. Я обновил свою скрипку abov. – Cyril
Это не работает, когда есть несколько ярлыков, которые являются одинаковыми. Когда я использую данные, которые имеют две разные страны но с тем же периодом, он ставит два стержня в одном Y position ... –