得到它的工作,并增加了一些花俏。 (提示工具提示的鼠标悬停点,图例中鼠标悬停的颜色块淡出其他系列,点击网址点。)
转换中要注意的关键事项:数据集只是一个对象数组,它被重构nest()变成友好的形式。这稍后强制重写数据访问调用。
function convertToSlug(Text)
{
return Text
.toLowerCase()
.replace(/ /g,'-')
.replace(/[^\w-]+/g,'')
;
}
var getVals = function(obj){
var vals = [];
for(var key in obj){
vals.push(obj[key]);
}
return vals;
}
var data_structure = {"data": [{"y_var": 1, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 1", "group_var": "Group 1", "x_var": 12}, {"y_var": 2, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 1", "group_var": "Group 1", "x_var": 13}, {"y_var": 3, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 1", "group_var": "Group 1", "x_var": 14}, {"y_var": 4, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 1", "group_var": "Group 1", "x_var": 16}, {"y_var": 5, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 1", "group_var": "Group 1", "x_var": 17}, {"y_var": 6, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 1", "group_var": "Group 1", "x_var": 18}, {"y_var": 7, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 1", "group_var": "Group 1", "x_var": 20}, {"y_var": 8, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 1", "group_var": "Group 1", "x_var": 21}, {"y_var": 9, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 1", "group_var": "Group 1", "x_var": 23}, {"y_var": 10, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 1", "group_var": "Group 1", "x_var": 25}, {"y_var": 11, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 1", "group_var": "Group 1", "x_var": 26}, {"y_var": 1, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 2", "group_var": "Group 2", "x_var": 12}, {"y_var": 2, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 2", "group_var": "Group 2", "x_var": 14}, {"y_var": 3, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 2", "group_var": "Group 2", "x_var": 16}, {"y_var": 4, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 2", "group_var": "Group 2", "x_var": 19}, {"y_var": 5, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 2", "group_var": "Group 2", "x_var": 24}, {"y_var": 6, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 2", "group_var": "Group 2", "x_var": 25}, {"y_var": 7, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 2", "group_var": "Group 2", "x_var": 25}, {"y_var": 8, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 2", "group_var": "Group 2", "x_var": 27}, {"y_var": 1, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 3", "group_var": "Group 3", "x_var": 12}, {"y_var": 2, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 3", "group_var": "Group 3", "x_var": 14}, {"y_var": 3, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 3", "group_var": "Group 3", "x_var": 15}, {"y_var": 4, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 3", "group_var": "Group 3", "x_var": 17}, {"y_var": 5, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 3", "group_var": "Group 3", "x_var": 17}, {"y_var": 6, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 3", "group_var": "Group 3", "x_var": 19}, {"y_var": 7, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 3", "group_var": "Group 3", "x_var": 20}, {"y_var": 8, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 3", "group_var": "Group 3", "x_var": 21}, {"y_var": 9, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 3", "group_var": "Group 3", "x_var": 24}, {"y_var": 10, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 3", "group_var": "Group 3", "x_var": 25}, {"y_var": 11, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 3", "group_var": "Group 3", "x_var": 27}, {"y_var": 1, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 4", "group_var": "Group 4", "x_var": 11}, {"y_var": 2, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 4", "group_var": "Group 4", "x_var": 14}, {"y_var": 3, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 4", "group_var": "Group 4", "x_var": 16}, {"y_var": 4, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 4", "group_var": "Group 4", "x_var": 20}, {"y_var": 5, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 4", "group_var": "Group 4", "x_var": 24}, {"y_var": 6, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 4", "group_var": "Group 4", "x_var": 25}, {"y_var": 7, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 4", "group_var": "Group 4", "x_var": 27}, {"y_var": 8, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 4", "group_var": "Group 4", "x_var": 27}, {"y_var": 1, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 5", "group_var": "Group 5", "x_var": 11}, {"y_var": 2, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 5", "group_var": "Group 5", "x_var": 15}, {"y_var": 3, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 5", "group_var": "Group 5", "x_var": 15}, {"y_var": 4, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 5", "group_var": "Group 5", "x_var": 16}, {"y_var": 5, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 5", "group_var": "Group 5", "x_var": 17}, {"y_var": 6, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 5", "group_var": "Group 5", "x_var": 19}, {"y_var": 7, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 5", "group_var": "Group 5", "x_var": 21}, {"y_var": 8, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 5", "group_var": "Group 5", "x_var": 23}, {"y_var": 9, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 5", "group_var": "Group 5", "x_var": 25}, {"y_var": 10, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 5", "group_var": "Group 5", "x_var": 27}, {"y_var": 11, "split_var": "Split 1", "tooltip": "Point Tooltip", "label": "Group 5", "group_var": "Group 5", "x_var": 27}, {"y_var": 1, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 6", "group_var": "Group 6", "x_var": 12}, {"y_var": 2, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 6", "group_var": "Group 6", "x_var": 14}, {"y_var": 3, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 6", "group_var": "Group 6", "x_var": 15}, {"y_var": 4, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 6", "group_var": "Group 6", "x_var": 16}, {"y_var": 5, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 6", "group_var": "Group 6", "x_var": 17}, {"y_var": 6, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 6", "group_var": "Group 6", "x_var": 18}, {"y_var": 7, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 6", "group_var": "Group 6", "x_var": 20}, {"y_var": 8, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 6", "group_var": "Group 6", "x_var": 21}, {"y_var": 9, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 6", "group_var": "Group 6", "x_var": 25}, {"y_var": 10, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 6", "group_var": "Group 6", "x_var": 28}, {"y_var": 1, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 7", "group_var": "Group 7", "x_var": 11}, {"y_var": 2, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 7", "group_var": "Group 7", "x_var": 15}, {"y_var": 3, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 7", "group_var": "Group 7", "x_var": 19}, {"y_var": 4, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 7", "group_var": "Group 7", "x_var": 22}, {"y_var": 5, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 7", "group_var": "Group 7", "x_var": 26}, {"y_var": 6, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 7", "group_var": "Group 7", "x_var": 29}, {"y_var": 7, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 7", "group_var": "Group 7", "x_var": 29}, {"y_var": 1, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 8", "group_var": "Group 8", "x_var": 11}, {"y_var": 2, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 8", "group_var": "Group 8", "x_var": 14}, {"y_var": 3, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 8", "group_var": "Group 8", "x_var": 15}, {"y_var": 4, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 8", "group_var": "Group 8", "x_var": 16}, {"y_var": 5, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 8", "group_var": "Group 8", "x_var": 17}, {"y_var": 6, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 8", "group_var": "Group 8", "x_var": 20}, {"y_var": 7, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 8", "group_var": "Group 8", "x_var": 24}, {"y_var": 8, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 8", "group_var": "Group 8", "x_var": 29}, {"y_var": 1, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 9", "group_var": "Group 9", "x_var": 13}, {"y_var": 2, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 9", "group_var": "Group 9", "x_var": 19}, {"y_var": 3, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 9", "group_var": "Group 9", "x_var": 21}, {"y_var": 4, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 9", "group_var": "Group 9", "x_var": 25}, {"y_var": 5, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 9", "group_var": "Group 9", "x_var": 27}, {"y_var": 6, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 9", "group_var": "Group 9", "x_var": 29}, {"y_var": 7, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 9", "group_var": "Group 9", "x_var": 29}, {"y_var": 1, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 10", "group_var": "Group 10", "x_var": 12}, {"y_var": 2, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 10", "group_var": "Group 10", "x_var": 14}, {"y_var": 3, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 10", "group_var": "Group 10", "x_var": 15}, {"y_var": 4, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 10", "group_var": "Group 10", "x_var": 16}, {"y_var": 5, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 10", "group_var": "Group 10", "x_var": 18}, {"y_var": 6, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 10", "group_var": "Group 10", "x_var": 19}, {"y_var": 7, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 10", "group_var": "Group 10", "x_var": 21}, {"y_var": 8, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 10", "group_var": "Group 10", "x_var": 24}, {"y_var": 9, "split_var": "Split 2", "tooltip": "Point Tooltip", "label": "Group 10", "group_var": "Group 10", "x_var": 27}], "parameters": {"y_min": 1, "x_label": "Time (m)", "y_label": "Level", "y_max": 11, "x_max": 29, "draw_path": true, "x_min": 11}}
raw_data = data_structure['data']
params = data_structure['parameters']
var margin = {top: 20, right: 20, bottom: 20, left: 20},
padding = {top: 0, right: 0, bottom: 0, left: 0},
outerWidth = 400,
outerHeight = 400,
innerWidth = outerWidth - margin.left - margin.right,
innerHeight = outerHeight - margin.top - margin.bottom,
width = innerWidth - padding.left - padding.right,
height = innerHeight - padding.top - padding.bottom;
data = d3.nest().key(function(d){return d.split_var;}).key(function(d){return d.group_var;}).entries(raw_data);
var div = d3.select("body").append("div")
.attr("class", "tooltip")
.style("opacity", 0);
var svg = d3.select("#chart").selectAll("svg")
.data(data)
.enter().append("svg:svg")
.attr("width", outerWidth)
.attr("height", outerHeight);
var line = d3.svg.line()
.interpolate("linear")
.x(function(d) { return x(d.x_var); })
.y(function(d) { return y(d.y_var); });
var x = d3.scale.linear().domain([params['x_min'],params['x_max']]).range([0, width]);
var y = d3.scale.linear().domain([params['y_min'], params['y_max']]).range([height,0]);
var xAxis = d3.svg.axis().scale(x).orient("bottom"),
yAxis = d3.svg.axis().scale(y).orient("left");
var color = d3.scale.category10();
var g = svg.append("g")
.attr("width", width)
.attr("height", height)
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
g.append("g")
.attr("class", "x axis")
.attr("transform", "translate(0," + height + ")")
.call(xAxis)
.append("text")
.attr("y", -16)
.attr("x", width)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text(params['x_label']);
g.append("g")
.attr("class", "y axis")
.attr("transform", "translate(0,0)")
.call(yAxis)
.append("text")
.attr("transform", "rotate(-90)")
.attr("y", 6)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text(params['y_label']);
g.append("g")
.attr('class','title')
.attr("transform", "translate(0,0)")
.append("text")
.attr("x", width/2*1.2)
.attr("dy", ".71em")
.style("text-anchor", "end")
.text(function(d){return d.key;});
var series = g.selectAll('.series').data(function(d){
return(d.values);
}).enter().append('g')
.attr("class", 'dataset')
.attr("id", function(d){return convertToSlug(d.key);});
series.selectAll('.points').data(function(d){return d.values;}).enter()
.append("a").attr("xlink:href", function(d) {if(d.url){return d.url;} else {return '';}})
.append('circle')
.attr('cx',function(d){return(x(d.x_var)); })
.attr('cy',function(d){return(y(d.y_var)); })
.attr('r', 5)
.style("fill", function(d) { return color(String(d.label));})
.on("mouseover", function(d) {
div.transition()
.duration(200)
.style("opacity", 0.9);
div .html(d.tooltip)
.style("left", (d3.event.pageX) + "px")
.style("top", (d3.event.pageY - 28) + "px");
})
.on("mouseout", function(d) {
div.transition()
.duration(500)
.style("opacity", 0);
});
if(params['draw_path']){
series.append("svg:path").attr("d", function(d){return(line(d.values));})
.style("stroke", function(d) { return color(d.values[0].label);})
.style("stroke-width", 3)
.style("fill", 'none');
}
var legend = svg.append("g")
.attr("class", "legend")
.attr("height", 100)
.attr("width", 100)
.attr("transform", "translate(10,20)");
var rows = legend.selectAll('rect')
.data(function(d){return d.values;})
.enter();
rows.append("rect")
.attr("x", 50)
.attr("y", function(d, i){ return i * 20;})
.attr("width", 10)
.attr("height", 10)
.style("fill", function(d) {
var return_color = color(d.values[0].label);
return return_color;
})
.on("mouseover",
function (d, i) {
d3.selectAll('.dataset').filter(function(p){return convertToSlug(p.key)!=convertToSlug(d.key);})
.transition().duration(1000).style('opacity',0.2);
})
.on("mouseout", function(d) {
d3.selectAll('.dataset').filter(function(p){return convertToSlug(p.key)!=convertToSlug(d.key);})
.transition().duration(1000).style('opacity',1);
});
rows.append('text')
.attr("x", 62)
.attr("y", function(d, i){ return 11+(i * 20);})
.text(function(d){return d.key;});
您需要一个[嵌套选择](http://bost.ocks.org/mike/nest/)。从外观上看,三层嵌套 - 顶层人物,第二层人物组和第二层人物线。 –
子选择,使用nest()进行良好的数据结构化,并最终围绕反向数据绑定进行工作。 – bwarren2
太棒了,你会介意发布你做为参考答案吗? –