龙空技术网

知识点|D3.js 满足你对数据可视化的一切幻想

荼蘼Studio 3915

前言:

此时大家对“css3连线”大体比较注重,看官们都需要分析一些“css3连线”的相关知识。那么小编同时在网摘上汇集了一些关于“css3连线””的相关知识,希望看官们能喜欢,大家快快来学习一下吧!

D3.js

D3的全称是Data-Driven Documents(数据驱动的文档),是一个用来做数据可视化的JavaScript函数库,而JavaScript文件的后缀通常为.js,所以D3被称为D3.js。

对D3来说,柱形图、散点图、折线图、饼图、弦图、力导向图、树状图等等都不在话下。总之,只要你愿意写代码,D3.js可以满足你对数据可视化的一切幻想。

今天我们以弦图为例进行介绍。

弦图

弦图主要用于表示两个节点之间的联系。两点之间的连线表示二者具有联系,线的粗细表示权重。

下面是之前做的一张电影类型相关性的弦图。

弦图

准备工作

D3是在HTML和CSS文件中编写代码,在浏览器中显示结果。

HTML文件用来描述内容,CSS文件用来定义内容的样式。定义样式可以单独写在外部CSS文件中,在HTML中用<link>引用;也可以直接写在HTML文件中,在<style>中定义。

如果你是一个极简主义者(懒癌晚期),可以直接在记事本里写代码,新建一个文本文档,将后缀改为“.html”或“.css”即可。

如果对代码颜值要求比较高,可以安装一个Notepad++,写起来会更加顺手。

现在我们新建一个HTML文件,下面开启敲代码模式,“//”后为注释内容,代码和注释部分全部加粗。

<!DOCTYPE html> //声明(告诉浏览器HTML的版本信息,在第一行书写)

<meta charset="utf-8"> //定义编码格式

<style>

body {

font: 20px sans-serif;

} //定义字号字体

.group-tick line {

stroke:#000000;

} //定义描边

.ribbons {

fill-opacity: 0.67;

} //定义填充不透明度

</style>

<style>代码用来定义样式。

CSS选择器有多种类型。

元素选择器以HTML元素的标签作为名称,如:

body { font: 20px sans-serif;}

则所有主体内容的字号和字体都这样显示。

类选择器是在选择器名称前加一个点(.),如:

.ribbons { fill-opacity: 0.67;}

之后需要应用的话,在元素标签中添加一个class属性即可,后续我们会写到。

另外还有选择器分组、ID选择器、派生选择器,由于这次代码未涉及,暂不赘述。

<svg width="960" height="960"></svg> //定义图形大小

SVG指可缩放矢量图形,绝大部分浏览器都支持,可以利用<svg>标签将形状嵌入HTML中。

<script src=""></script> //网络引用D3函数库

<script> //说明要在HTML中写JavaScript代码了,注意写完要在结尾添加</script>。

var leixing = [ "喜剧" , "剧情" , "动作" , "冒险" , "爱情", "惊悚" , "动画" , "奇幻" , "悬疑" , "科幻"]; //定义类型标签

var matrix = [

[77, 108, 88,110,245,12,110,50,25,17],

[108, 102, 117,37,180,67,13,27,79,20],

[88,117,9,133,54,103,22,59,43,96],

[110, 37, 133,3,21,32,141,98,16,60],

[245, 180, 54,21,59,15,3,33,33,7],

[12, 67, 103,32,15,18,1,13,111,33],

[110, 13, 22,141,3,1,12,60,5,12],

[50, 27, 59,98,33,13,60,0,5,13],

[25, 79, 43,16,33,111,5,5,1,12],

[17, 20, 96,60,7,33,12,13,12,0]

]; //输入类型相关性数据

由于统计的是10种电影类型之间的交叉关系,所以是一个对称矩阵。

所以如果你也想画一个10个元素的弦图,也可以不看下边的内容,直接复制代码,修改这两段数据即可。

var svg = d3.select("svg"),

width = +svg.attr("width"),

height = +svg.attr("height"),

outerRadius = Math.min(width, height) * 0.5 - 40,

innerRadius = outerRadius - 40; //定义外部弦和内部弦的大小

绘制外部弦

var chord = d3.chord()

.padAngle(0.05) //设置外部弦间的角填充,也就是弦之间的间距

.sortSubgroups(d3.descending); //设置用于子分组的比较器

var arc = d3.arc()

.innerRadius(innerRadius)

.outerRadius(outerRadius);

var ribbon = d3.ribbon()

.radius(innerRadius);

var color = d3.scaleOrdinal()

.domain(d3.range(4))

.range(["#8EC21E","#C3D968","#009DE6","#7CCDF3","#E51573","#EC799F","#F39820","#FCD35A","#A0A0A2","#C9C9CA"]); //设置颜色(和元素标签数量相等即可,在本例中为10)

var g = svg.append("g")

.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")")

.datum(chord(matrix));

var group = g.append("g")

.attr("class", "groups")

.selectAll("g")

.data(function(chords) { return chords.groups; })

.enter().append("g");

group.append("path")

.style("fill", function(d) { return color(d.index); })

.attr("d", arc);

写到这里,在代码末尾包含结束符“</script>”的情况下,可以运行出以下结果。

添加标签

group.append("text")

.each(function(d,i) { d.angle = (d.startAngle + d.endAngle) / 2;d.name = leixing[i]; })

.attr("dy", ".35em")

.attr("transform", function(d){

return "rotate(" + ( d.angle * 180 / Math.PI ) + ")" + "translate(0,"+ -1.0*(outerRadius+10) +")" + ( ( d.angle > Math.PI*3/4 && d.angle < Math.PI*5/4 ) ? "rotate(180)" : "");})

.text(function(d) { return d.name; });

var groupTick = group.selectAll(".group-tick")

.data(function(d) { return groupTicks(d, 1e3); })

.enter().append("g")

.attr("class", "group-tick")

.attr("transform", function(d) { return "rotate(" + (d.angle * 180 / Math.PI - 90) + ") translate(" + outerRadius + ",0)"; });

写到这里,在代码末尾包含结束符“</script>”的情况下,可以运行出以下结果。

绘制内部弦

g.append("g")

.attr("class", "ribbons")

.selectAll("path")

.data(function(chords) { return chords; })

.enter().append("path")

.attr("d", ribbon)

.style("fill", function(d) { return color(d.target.index); })

function groupTicks(d, step) {

var k = (d.endAngle - d.startAngle) / d.value;

return d3.range(0, d.value, step).map(function(value) {

return {value: value, angle: value * k + d.startAngle};

});

}

</script> //不要忘记最后的结束标签

中文乱码

如果在HTML文件的运行结果中有中文显示乱码的话,可以用记事本打开文件,“文件-另存为”,文件类型选择“所有”,右下角编码格式选择“UTF-8”。

如果还没解决欢迎大家留言。

其实大家无需知道每句代码的含义,用的时候知道在哪里修改数据就可以啦!

标签: #css3连线