d3.js学习笔记-05
目录
1. 颜色
1.1 RGB
RGB色彩模式通过叠加红绿蓝三个颜色通道得到各种颜色
- d3.rgb(r,g,b):使用r、g、b值来创建颜色,范围都为[0,255]。
- d3.rgb(color):输入字符串来创建颜色,例如:"#ffeeaa“或缩写"#fea"、 “red”。
- rgb.brighter([k]):颜色变更明亮。RGB各通道的值乘以0.7^-k。如果k省略,k的值为1。只有当通道的值在30~255之间时,才会进行相应的计算。
- rgb.darker([k]):颜色变更暗。RGB各通道的值乘以0.7^k。
- rgb.hsl():返回该颜色对应的HSL值。
- rgb.toString():以字符串形式返回该颜色值,如"#ffecaa"。
注:brighter()、darker()、hsl()返回的是对象,不是字符串。
1.2 HSL
H:亮度(Hue);S:饱和度(Saturation);L:明度(Lightness)
- d3.hsl(h, s,l):创建HSL颜色。
- d3.hsl(color):根据字符串来创建HSL 颜色。
- hsl.brighter([k])。:变得更亮。
- hsl.darker([k]:变得更暗。
- hsl.rgb():返回对应的RGB颜色。
- hsl.toString():以RGB字符串形式输出该颜色。
1.3 颜色插值
d3.interpolate(a,b):计算介于两种颜色之间的颜色
var colorA=d3.rgb(255,0,0) // red
var colorB=d3.rgb(0,255,0) // green
var compute = d3.interpolate(colorA, colorB) // 返回一个函数
compute(0) // red
compute(1) // green
compute(0.3) // 介于红绿之间的颜色
2. 线段生成器
2.1 生成线段方式汇总
<line x1="20", y1="20", x2="30", y2="30" />
svg.append("line")
.attr("x1",20)
.attr("y1",20)
.attr("x2",30)
.attr("y2",30)
<path d="M20,20 L30,30" />
svg.append("path")
.attr("d","M20,20 L30,30")
2.2 线段生成器
- d3.svg.line():创建一个线段生成器
- line(data):绘制data数据。
- line.x([x]):设置/获取线段x坐标的数据。
- line.y([y]):设置/获取y坐标的访问器。
- line.interpolate([interpolate]):设置/获取线段的插值模式,共有13种,默认线性插值(linear)
- line.tension([tension]):设置/获取张力系数,当插值模式为cardinal、cardinal-open、cardinal-closed的时候有效。
- line.defined([defined]):设置/获取一个访问器,用于确认线段是否存在,只有判定为存在的数据才被绘制。
//代码一
// 线段的点数据
var lines = [[80,801],[200,100],[200,2001],[100,200]];
//创建一个线段生成器
var linePath = d3.svg.line();
//添加路径
svg.append("path")
.attr("d",linePath(lines))/使用了线段生成器
.attr("stroke", "black")
// 代码二
// 使用line.x()
var line=[80,120,160,200,240,280];
var linePath =d3.svg.line()
.x(function(d){
return d;
})
.y(function(d, i){
return i%2==0?40:120;
})
// 代码三
// 使用插值
var linePath = d3.svg.line()
.interpolate("linear-closed")
// 代码四
// 使用defined(),选择性的使用顶点数据
var lines=[80,120,160,200,240,280];
var linePath = d3.svg.line()
.x(function(d){
return d;
})
.y(function(d, i){
return i%2==0?40:120;
})
.defined(function(d){
return d<200; // 如果值大于200,则不绘制
})
3 区域生成器
d3.svg.area():用于生成一块区域,有x()、x0() 、x1() 、y() 、y0() 、y1()六个数据访问器,有线段生成器的那些方法
可用于生成面积图
var dataset=[80,120,130,70,60,90];
// 创建一个区域生成器,使用了三个数据访问器
var areaPath = d3.svg.area()
.x(function(d, i){ return 50+i*60;})
.y(function(d, i){ return height/2;})
.y0(function(d, i){ return height/2-d;})
// 添加路径
svg.append("path")
.attr("d", areaPath(dataset)) // areaPath(dataset)返回的字符串作为d的值
.attr("stroke","blue")
.attr("stroke-width","3px")
.attr("fill","yellow")
4 弧生成器
d3.svg.arc():通过起始角度、终止角度、内外半径等生成弧线
可用于制作饼图、弦图
- innerRadius():内半径访问器
- outerRadius():外半径访问器
- startAngle():起始角度访问器
- endAngle():终止角度访问器
- arc.centroid():计算弧中心位置
// 四段弧的数据
var dataset=[
{startAngle: 0 ,endAngle: Math.PI* 0.61},
{startAngle:Math.PI*0.6 , endAngle:Math.PI},
{startAngle: Math.PI, endAngle:Math.PI *.1.7},
{startAngle: Math.PI * 1.7 , endAngle:Math.PI * 2}];
// 创建一个颜色比例尺
var color=d3.scale.category10()
//创建一个弧生成器
var arcPath = d3.svg.arc()
.innerRadius(0)
.outerRadius(100);
//添加路径
svg.selectAll("path")
.data(dataset)
.enter()
.append("path")
.attr("d", function(d){ return arcPath(dataset);}) // 将弧生成器的计算结果作为d的值
.attr("transform","translate(250,25O)")
.attr("stroke","black")
.attr("stroke-width", "2px")
.attr("fi11", function(d, i){ return color(i);});
// 添加文本
svg.selectAll("text")
.dataset(dataset)
.enter()
.append("text")
.attr("transform", function(d){
return "translate(250,250)" + "translate(" + arcPath.centroid(d) + ")";})
.attr("text-anchor","middle")
.text(function(d){
RETURN Math.floor((d.endAngle-d.startAngle)*180/Math.PI) + "°";
}); // Math.floor返回≤给定数字的一个最大整数
5 符号生成器
- d3.svg.symbol():创建符号生成器。
- symbol(datum[, index]):返回指定数据datum的路径字符串。
- symbol.type([type]):设置/获取符号的类型。
- symbol.size([size]):设置/获取符号的大小,单位是像素的平方。例如设定为100,则是一个宽度为10,高度也为10的符号。默认是64。
- d3.svg.symbolTypes():支持的符号类型,共六种,返回数组。
6 弦生成器
d3.svg.chord():根据两段弧绘制弦,将两段弧连接起来,5个访问器:
source() 、target()、 radius() 、startAngle() 、endAngle()
- 数据格式
{
source:{
start: 0.2,
end: Math.PI*0.3,
radius: 100
},
target:{
start: Math.PI* 1.0,
end: Math.PI*1.6,
radius:100
}
- 使用1
var chord = d3.svg.chord()
.source(function(d return d.startArc; })
.target(function (d return d.endArc; })
.radius(200)
.startAngle(function (d) return d.start; })
.endAngle(funetion (d)(return d.end;});
- 使用2
var chord = d3.svg.chord()
svg.append("path")
.attr("d", chord(dataset))
.attr("transform","translate(250,25O)")
.attr("stroke","black")
.attr("stroke-width", "2px")
.attr("fi11", "red");
7 对角线生成器
d3.svg.disgonal():将两个点连接起来,2个访问器:source()、target();投影函数:projection()
var dataset= {
{source:×:100 .y:100},
{target: x:300 , y:200}
}
//创建一个对角线生成器
var diagonal = d3.svg.diagonal();
//添加路径
svg.append("path")
.attr("d",diagonal (dataset))
.attr("fi11","none")
.attr("stroke","black")
.attr("stroke-width",3);
- 使用投影:projection()
x坐标和y坐标都会放大1.5倍,起点坐标变为(150,150),终点坐标变为(450,300)。但原数据并不会更改,只是在绘制的时候使用投影后的坐标。
var diagonal = d3.svg.diagonal()
projection(function (d){
var x = d.x*1.5:
var y = d.y*1.5;
return[x,y]:
});
8 绘制折线图
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<scrip src="https://d3js.org/d3.v3.min.js"></scrip>
<script src="../d3.v3.min.js"></script>
<title></title>
</head>
<style>
.axis path {
/* 设置坐标轴横线的样式 */
stroke: blue;
fill: none;
shape-rendering: crispEdges;
}
.axis line {
/* 设置刻度的样式*/
stroke: red;
fill: none;
shape-rendering: crispEdges;
}
.axis text {
/*设置刻度文本的样式 */
font-size: 12px;
}
</style>
<body>
<script>
var dataset=[
{
country:"china",
gdp:[[2000,11920], [2001,13170],[2002,14550],
[2003,16500],[2004,19440],[2005,22870],
[2006,27930],[2007,35040],[2008,45470],
[2009,51050],[2010,59490],[2011,73140],
[2012,83860],[2013,103550]]
},
{
country:"japan",
gdp:[[2000,47310],[2001,41590],[2002,39800],
[2003,43020],[2004,46550],[2005,45710],
[2006,43560],[2007, 43560],[2008,48490],
[2009,50350],[2010,54950],[2011,59050],
[2012,59370],[2013,48980]]
}
]
//计算GDP的最大值
var gdpmax = 0;
for(var i=0; i<dataset.length; i++){
var currGdp = d3.max(dataset[i].gdp , function (d){
return d[1];
});
if(currGdp > gdpmax )
gdpmax = currGdp;
}
var padding = {"top":100, "left": 100}
// 声明绘图的svg
var svg=d3.select("body")
.append("svg")
.attr("width", 600)
.attr("height", 600)
// 线性比例尺
var xScale = d3.scale.linear().nice()
.domain([2000,2013])
.range([0,500])
var yScale = d3.scale.linear()
.domain([0,gdpmax])
.range([400, 0])
// 坐标轴
var xAxis = d3.svg.axis()
.scale(xScale)
.orient("bottom")
.ticks(6)
var yAxis = d3.svg.axis()
.scale(yScale)
.orient("left")
svg.append("g")
.attr("class", "axis")
.attr("transform", "translate(100,500)")
.call(xAxis);
svg.append("g")
.attr("class", "axis")
.attr("transform", "translate(100,100)")
.call(yAxis);
// 绘制折线图
var linePath = d3.svg.line()
.x(function(d){
return xScale(d[0]) + padding.left;
})
.y(function(d){
return yScale(d[1])+padding.top;
})
// 中国折线
svg.append("path")
.attr("d", linePath(dataset[0].gdp))
.attr("fill", "none")
.attr("stroke","red")
// 日本折线
svg.append("path")
.attr("d", linePath(dataset[1].gdp))
.attr("fill", "none")
.attr("stroke","green")
// 创建符号生成器
var symbol = d3.svg.symbol()
.size(100)
.type("square")
// 增加标记
svg.append("path")
.attr("d", symbol())
.attr("fill", "red")
.attr("transform","translate(100,550)")
svg.append("text")
.attr("font-size","12px")
.attr("transform","translate(110,555)")
.text("China")
svg.append("path")
.attr("d", symbol())
.attr("fill", "green")
.attr("transform","translate(250,550)")
svg.append("text")
.attr("font-size","12px")
.attr("transform","translate(260,555)")
.text("Japan")
</script>
</body>
</html>
效果
References
[1] 吕之华.精通D3.js:交互式数据可视化高级编程[M].北京:电子工业出版社,2015∶128-142.