This commit is contained in:
Mike Bostock 2011-08-14 12:57:09 -07:00
Родитель 0cd0ede546
Коммит 03253fcff6
4 изменённых файлов: 236 добавлений и 376 удалений

Просмотреть файл

@ -1,122 +0,0 @@
[
{"yield":27.00000,"variety":"Manchuria","year":1931,"site":"University Farm"},
{"yield":48.86667,"variety":"Manchuria","year":1931,"site":"Waseca"},
{"yield":27.43334,"variety":"Manchuria","year":1931,"site":"Morris"},
{"yield":39.93333,"variety":"Manchuria","year":1931,"site":"Crookston"},
{"yield":32.96667,"variety":"Manchuria","year":1931,"site":"Grand Rapids"},
{"yield":28.96667,"variety":"Manchuria","year":1931,"site":"Duluth"},
{"yield":43.06666,"variety":"Glabron","year":1931,"site":"University Farm"},
{"yield":55.20000,"variety":"Glabron","year":1931,"site":"Waseca"},
{"yield":28.76667,"variety":"Glabron","year":1931,"site":"Morris"},
{"yield":38.13333,"variety":"Glabron","year":1931,"site":"Crookston"},
{"yield":29.13333,"variety":"Glabron","year":1931,"site":"Grand Rapids"},
{"yield":29.66667,"variety":"Glabron","year":1931,"site":"Duluth"},
{"yield":35.13333,"variety":"Svansota","year":1931,"site":"University Farm"},
{"yield":47.33333,"variety":"Svansota","year":1931,"site":"Waseca"},
{"yield":25.76667,"variety":"Svansota","year":1931,"site":"Morris"},
{"yield":40.46667,"variety":"Svansota","year":1931,"site":"Crookston"},
{"yield":29.66667,"variety":"Svansota","year":1931,"site":"Grand Rapids"},
{"yield":25.70000,"variety":"Svansota","year":1931,"site":"Duluth"},
{"yield":39.90000,"variety":"Velvet","year":1931,"site":"University Farm"},
{"yield":50.23333,"variety":"Velvet","year":1931,"site":"Waseca"},
{"yield":26.13333,"variety":"Velvet","year":1931,"site":"Morris"},
{"yield":41.33333,"variety":"Velvet","year":1931,"site":"Crookston"},
{"yield":23.03333,"variety":"Velvet","year":1931,"site":"Grand Rapids"},
{"yield":26.30000,"variety":"Velvet","year":1931,"site":"Duluth"},
{"yield":36.56666,"variety":"Trebi","year":1931,"site":"University Farm"},
{"yield":63.83330,"variety":"Trebi","year":1931,"site":"Waseca"},
{"yield":43.76667,"variety":"Trebi","year":1931,"site":"Morris"},
{"yield":46.93333,"variety":"Trebi","year":1931,"site":"Crookston"},
{"yield":29.76667,"variety":"Trebi","year":1931,"site":"Grand Rapids"},
{"yield":33.93333,"variety":"Trebi","year":1931,"site":"Duluth"},
{"yield":43.26667,"variety":"No. 457","year":1931,"site":"University Farm"},
{"yield":58.10000,"variety":"No. 457","year":1931,"site":"Waseca"},
{"yield":28.70000,"variety":"No. 457","year":1931,"site":"Morris"},
{"yield":45.66667,"variety":"No. 457","year":1931,"site":"Crookston"},
{"yield":32.16667,"variety":"No. 457","year":1931,"site":"Grand Rapids"},
{"yield":33.60000,"variety":"No. 457","year":1931,"site":"Duluth"},
{"yield":36.60000,"variety":"No. 462","year":1931,"site":"University Farm"},
{"yield":65.76670,"variety":"No. 462","year":1931,"site":"Waseca"},
{"yield":30.36667,"variety":"No. 462","year":1931,"site":"Morris"},
{"yield":48.56666,"variety":"No. 462","year":1931,"site":"Crookston"},
{"yield":24.93334,"variety":"No. 462","year":1931,"site":"Grand Rapids"},
{"yield":28.10000,"variety":"No. 462","year":1931,"site":"Duluth"},
{"yield":32.76667,"variety":"Peatland","year":1931,"site":"University Farm"},
{"yield":48.56666,"variety":"Peatland","year":1931,"site":"Waseca"},
{"yield":29.86667,"variety":"Peatland","year":1931,"site":"Morris"},
{"yield":41.60000,"variety":"Peatland","year":1931,"site":"Crookston"},
{"yield":34.70000,"variety":"Peatland","year":1931,"site":"Grand Rapids"},
{"yield":32.00000,"variety":"Peatland","year":1931,"site":"Duluth"},
{"yield":24.66667,"variety":"No. 475","year":1931,"site":"University Farm"},
{"yield":46.76667,"variety":"No. 475","year":1931,"site":"Waseca"},
{"yield":22.60000,"variety":"No. 475","year":1931,"site":"Morris"},
{"yield":44.10000,"variety":"No. 475","year":1931,"site":"Crookston"},
{"yield":19.70000,"variety":"No. 475","year":1931,"site":"Grand Rapids"},
{"yield":33.06666,"variety":"No. 475","year":1931,"site":"Duluth"},
{"yield":39.30000,"variety":"Wisconsin No. 38","year":1931,"site":"University Farm"},
{"yield":58.80000,"variety":"Wisconsin No. 38","year":1931,"site":"Waseca"},
{"yield":29.46667,"variety":"Wisconsin No. 38","year":1931,"site":"Morris"},
{"yield":49.86667,"variety":"Wisconsin No. 38","year":1931,"site":"Crookston"},
{"yield":34.46667,"variety":"Wisconsin No. 38","year":1931,"site":"Grand Rapids"},
{"yield":31.60000,"variety":"Wisconsin No. 38","year":1931,"site":"Duluth"},
{"yield":26.90000,"variety":"Manchuria","year":1932,"site":"University Farm"},
{"yield":33.46667,"variety":"Manchuria","year":1932,"site":"Waseca"},
{"yield":34.36666,"variety":"Manchuria","year":1932,"site":"Morris"},
{"yield":32.96667,"variety":"Manchuria","year":1932,"site":"Crookston"},
{"yield":22.13333,"variety":"Manchuria","year":1932,"site":"Grand Rapids"},
{"yield":22.56667,"variety":"Manchuria","year":1932,"site":"Duluth"},
{"yield":36.80000,"variety":"Glabron","year":1932,"site":"University Farm"},
{"yield":37.73333,"variety":"Glabron","year":1932,"site":"Waseca"},
{"yield":35.13333,"variety":"Glabron","year":1932,"site":"Morris"},
{"yield":26.16667,"variety":"Glabron","year":1932,"site":"Crookston"},
{"yield":14.43333,"variety":"Glabron","year":1932,"site":"Grand Rapids"},
{"yield":25.86667,"variety":"Glabron","year":1932,"site":"Duluth"},
{"yield":27.43334,"variety":"Svansota","year":1932,"site":"University Farm"},
{"yield":38.50000,"variety":"Svansota","year":1932,"site":"Waseca"},
{"yield":35.03333,"variety":"Svansota","year":1932,"site":"Morris"},
{"yield":20.63333,"variety":"Svansota","year":1932,"site":"Crookston"},
{"yield":16.63333,"variety":"Svansota","year":1932,"site":"Grand Rapids"},
{"yield":22.23333,"variety":"Svansota","year":1932,"site":"Duluth"},
{"yield":26.80000,"variety":"Velvet","year":1932,"site":"University Farm"},
{"yield":37.40000,"variety":"Velvet","year":1932,"site":"Waseca"},
{"yield":38.83333,"variety":"Velvet","year":1932,"site":"Morris"},
{"yield":32.06666,"variety":"Velvet","year":1932,"site":"Crookston"},
{"yield":32.23333,"variety":"Velvet","year":1932,"site":"Grand Rapids"},
{"yield":22.46667,"variety":"Velvet","year":1932,"site":"Duluth"},
{"yield":29.06667,"variety":"Trebi","year":1932,"site":"University Farm"},
{"yield":49.23330,"variety":"Trebi","year":1932,"site":"Waseca"},
{"yield":46.63333,"variety":"Trebi","year":1932,"site":"Morris"},
{"yield":41.83333,"variety":"Trebi","year":1932,"site":"Crookston"},
{"yield":20.63333,"variety":"Trebi","year":1932,"site":"Grand Rapids"},
{"yield":30.60000,"variety":"Trebi","year":1932,"site":"Duluth"},
{"yield":26.43334,"variety":"No. 457","year":1932,"site":"University Farm"},
{"yield":42.20000,"variety":"No. 457","year":1932,"site":"Waseca"},
{"yield":43.53334,"variety":"No. 457","year":1932,"site":"Morris"},
{"yield":34.33333,"variety":"No. 457","year":1932,"site":"Crookston"},
{"yield":19.46667,"variety":"No. 457","year":1932,"site":"Grand Rapids"},
{"yield":22.70000,"variety":"No. 457","year":1932,"site":"Duluth"},
{"yield":25.56667,"variety":"No. 462","year":1932,"site":"University Farm"},
{"yield":44.70000,"variety":"No. 462","year":1932,"site":"Waseca"},
{"yield":47.00000,"variety":"No. 462","year":1932,"site":"Morris"},
{"yield":30.53333,"variety":"No. 462","year":1932,"site":"Crookston"},
{"yield":19.90000,"variety":"No. 462","year":1932,"site":"Grand Rapids"},
{"yield":22.50000,"variety":"No. 462","year":1932,"site":"Duluth"},
{"yield":28.06667,"variety":"Peatland","year":1932,"site":"University Farm"},
{"yield":36.03333,"variety":"Peatland","year":1932,"site":"Waseca"},
{"yield":43.20000,"variety":"Peatland","year":1932,"site":"Morris"},
{"yield":25.23333,"variety":"Peatland","year":1932,"site":"Crookston"},
{"yield":26.76667,"variety":"Peatland","year":1932,"site":"Grand Rapids"},
{"yield":31.36667,"variety":"Peatland","year":1932,"site":"Duluth"},
{"yield":30.00000,"variety":"No. 475","year":1932,"site":"University Farm"},
{"yield":41.26667,"variety":"No. 475","year":1932,"site":"Waseca"},
{"yield":44.23333,"variety":"No. 475","year":1932,"site":"Morris"},
{"yield":32.13333,"variety":"No. 475","year":1932,"site":"Crookston"},
{"yield":15.23333,"variety":"No. 475","year":1932,"site":"Grand Rapids"},
{"yield":27.36667,"variety":"No. 475","year":1932,"site":"Duluth"},
{"yield":38.00000,"variety":"Wisconsin No. 38","year":1932,"site":"University Farm"},
{"yield":58.16667,"variety":"Wisconsin No. 38","year":1932,"site":"Waseca"},
{"yield":47.16667,"variety":"Wisconsin No. 38","year":1932,"site":"Morris"},
{"yield":35.90000,"variety":"Wisconsin No. 38","year":1932,"site":"Crookston"},
{"yield":20.66667,"variety":"Wisconsin No. 38","year":1932,"site":"Grand Rapids"},
{"yield":29.33333,"variety":"Wisconsin No. 38","year":1932,"site":"Duluth"}
]

236
test/core/nest-test.js Normal file
Просмотреть файл

@ -0,0 +1,236 @@
require("../env");
require("../../d3");
var vows = require("vows"),
assert = require("assert");
var suite = vows.describe("d3.nest");
suite.addBatch({
"entries": {
topic: function() {
return d3.nest;
},
"returns an array of each distinct key in arbitrary order": function(nest) {
var keys = nest()
.key(function(d) { return d.foo; })
.entries([{foo: 1}, {foo: 1}, {foo: 2}])
.map(function(d) { return d.key; })
.sort(d3.ascending);
assert.deepEqual(keys, ["1", "2"]);
},
"each entry is a key-values object, with values in input order": function(nest) {
var entries = nest()
.key(function(d) { return d.foo; })
.entries([{foo: 1, bar: 0}, {foo: 2}, {foo: 1, bar: 1}]);
assert.deepEqual(entries, [
{key: "1", values: [{foo: 1, bar: 0}, {foo: 1, bar: 1}]},
{key: "2", values: [{foo: 2}]}
]);
},
"keys can be sorted using an optional comparator": function(nest) {
var keys = nest()
.key(function(d) { return d.foo; }).sortKeys(d3.descending)
.entries([{foo: 1}, {foo: 1}, {foo: 2}])
.map(function(d) { return d.key; });
assert.deepEqual(keys, ["2", "1"]);
},
"values can be sorted using an optional comparator": function(nest) {
var entries = nest()
.key(function(d) { return d.foo; })
.sortValues(function(a, b) { return a.bar - b.bar; })
.entries([{foo: 1, bar: 2}, {foo: 1, bar: 0}, {foo: 1, bar: 1}, {foo: 2}]);
assert.deepEqual(entries, [
{key: "1", values: [{foo: 1, bar: 0}, {foo: 1, bar: 1}, {foo: 1, bar: 2}]},
{key: "2", values: [{foo: 2}]}
]);
},
"values can be aggregated using an optional rollup": function(nest) {
var entries = nest()
.key(function(d) { return d.foo; })
.rollup(function(values) { return d3.sum(values, function(d) { return d.bar; }); })
.entries([{foo: 1, bar: 2}, {foo: 1, bar: 0}, {foo: 1, bar: 1}, {foo: 2}]);
assert.deepEqual(entries, [
{key: "1", values: 3},
{key: "2", values: 0}
]);
},
"multiple key functions can be specified": function(nest) {
var entries = nest()
.key(function(d) { return d[0]; }).sortKeys(d3.ascending)
.key(function(d) { return d[1]; }).sortKeys(d3.ascending)
.entries([[0, 1], [0, 2], [1, 1], [1, 2], [0, 2]]);
assert.deepEqual(entries, [
{key: "0", values: [
{key: "1", values: [[0, 1]]},
{key: "2", values: [[0, 2], [0, 2]]}
]},
{key: "1", values: [
{key: "1", values: [[1, 1]]},
{key: "2", values: [[1, 2]]}
]}
]);
},
"the rollup function only applies to leaf values": function(nest) {
var entries = nest()
.key(function(d) { return d[0]; }).sortKeys(d3.ascending)
.key(function(d) { return d[1]; }).sortKeys(d3.ascending)
.rollup(function(values) { return values.length; })
.entries([[0, 1], [0, 2], [1, 1], [1, 2], [0, 2]]);
assert.deepEqual(entries, [
{key: "0", values: [
{key: "1", values: 1},
{key: "2", values: 2}
]},
{key: "1", values: [
{key: "1", values: 1},
{key: "2", values: 1}
]}
]);
},
"the value comparator only applies to leaf values": function(nest) {
var entries = nest()
.key(function(d) { return d[0]; }).sortKeys(d3.ascending)
.key(function(d) { return d[1]; }).sortKeys(d3.ascending)
.sortValues(function(a, b) { return a[2] - b[2]; })
.entries([[0, 1], [0, 2, 1], [1, 1], [1, 2], [0, 2, 0]]);
assert.deepEqual(entries, [
{key: "0", values: [
{key: "1", values: [[0, 1]]},
{key: "2", values: [[0, 2, 0], [0, 2, 1]]}
]},
{key: "1", values: [
{key: "1", values: [[1, 1]]},
{key: "2", values: [[1, 2]]}
]}
]);
},
"the key comparator only applies to the last-specified key": function(nest) {
var entries = nest()
.key(function(d) { return d[0]; }).sortKeys(d3.ascending)
.key(function(d) { return d[1]; }).sortKeys(d3.descending)
.entries([[0, 1], [0, 2], [1, 1], [1, 2], [0, 2]]);
assert.deepEqual(entries, [
{key: "0", values: [
{key: "2", values: [[0, 2], [0, 2]]},
{key: "1", values: [[0, 1]]}
]},
{key: "1", values: [
{key: "2", values: [[1, 2]]},
{key: "1", values: [[1, 1]]}
]}
]);
var entries = nest()
.key(function(d) { return d[0]; }).sortKeys(d3.descending)
.key(function(d) { return d[1]; }).sortKeys(d3.ascending)
.entries([[0, 1], [0, 2], [1, 1], [1, 2], [0, 2]]);
assert.deepEqual(entries, [
{key: "1", values: [
{key: "1", values: [[1, 1]]},
{key: "2", values: [[1, 2]]}
]},
{key: "0", values: [
{key: "1", values: [[0, 1]]},
{key: "2", values: [[0, 2], [0, 2]]}
]}
]);
},
"if no keys are specified, the input array is returned": function(nest) {
var array = [new Object()];
assert.strictEqual(nest().entries(array), array);
}
}
});
suite.addBatch({
"map": {
topic: function() {
return d3.nest;
},
"returns a map of each distinct key": function(nest) {
var map = nest()
.key(function(d) { return d.foo; })
.map([{foo: 1, bar: 0}, {foo: 2}, {foo: 1, bar: 1}]);
assert.deepEqual(map, {
"1": [{foo: 1, bar: 0}, {foo: 1, bar: 1}],
"2": [{foo: 2}]
});
},
"values can be sorted using an optional comparator": function(nest) {
var map = nest()
.key(function(d) { return d.foo; })
.sortValues(function(a, b) { return a.bar - b.bar; })
.map([{foo: 1, bar: 2}, {foo: 1, bar: 0}, {foo: 1, bar: 1}, {foo: 2}]);
assert.deepEqual(map, {
"1": [{foo: 1, bar: 0}, {foo: 1, bar: 1}, {foo: 1, bar: 2}],
"2": [{foo: 2}]
});
},
"values can be aggregated using an optional rollup": function(nest) {
var map = nest()
.key(function(d) { return d.foo; })
.rollup(function(values) { return d3.sum(values, function(d) { return d.bar; }); })
.map([{foo: 1, bar: 2}, {foo: 1, bar: 0}, {foo: 1, bar: 1}, {foo: 2}]);
assert.deepEqual(map, {
"1": 3,
"2": 0
});
},
"multiple key functions can be specified": function(nest) {
var map = nest()
.key(function(d) { return d[0]; }).sortKeys(d3.ascending)
.key(function(d) { return d[1]; }).sortKeys(d3.ascending)
.map([[0, 1], [0, 2], [1, 1], [1, 2], [0, 2]]);
assert.deepEqual(map, {
"0": {
"1": [[0, 1]],
"2": [[0, 2], [0, 2]]
},
"1": {
"1": [[1, 1]],
"2": [[1, 2]]
}
});
},
"the rollup function only applies to leaf values": function(nest) {
var map = nest()
.key(function(d) { return d[0]; }).sortKeys(d3.ascending)
.key(function(d) { return d[1]; }).sortKeys(d3.ascending)
.rollup(function(values) { return values.length; })
.map([[0, 1], [0, 2], [1, 1], [1, 2], [0, 2]]);
assert.deepEqual(map, {
"0": {
"1": 1,
"2": 2
},
"1": {
"1": 1,
"2": 1
}
});
},
"the value comparator only applies to leaf values": function(nest) {
var map = nest()
.key(function(d) { return d[0]; }).sortKeys(d3.ascending)
.key(function(d) { return d[1]; }).sortKeys(d3.ascending)
.sortValues(function(a, b) { return a[2] - b[2]; })
.map([[0, 1], [0, 2, 1], [1, 1], [1, 2], [0, 2, 0]]);
assert.deepEqual(map, {
"0": {
"1": [[0, 1]],
"2": [[0, 2, 0], [0, 2, 1]]
},
"1": {
"1": [[1, 1]],
"2": [[1, 2]]
}
});
},
"if no keys are specified, the input array is returned": function(nest) {
var array = [new Object()];
assert.strictEqual(nest().map(array), array);
}
}
});
suite.export(module);

Просмотреть файл

@ -1,60 +0,0 @@
require("./../../lib/env-js/envjs/node");
require("./../../d3");
d3.json("test/barley.json", function(barley) {
var nest = d3.nest()
.key(function(d) { return d.year; })
.key(function(d) { return d.variety; })
.key(function(d) { return d.site; });
console.log("entries(year/variety/site):");
console.log(stringify(nest.entries(barley.slice(5, 8))));
console.log("");
console.log("map(year/variety/site):");
console.log(stringify(nest.map(barley.slice(5, 8))));
console.log("");
var nest = d3.nest()
.key(function(d) { return d.year; })
.rollup(sum);
console.log("rollup(year):");
console.log(stringify(nest.map(barley)));
console.log("");
var nest = d3.nest()
.key(function(d) { return d.year; })
.key(function(d) { return d.variety; })
.rollup(sum);
console.log("rollup(year/variety):");
console.log(stringify(nest.map(barley)));
console.log("");
var nest = d3.nest()
.key(function(d) { return d.variety; })
.sortKeys(d3.ascending);
console.log("sortKeys(variety):");
console.log(stringify(nest.entries(barley.slice(5, 8))));
console.log("");
var nest = d3.nest()
.key(function(d) { return d.year; })
.sortValues(function(b, a) { return a.yield - b.yield; });
console.log("sortValues(year):");
console.log(stringify(nest.map(barley.slice(6, 12))));
console.log("");
});
function sum(v) {
return v.reduce(function(p, v) { return p + v.yield; }, 0);
}
function stringify(json) {
return JSON.stringify(json, null, " ");
}

Просмотреть файл

@ -1,194 +0,0 @@
entries(year/variety/site):
[
{
"key": "1931",
"values": [
{
"key": "Manchuria",
"values": [
{
"key": "Duluth",
"values": [
{
"yield": 28.96667,
"variety": "Manchuria",
"year": 1931,
"site": "Duluth"
}
]
}
]
},
{
"key": "Glabron",
"values": [
{
"key": "University Farm",
"values": [
{
"yield": 43.06666,
"variety": "Glabron",
"year": 1931,
"site": "University Farm"
}
]
},
{
"key": "Waseca",
"values": [
{
"yield": 55.2,
"variety": "Glabron",
"year": 1931,
"site": "Waseca"
}
]
}
]
}
]
}
]
map(year/variety/site):
{
"1931": {
"Manchuria": {
"Duluth": [
{
"yield": 28.96667,
"variety": "Manchuria",
"year": 1931,
"site": "Duluth"
}
]
},
"Glabron": {
"University Farm": [
{
"yield": 43.06666,
"variety": "Glabron",
"year": 1931,
"site": "University Farm"
}
],
"Waseca": [
{
"yield": 55.2,
"variety": "Glabron",
"year": 1931,
"site": "Waseca"
}
]
}
}
}
rollup(year):
{
"1931": 2224.6666799999985,
"1932": 1905.7999600000003
}
rollup(year/variety):
{
"1931": {
"Manchuria": 205.16667999999999,
"Glabron": 223.96666000000002,
"Svansota": 204.06667,
"Velvet": 206.93332,
"Trebi": 254.79996,
"No. 457": 241.50001,
"No. 462": 234.33336999999997,
"Peatland": 219.5,
"No. 475": 190.89999999999998,
"Wisconsin No. 38": 243.50000999999997
},
"1932": {
"Manchuria": 172.39999999999998,
"Glabron": 176.13333000000003,
"Svansota": 160.46666,
"Velvet": 189.79998999999998,
"Trebi": 217.99996,
"No. 457": 188.66667999999999,
"No. 462": 190.20000000000002,
"Peatland": 190.66667,
"No. 475": 190.23333,
"Wisconsin No. 38": 229.23334000000003
}
}
sortKeys(variety):
[
{
"key": "Glabron",
"values": [
{
"yield": 43.06666,
"variety": "Glabron",
"year": 1931,
"site": "University Farm"
},
{
"yield": 55.2,
"variety": "Glabron",
"year": 1931,
"site": "Waseca"
}
]
},
{
"key": "Manchuria",
"values": [
{
"yield": 28.96667,
"variety": "Manchuria",
"year": 1931,
"site": "Duluth"
}
]
}
]
sortValues(year):
{
"1931": [
{
"yield": 55.2,
"variety": "Glabron",
"year": 1931,
"site": "Waseca"
},
{
"yield": 43.06666,
"variety": "Glabron",
"year": 1931,
"site": "University Farm"
},
{
"yield": 38.13333,
"variety": "Glabron",
"year": 1931,
"site": "Crookston"
},
{
"yield": 29.66667,
"variety": "Glabron",
"year": 1931,
"site": "Duluth"
},
{
"yield": 29.13333,
"variety": "Glabron",
"year": 1931,
"site": "Grand Rapids"
},
{
"yield": 28.76667,
"variety": "Glabron",
"year": 1931,
"site": "Morris"
}
]
}