Д3.преобразование ключа и значений nest() в name и children
Я работаю над созданием Treemap из csv-файла. Данные в csv-файле иерархичны, в результате я использовал d3.гнездиться.)( Однако результирующий JSON имеет вид {key: "United States", values: [...]} Масштабируемая карта деревьев e.g (http://mbostock.github.io/d3/talk/20111018/treemap.html) требуется иерархия как {name: "United States", children:[...]}. Я попытался заменить имя и детей на ключ и значения в Примере, но это не работает. Если кто-то уже рассмотрено использование ключа и значений на масштабируемой карте дерева, пожалуйста, помогите. Я новичок в D3, и я не знаю, d.children означает структуру или значение из данных.
это код для преобразования мировых континентов, регионов и стран из CSV в иерархию с помощью d3.
$ d3.csv("../Data/WorldPopulation.csv", function (pop) {
var treeData= { "key": "World", "values": d3.nest()
.key(function (d) { return d.Major_Region; })
.key(function (d) { return d.Region; })
.key(function (d) { return d.Country; })
.entries(pop)
};
первые несколько строк результата:
`[{"key":"AFRICA","values":[{"key":"Eastern Africa","values"
[{"key":"Burundi","values":[.........`
Я не могу использовать масштабируемую карту дерева, потому что она требует имен и дочерних меток в json, а не ключа и ценности.
3 ответов
лучший способ преобразовать гнездо в treemap-указать функцию доступа к детям с помощью Treemap.дети ().
в Примере масштабируемой карты дерева требуется не только "дети", но и "имя"и " размер". Вы можете сделать либо:
1) измените функции доступа этих свойств, чтобы продолжать использовать "ключ"и " значение".
давайте сменим исходный код.
1.1)строка 79 & 86:
.style("fill", function(d) { return color(d.parent.name); });
.text(function(d) { return d.name; })
заменить ".имя "с".YOUR_NAME_KEY"(т. е. ".ключ")
.style("fill", function(d) { return color(d.parent.YOUR_NAME_KEY); });
.text(function(d) { return d.YOUR_NAME_KEY; })
1.2) строка 47:
var treemap = d3.layout.treemap()
.round(false)
.size([w, h])
.sticky(true)
.value(function(d) { return d.size; });
добавьте строку, чтобы указать функцию доступа детей.(Я. e ".значения")
var treemap = d3.layout.treemap()
.round(false)
.size([w, h])
.sticky(true)
.value(function(d) { return d.YOUR_SIZE_KEY; })
.children(function(d){return d.YOUR_CHILDREN_KEY});
1.3) строка 97 & 51:
function size(d) {
return d.size;
}
заменить ".размер" с ".YOUR_SIZE_KEY " (вы не упомянули в своем результирующем JSON)
function size(d) {
return d.YOUR_SIZE_KEY;
}
P. S. Может что-то пропущено, вы должны проверить это самостоятельно.
2) конвертировать ваш JSON структура, соответствующая примеру с массив.map ().
я полностью согласен с @Anderson, что самый простой подход к этой проблеме-использовать treemap children(function)
и .value(function)
методы для указания имен свойств во вложенном наборе данных.
однако, a дубликат вопрос недавно был опубликован в котором спрашивающий специально просит о помощи с помощью Array.map
подход. Вот оно:
на массив map(function)
метод создает новый массив, в котором каждый элемент массива является результатом выполнения указанной функции на каждом элементе исходного массива. В частности, функция выполняется с тремя аргументами: элементом из исходного массива, индексом этого элемента и исходным массивом в целом. Для манипулирования именами свойств нам нужен только первый аргумент.
вложенные данные в исходном сообщении имеют три уровня, эквивалентные трем ключевым функциям. Поэтому нам понадобится трехуровневый функция отображения:
var treeData= { "key": "World", "values":
d3.nest()
.key(function (d) { return d.Major_Region; })
.key(function (d) { return d.Region; })
.key(function (d) { return d.Country; })
.entries(pop)
};
var treeData2 = { "name": "World", "children":
treeData.values.map( function(major){
return { "name": major.key, "children":
major.values.map( function(region){
return { "name": region.key, "children":
region.values.map(function(country){
return { "name": country.key, "children": country.values };
}) //end of map(function(country){
};
}) //end of map(function(region){
};
}) //end of map(function(major){
}; //end of var declaration
вы также можете реализовать это с рекурсивной функцией, что было бы особенно полезно, если бы у вас было намного больше уровней вложенности.
Эй, ребята, я думаю, я нашел довольно простое решение. Я выполнил очень хорошую вложенность большого набора данных (400 000 строк) для иерархической гистограммы очень упорядоченным способом. Он использует библиотеку подчеркивания и дополнительную функцию _.гнездо. Просто скачайте и включите две библиотеки, необходимые
"подчеркивают минут.Яш" "подчеркивать.гнездо.js"
затем использовать _.функция nest для создания структуры. Вот моя реплика:
var newdata = _.nest(data, ["Material", "StudyName"]);
"материальный" и "StudyName" - это столбцы, в которые я хочу сгруппировать свою структуру.
есть другие варианты использования этой функции, если вам нужно выполнить больше вещей, но я оставлю это так