spent two days nibbling at a little D3.JS book,
basic implementation process is to draw the canvas, determine the location of each point in the canvas, and then use the line generator to connect, add p and text tags on each point, draw the origin, add date and xxxx content.
// dataset
var dataset = [{
{
count: 0,
data: [
{
fieldValue: ''
},
{
fieldValue: ''
},
{
fieldValue" ''
},
...
],
time: ''
}]
//
var svg = d3.select("-sharprelevanceRuleConfig").append("svg")
.attr('id','PathId')
.attr("width", function(){
if(dataset.length > 6 ){
return (80 + dataset.length * 150); //
}else{
return 960; //
}
})
.attr("height", height-80)
.append("g")
//
var lines = [];
var x = 60;
var y = 180;
for(var index in dataset){
lines.push([x,y]);
x += 150; // 150px
}
//
var linePath = d3.svg.line();
//
svg.append('path')
.attr('d', linePath(lines)) //
.attr('stroke', '-sharp666')
.attr('stroke-width', '1px')
.attr('fill', 'none');
var addNode = function(i){
var self = this;
var nodeData = [dataset[i]];
var siteSave = [];
var node = svg.selectAll()
.data(nodeData)
.enter()
.append('g')
.attr('transform',function(d){
var x = 60 + 150 * i;
var y = 180;
return 'translate(' + x + ',' + y +')'
})
//
node.append("circle")
.attr("r", 5)
.attr('fill','-sharpf4952d');
//
node.append("text")
.attr("dx", -30) //x
.attr("dy", function(d){ return i%2?-42:50}) //y
.attr('fill','-sharpf4952d')
.style("text-anchor", 'start')//
.style('font-family','Times New Roman')
.text(function(d) { return d.date; });
//
node.append("rect")
.attr('width',85)
.attr('height',25)
.attr("x", -40) //x
.attr("y", function(d){ return i%2?-60:31}) //y
.attr("rx", 5) //
.attr("ry",5) //
.attr('fill','none')
.attr("stroke", '-sharpf4952d')
for(var j in nodeData[0].name){
//
node.append("text")
.attr("dx", -30)
.attr("dy", function(d){
if(!(i%2)){
if(d.count > 5){
return -60 + -25 * j;
}else{
return -15 - 25 * j;
}
}else{
return 25 + 25*j;
}
})
.attr('class','siteName')
.attr('value',function(d){ return d.date})
.attr('class',function(d){ return d.date})
.style("text-anchor", 'start') //
.text(function(d) { return d.name[j]; })
//
.on('mouseover',function(){
var className = $(this).attr("value");
$('.' + className).css({'font-size':'16px','fill':'-sharpf4952d','cursor':'pointer','transition':'all 0.5s ease','-moz-transition': 'all 0.5s ease','-webkit-transition':' all 0.5s ease','-o-transition':'all 0.5s ease'})
})
.on('mouseout',function(){
var className = $(this).attr("value");
$('.' + className).css({'font-size':'14px','fill':'-sharp333','transition':'all 0.2s ease','-moz-transition': 'all 0.2s ease','-webkit-transition':' all 0.2s ease','-o-transition':'all 0.2s ease'})
})
.on('click',getData);
}
if(nodeData[0].count == 0){
node.append("text")
.attr("dx", -25)
.attr("dy",function(){
if(!(i%2)){
return -15;
}else{
return 25;
}
})
.text('')
.style('fill','-sharp999')
.style('font-size','14px')
.style('font-family','Microsoft Yahei')
}
if(nodeData[0].count > 5){
// "..."
node.append("text")
.attr("dx", -30)
.attr("dy", function(d){
if(!(i%2)){
return -40;
}else{
return 145;
}
})
.attr('value',function(d){ return d.date})
.attr('class',function(d){ return d.date})
.style("text-anchor", 'start')//
.text('...')
.on('click',getData);
//
node.append("text")
.attr("dx", -30)
.attr("dy", function(d){
if(!(i%2)){
return -15;
}else{
return 170;
}
})
.attr('fill','-sharp666')
.attr('class','mediaJoin')
.attr('value',function(d){ return d.date})
.style("text-anchor", 'start')//
.text(function(d) { return ('' + d.count + ''); })
.on('click',getData);
}
}
for(var index in dataset){
addNode(index)
}
if (dataset.length == 1){
svg.attr('transform','translate(400,0)')
}else if (dataset.length == 2){
svg.attr('transform','translate(320,0)')
}else if (dataset.length == 3){
svg.attr('transform','translate(240,0)')
}else if (dataset.length == 4){
svg.attr('transform','translate(160,0)')
}else if (dataset.length == 5){
svg.attr('transform','translate(80,0)')
}else{
svg.attr('transform','translate(0,0)')
}
this is the fishbone effect finally realized
@ StupidBear I would like to ask, if some nodes have child nodes and end up drawing like a tree, do you know how to write code? Thank you