想利用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)')
}
這是最后實(shí)現(xiàn)的魚骨圖效果
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。