在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ 如何利用d3.js繪制一條有多個(gè)節(jié)點(diǎn)的線段?

如何利用d3.js繪制一條有多個(gè)節(jié)點(diǎn)的線段?

clipboard.png
想利用D3.JS實(shí)現(xiàn)上圖的效果,對(duì)應(yīng)選擇時(shí)間段展示其他數(shù)據(jù)。
但是因?yàn)榈谝淮斡肈3,不太清楚該選擇什么樣的布局。
看了相關(guān)的文檔,首先想到的是只有一條分枝的樹布局,
但是因?yàn)榻o出的時(shí)間段并不是固定的,樹節(jié)點(diǎn)的children要根據(jù)后臺(tái)傳值動(dòng)態(tài)生成,很不方便。
有沒有什么布局比較適合這種需求呢?

回答
編輯回答
陌離殤

花了兩天啃了一點(diǎn)D3.JS的書,
基本實(shí)現(xiàn)過(guò)程就是繪制畫布,在畫布中確定各個(gè)點(diǎn)的位置,然后利用線段生成器連線,在各個(gè)點(diǎn)上添加p和text標(biāo)簽,繪制原點(diǎn),加入日期和xxxx內(nèi)容。

// dataset格式
var dataset = [{
    {
        count: 0,
        data: [
            {
                fieldValue: ''
            },
            {
                fieldValue: ''
            },
            {
                fieldValue" ''
            },
            ...
        ],
        time: ''
    }]


// 繪制畫布
var svg = d3.select("#relevanceRuleConfig").append("svg")
        .attr('id','PathId')  
        .attr("width", function(){
            if(dataset.length > 6 ){
                return (80 + dataset.length * 150);        // 元素過(guò)多超出畫布時(shí)修改畫布長(zhǎng)度
            }else{
                return 960;                                // 畫布默認(rèn)寬度
            }
        })
        .attr("height", height-80)  
        .append("g")

// 線段點(diǎn)的數(shù)據(jù)
var lines = [];
var x = 60;
var y = 180;
for(var index in dataset){
    lines.push([x,y]);
    x += 150;        // 點(diǎn)與點(diǎn)之間間隔150px
}

// 創(chuàng)建線段生成器
var linePath = d3.svg.line();

// 添加路徑
svg.append('path')
        .attr('d', linePath(lines))        // 使用了線段生成器
        .attr('stroke', '#666')
        .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 +')'
    })

    // 添加節(jié)點(diǎn)圖標(biāo)  
    node.append("circle")
        .attr("r", 5)
        .attr('fill','#f4952d');

    // 添加日期文本
    node.append("text")
        .attr("dx", -30)        //定義文本顯示x軸偏移量  
        .attr("dy", function(d){ return i%2?-42:50})        //定義文本顯示y軸偏移量  
        .attr('fill','#f4952d')
        .style("text-anchor", 'start')//文字對(duì)齊顯示
        .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", '#f4952d')

    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')        //文字對(duì)齊顯示  
            .text(function(d) { return d.name[j]; })
            //這兩個(gè)交互事件是用于將同一天的所有網(wǎng)站統(tǒng)一樣式的,如果之后需要每個(gè)網(wǎng)站單獨(dú)添加點(diǎn)擊事件可以直接刪除
            .on('mouseover',function(){
                var className = $(this).attr("value");
                $('.' + className).css({'font-size':'16px','fill':'#f4952d','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':'#333','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('暫無(wú)數(shù)據(jù)')
            .style('fill','#999')
            .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')//文字對(duì)齊顯示  
            .text('...')
            .on('click',getData);
                            
        // 顯示媒體參與數(shù)量
        node.append("text")
            .attr("dx", -30)
            .attr("dy", function(d){
                if(!(i%2)){
                    return -15;
                }else{
                    return 170;
                }
            })
            .attr('fill','#666')
            .attr('class','mediaJoin')
            .attr('value',function(d){ return d.date})
            .style("text-anchor", 'start')//文字對(duì)齊顯示  
            .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)')
}

clipboard.png

這是最后實(shí)現(xiàn)的魚骨圖效果

2018年8月15日 19:50