One-to-many highlighting for ordinal "name" axis.
forked from syntagmatic's block: Ordinal Parallel Axis
license: gpl-3.0 |
One-to-many highlighting for ordinal "name" axis.
forked from syntagmatic's block: Ordinal Parallel Axis
name | economy (mpg) | cylinders | displacement (cc) | power (hp) | weight (lb) | 0-60 mph (s) | year | |
---|---|---|---|---|---|---|---|---|
AMC Ambassador Brougham | 13 | 8 | 360 | 175 | 3821 | 11 | 73 | |
AMC Ambassador DPL | 15 | 8 | 390 | 190 | 3850 | 8.5 | 70 | |
AMC Ambassador SST | 17 | 8 | 304 | 150 | 3672 | 11.5 | 72 | |
AMC Concord DL 6 | 20.2 | 6 | 232 | 90 | 3265 | 18.2 | 79 | |
AMC Concord DL | 18.1 | 6 | 258 | 120 | 3410 | 15.1 | 78 | |
AMC Concord DL | 23 | 4 | 151 | 3035 | 20.5 | 82 | ||
AMC Concord | 19.4 | 6 | 232 | 90 | 3210 | 17.2 | 78 | |
AMC Concord | 24.3 | 4 | 151 | 90 | 3003 | 20.1 | 80 | |
AMC Gremlin | 18 | 6 | 232 | 100 | 2789 | 15 | 73 | |
AMC Gremlin | 19 | 6 | 232 | 100 | 2634 | 13 | 71 | |
AMC Gremlin | 20 | 6 | 232 | 100 | 2914 | 16 | 75 | |
AMC Gremlin | 21 | 6 | 199 | 90 | 2648 | 15 | 70 | |
AMC Hornet Sportabout (Wagon) | 18 | 6 | 258 | 110 | 2962 | 13.5 | 71 | |
AMC Hornet | 18 | 6 | 199 | 97 | 2774 | 15.5 | 70 | |
AMC Hornet | 18 | 6 | 232 | 100 | 2945 | 16 | 73 | |
AMC Hornet | 19 | 6 | 232 | 100 | 2901 | 16 | 74 | |
AMC Hornet | 22.5 | 6 | 232 | 90 | 3085 | 17.6 | 76 | |
AMC Matador (Wagon) | 14 | 8 | 304 | 150 | 4257 | 15.5 | 74 | |
AMC Matador (Wagon) | 15 | 8 | 304 | 150 | 3892 | 12.5 | 72 | |
AMC Matador | 14 | 8 | 304 | 150 | 3672 | 11.5 | 73 | |
AMC Matador | 15 | 6 | 258 | 110 | 3730 | 19 | 75 | |
AMC Matador | 15.5 | 8 | 304 | 120 | 3962 | 13.9 | 76 | |
AMC Matador | 16 | 6 | 258 | 110 | 3632 | 18 | 74 | |
AMC Matador | 18 | 6 | 232 | 100 | 3288 | 15.5 | 71 | |
AMC Pacer D/L | 17.5 | 6 | 258 | 95 | 3193 | 17.8 | 76 | |
AMC Pacer | 19 | 6 | 232 | 90 | 3211 | 17 | 75 | |
AMC Rebel SST (Wagon) | 8 | 360 | 175 | 3850 | 11 | 70 | ||
AMC Rebel SST | 16 | 8 | 304 | 150 | 3433 | 12 | 70 | |
AMC Spirit DL | 27.4 | 4 | 121 | 80 | 2670 | 15 | 79 | |
Audi 100 LS | 20 | 4 | 114 | 91 | 2582 | 14 | 73 | |
Audi 100 LS | 23 | 4 | 115 | 95 | 2694 | 15 | 75 | |
Audi 100 LS | 24 | 4 | 107 | 90 | 2430 | 14.5 | 70 | |
Audi 4000 | 34.3 | 4 | 97 | 78 | 2188 | 15.8 | 80 | |
Audi 5000 | 20.3 | 5 | 131 | 103 | 2830 | 15.9 | 78 | |
Audi 5000S (Diesel) | 36.4 | 5 | 121 | 67 | 2950 | 19.9 | 80 | |
Audi Fox | 29 | 4 | 98 | 83 | 2219 | 16.5 | 74 | |
BMW 2002 | 26 | 4 | 121 | 113 | 2234 | 12.5 | 70 | |
BMW 320i | 21.5 | 4 | 121 | 110 | 2600 | 12.8 | 77 | |
Buick Century 350 | 13 | 8 | 350 | 175 | 4100 | 13 | 73 | |
Buick Century Limited | 25 | 6 | 181 | 110 | 2945 | 16.4 | 82 | |
Buick Century Luxus (Wagon) | 13 | 8 | 350 | 150 | 4699 | 14.5 | 74 | |
Buick Century Special | 20.6 | 6 | 231 | 105 | 3380 | 15.8 | 78 | |
Buick Century | 17 | 6 | 231 | 110 | 3907 | 21 | 75 | |
Buick Century | 22.4 | 6 | 231 | 110 | 3415 | 15.8 | 81 | |
Buick Electra 225 Custom | 12 | 8 | 455 | 225 | 4951 | 11 | 73 | |
Buick Estate Wagon (Wagon) | 14 | 8 | 455 | 225 | 3086 | 10 | 70 | |
Buick Estate Wagon (Wagon) | 16.9 | 8 | 350 | 155 | 4360 | 14.9 | 79 |
<!DOCTYPE html> | |
<meta charset="utf-8"> | |
<title>Map Projections</title> | |
<style> | |
svg { | |
font: 12px sans-serif; | |
} | |
.background path { | |
fill: none; | |
stroke: none; | |
stroke-width: 20px; | |
pointer-events: stroke; | |
} | |
.foreground path { | |
fill: none; | |
stroke: steelblue; | |
stroke-width: 1.5px; | |
} | |
.axis .title { | |
font-size: 11px; | |
font-weight: bold; | |
text-transform: uppercase; | |
} | |
.axis line, | |
.axis path { | |
fill: none; | |
stroke: #000; | |
shape-rendering: crispEdges; | |
} | |
.axis.string { | |
font-size: 6px; | |
} | |
.label { | |
-webkit-transition: fill 125ms linear; | |
} | |
.active .label:not(.inactive) { | |
font-weight: bold; | |
font-size: 11px; | |
} | |
.label.inactive { | |
fill: #ccc; | |
} | |
.foreground path.inactive { | |
stroke: #ccc; | |
stroke-opacity: .5; | |
stroke-width: 1px; | |
} | |
</style> | |
<body> | |
<script src="http://d3js.org/d3.v2.min.js"></script> | |
<script> | |
var margin = {top: 30, right: 40, bottom: 20, left: 200}, | |
width = 960 - margin.left - margin.right, | |
height = 500 - margin.top - margin.bottom; | |
var dimensions = [ | |
{ | |
name: "name", | |
scale: d3.scale.ordinal().rangePoints([0, height]), | |
type: "string" | |
}, | |
{ | |
name: "economy (mpg)", | |
scale: d3.scale.linear().range([0, height]), | |
type: "number" | |
}, | |
{ | |
name: "cylinders", | |
scale: d3.scale.linear().range([height, 0]), | |
type: "number" | |
}, | |
{ | |
name: "displacement (cc)", | |
scale: d3.scale.linear().range([height, 0]), | |
type: "number" | |
}, | |
{ | |
name: "power (hp)", | |
scale: d3.scale.linear().range([height, 0]), | |
type: "number" | |
}, | |
{ | |
name: "weight (lb)", | |
scale: d3.scale.linear().range([height, 0]), | |
type: "number" | |
}, | |
{ | |
name: "0-60 mph (s)", | |
scale: d3.scale.linear().range([height, 0]), | |
type: "number" | |
}, | |
{ | |
name: "year", | |
scale: d3.scale.linear().range([height, 0]), | |
type: "number" | |
}, | |
]; | |
var x = d3.scale.ordinal() | |
.domain(dimensions.map(function(d) { return d.name; })) | |
.rangePoints([0, width]); | |
var line = d3.svg.line() | |
.defined(function(d) { return !isNaN(d[1]); }); | |
var yAxis = d3.svg.axis() | |
.orient("left"); | |
var svg = d3.select("body").append("svg") | |
.attr("width", width + margin.left + margin.right) | |
.attr("height", height + margin.top + margin.bottom) | |
.append("g") | |
.attr("transform", "translate(" + margin.left + "," + margin.top + ")"); | |
var dimension = svg.selectAll(".dimension") | |
.data(dimensions) | |
.enter().append("g") | |
.attr("class", "dimension") | |
.attr("transform", function(d) { return "translate(" + x(d.name) + ")"; }); | |
d3.csv("cars.small.csv", function(data) { | |
dimensions.forEach(function(dimension) { | |
dimension.scale.domain(dimension.type === "number" | |
? d3.extent(data, function(d) { return +d[dimension.name]; }) | |
: data.map(function(d) { return d[dimension.name]; }).sort()); | |
}); | |
svg.append("g") | |
.attr("class", "background") | |
.selectAll("path") | |
.data(data) | |
.enter().append("path") | |
.attr("d", draw); | |
svg.append("g") | |
.attr("class", "foreground") | |
.selectAll("path") | |
.data(data) | |
.enter().append("path") | |
.attr("d", draw); | |
dimension.append("g") | |
.attr("class", "axis") | |
.each(function(d) { d3.select(this).call(yAxis.scale(d.scale)); }) | |
.append("text") | |
.attr("class", "title") | |
.attr("text-anchor", "middle") | |
.attr("y", -9) | |
.text(function(d) { return d.name; }); | |
var ordinal_labels = svg.selectAll(".axis text") | |
.on("mouseover", mouseover) | |
.on("mouseout", mouseout); | |
var projection = svg.selectAll(".background path,.foreground path") | |
.on("mouseover", mouseover) | |
.on("mouseout", mouseout); | |
function mouseover(d) { | |
svg.classed("active", true); | |
if (typeof d === "string") { | |
projection.classed("inactive", function(p) { return p.name !== d; }); | |
projection.filter(function(p) { return p.name === d; }).each(moveToFront); | |
ordinal_labels.classed("inactive", function(p) { return p !== d; }); | |
ordinal_labels.filter(function(p) { return p === d; }).each(moveToFront); | |
} else { | |
projection.classed("inactive", function(p) { return p !== d; }); | |
projection.filter(function(p) { return p === d; }).each(moveToFront); | |
ordinal_labels.classed("inactive", function(p) { return p !== d.name; }); | |
ordinal_labels.filter(function(p) { return p === d.name; }).each(moveToFront); | |
} | |
} | |
function mouseout(d) { | |
svg.classed("active", false); | |
projection.classed("inactive", false); | |
ordinal_labels.classed("inactive", false); | |
} | |
function moveToFront() { | |
this.parentNode.appendChild(this); | |
} | |
}); | |
function draw(d) { | |
return line(dimensions.map(function(dimension) { | |
return [x(dimension.name), dimension.scale(d[dimension.name])]; | |
})); | |
} | |
</script> |