定义域:domain
值域:range
一、基础用法(绑定文字)
<html>
<head>
<meta charset="utf-8">
<title>Hello World</title>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
</head>
<body>
<p></p>
<p></p>
<p></p>
</body>
</html>
<script>
var dataset = ["sun","moon","you"];
var body = d3.select("body");
var p = body.selectAll("p");
p.data(dataset).text(function(d, i){
return "I love " + d;
});
console.log(d3.range(5));
</script>
二、综合用法(柱形图,含选择集、数据绑定、比例尺、坐标轴)
<html>
<head>
<meta charset="utf-8">
<title>Hello World</title>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
<style>
.axis path,
.axis line{
fill: none;
stroke: black;
shape-rendering: crispEdges;
}
.axis text {
font-family: sans-serif;
font-size: 11px;
}
</style>
</head>
<body>
</body>
</html>
<script>
var width = 400;
var height = 400;
var svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height);
var padding = {left:30, right:30, top:20, bottom:20};
var dataset = [10, 20, 30, 40, 33, 24, 12, 5];
var xScale = d3.scale.ordinal()
.domain(d3.range(dataset.length))
.rangeRoundBands([0, width - padding.left - padding.right]);
var yScale = d3.scale.linear()
.domain([0,d3.max(dataset)])
.range([height - padding.top - padding.bottom, 0]);
var xAxis = d3.svg.axis()
.scale(xScale)
.orient("bottom");
var yAxis = d3.svg.axis()
.scale(yScale)
.orient("left");
var rectPadding = 4;
var rects = svg.selectAll(".MyRect")
.data(dataset)
.enter()
.append("rect")
.attr("class","MyRect")
.attr("transform","translate(" + padding.left + "," + padding.top + ")")
.attr("x", function(d,i){
return xScale(i) + rectPadding/2;
})
.attr("y",function(d){
return yScale(d);
})
.attr("width", xScale.rangeBand() - rectPadding )
.attr("height", function(d){
return height - padding.top - padding.bottom - yScale(d);
})
.attr("fill","steelblue");
var texts = svg.selectAll(".MyText")
.data(dataset)
.enter()
.append("text")
.attr("class","MyText")
.attr("transform","translate(" + padding.left + "," + padding.top + ")")
.attr("x", function(d,i){
return xScale(i) + rectPadding/2;
} )
.attr("y",function(d){
return yScale(d);
})
.attr("dx",function(){
return (xScale.rangeBand() - rectPadding)/2;
})
.attr("dy",function(d){
return 20;
})
.text(function(d){
return d;
})
.style({
"fill":"#FFF",
"text-anchor":"middle"
});
svg.append("g")
.attr("class","axis")
.attr("transform","translate(" + padding.left + "," + (height - padding.bottom) + ")")
.call(xAxis);
svg.append("g")
.attr("class","axis")
.attr("transform","translate(" + padding.left + "," + padding.top + ")")
.call(yAxis);
</script>
三、数据平放(无比例尺)
<html>
<head>
<meta charset="utf-8">
<title>Hello World</title>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
</head>
<body>
</body>
</html>
<script>
var dataset = [ 250 , 210 , 170 , 130 , 90 ];
var width = 300;
var height = 300;
var svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height);
var rectHeight = 25;
svg.selectAll("rect")
.data(dataset)
.enter()
.append("rect")
.attr("x",20)
.attr("y",function(d,i){
return i * rectHeight;
})
.attr("width",function(d){
return d;
})
.attr("height",rectHeight-10)
.attr("fill","steelblue");
</script>
四、数据平放(有比例尺)
<html>
<head>
<meta charset="utf-8">
<title>Hello World</title>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
</head>
<body>
</body>
</html>
<script>
var dataset = [ 250 , 210 , 170 , 130 , 90 ];
var width = 300;
var height = 300;
var svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height);
var rectHeight = 25;
var dataset = [ 2.5 , 2.1 , 1.7 , 1.3 , 0.9 ];
var linear = d3.scale.linear()
.domain([0, d3.max(dataset)])
.range([0, 250]);
var rectHeight = 25;
svg.selectAll("rect")
.data(dataset)
.enter()
.append("rect")
.attr("x",20)
.attr("y",function(d,i){
return i * rectHeight;
})
.attr("width",function(d){
return linear(d);
})
.attr("height",rectHeight-10)
.attr("fill","steelblue");
</script>
五、数据立放(无比例尺)
<html>
<head>
<meta charset="utf-8">
<title>Hello World</title>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
</head>
<body>
</body>
</html>
<script>
var dataset = [ 250 , 210 , 170 , 130 , 90 ];
var width = 300;
var height = 300;
var svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height);
var rectHeight = 25;
svg.selectAll("rect")
.data(dataset)
.enter()
.append("rect")
.attr("x",function(d,i){
return i * rectHeight;
})
.attr("y",function(d,i){
return height - d;
})
.attr("width",rectHeight-10)
.attr("height",function(d){
return d;
})
.attr("fill","steelblue");
</script>
六、数据立放(有比例尺)
<html>
<head>
<meta charset="utf-8">
<title>Hello World</title>
<script src="http://d3js.org/d3.v3.min.js" charset="utf-8"></script>
</head>
<body>
</body>
</html>
<script>
var dataset = [ 250 , 210 , 170 , 130 , 90 ];
var width = 300;
var height = 300;
var svg = d3.select("body")
.append("svg")
.attr("width", width)
.attr("height", height);
var rectHeight = 25;
var dataset = [ 2.5 , 2.1 , 1.7 , 1.3 , 0.9 ];
var linear = d3.scale.linear()
.domain([0, d3.max(dataset)])
.range([0, 250]);
var rectHeight = 25;
svg.selectAll("rect")
.data(dataset)
.enter()
.append("rect")
.attr("x",function(d,i){
return i * rectHeight;
})
.attr("y",function(d,i){
return 250 - linear(d) ;
})
.attr("width",rectHeight-10)
.attr("height",function(d){
return linear(d);
})
.attr("fill","steelblue");
</script>
附1、饼图
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/d3/3.2.8/d3.js"></script>
<script type="text/javascript">
var chartData = [
{ label: '漯河', value: 2 },
{ label: '舞阳', value: 3 },
{ label: '郭庄', value: 2 },
{ label: '北京', value: 3 },
{ label: '漯河3', value: 2 },
{ label: '北京3', value: 3 },
{ label: '漯河4', value: 2 },
{ label: '北京4', value: 3 },
{ label: '郭庄2', value: 4 }
];
var colors = [
'#2484c1',
'#65a620',
'#7b6888',
'#a05d56',
'#961a1a',
'#d8d23a',
'#e98125',
'#d0743c',
'#635222'
];
var title = [
{
text: 'www.guowenke.tk',
color: '#333333',
fontSize: 18,
font: 'arial'
}
];
var canvasWidth = 600;
var canvasHeight = 400;
$(function () {
var svg = d3
.select('#pie')
.append('svg')
.attr('width', canvasWidth)
.attr('height', canvasHeight);
svg
.selectAll('.title')
.data(title)
.enter()
.append('text')
.text(function (d) {
return d.text;
})
.attr('class', 'title')
.attr('fill', function (d) {
return d.color;
})
.style('font-family', function (d) {
return d.font;
})
.attr('x', canvasWidth / 2)
.attr('y', 30);
var pieChartElement = svg
.append('g')
.attr(
'transform',
'translate(' + canvasWidth / 2 + ',' + canvasHeight / 2 + ')'
);
var arc = d3.svg
.arc()
.innerRadius(canvasHeight * 0)
.outerRadius((canvasHeight * 0.8) / 3)
.startAngle(0)
.endAngle(function (d) {
return (d.value / getSumData(chartData)) * 2 * Math.PI;
});
var arcs = pieChartElement
.selectAll('g')
.data(chartData)
.enter()
.append('g')
.attr('transform', function (d, i) {
var angle = 0;
if (i > 0) {
angle = getSegmentAngle(i - 1, chartData, getSumData(chartData));
}
return 'rotate(' + angle + ')';
});
arcs
.append('path')
.attr('fill', function (d, i) {
return colors[i];
})
.attr('d', function (d) {
return arc(d);
});
var outerLabelGroupData = [];
var lineCoordGroups = [];
var labels = svg.append('g').attr('class', 'labels');
var labelGroup = labels
.selectAll('.labelGroup')
.data(chartData)
.enter()
.append('g')
.attr('class', 'labelGroup');
labelGroup.append('text').text(function (d, i) {
return d.label + ':' + d.value;
});
d3.selectAll('.labelGroup')
.each(function (d, i) {
var labelGroupDims = $('.labelGroup').get(i).getBBox();
var angle = getSegmentAngle(i, chartData, getSumData(chartData), {
midpoint: true
});
var originalX = canvasWidth / 2;
var originalY = canvasHeight / 2 - ((canvasHeight * 0.8) / 3 + 3);
var newCords = rotate(
originalX,
originalY,
canvasWidth / 2,
canvasHeight / 2,
angle
);
if (angle > 180) {
newCords.x -= labelGroupDims.width + 28;
} else {
newCords.x += 28;
}
outerLabelGroupData[i] = {
x: newCords.x,
y: newCords.y,
w: labelGroupDims.width,
h: labelGroupDims.height
};
})
.attr('transform', function (d, i) {
return (
'translate(' +
outerLabelGroupData[i].x +
',' +
outerLabelGroupData[i].y +
')'
);
});
d3.selectAll('.labelGroup').each(function (d, i) {
var angle = getSegmentAngle(i, chartData, getSumData(chartData), {
midpoint: true
});
var originalX = canvasWidth / 2;
var originalY = canvasHeight / 2 - ((canvasHeight * 0.8) / 3 + 3);
var newCords = rotate(
originalX,
originalY,
canvasWidth / 2,
canvasHeight / 2,
angle
);
var labelXMargin = 6;
var originCoords = newCords;
var heightOffset = outerLabelGroupData[i].h / 5;
var quarter = Math.floor(angle / 90);
var midPoint = 4;
var x2, y2, x3, y3;
if (quarter === 2 && angle === 180) {
quarter = 1;
}
switch (quarter) {
case 0:
x2 =
outerLabelGroupData[i].x -
labelXMargin -
(outerLabelGroupData[i].x - labelXMargin - originCoords.x) / 2;
y2 =
outerLabelGroupData[i].y +
(originCoords.y - outerLabelGroupData[i].y) / midPoint;
x3 = outerLabelGroupData[i].x - labelXMargin;
y3 = outerLabelGroupData[i].y - heightOffset;
break;
case 1:
x2 =
originCoords.x +
(outerLabelGroupData[i].x - originCoords.x) / midPoint;
y2 =
originCoords.y +
(outerLabelGroupData[i].y - originCoords.y) / midPoint;
x3 = outerLabelGroupData[i].x - labelXMargin;
y3 = outerLabelGroupData[i].y - heightOffset;
break;
case 2:
var startOfLabelX =
outerLabelGroupData[i].x +
outerLabelGroupData[i].w +
labelXMargin;
x2 = originCoords.x - (originCoords.x - startOfLabelX) / midPoint;
y2 =
originCoords.y +
(outerLabelGroupData[i].y - originCoords.y) / midPoint;
x3 =
outerLabelGroupData[i].x +
outerLabelGroupData[i].w +
labelXMargin;
y3 = outerLabelGroupData[i].y - heightOffset;
break;
case 3:
var startOfLabel =
outerLabelGroupData[i].x +
outerLabelGroupData[i].w +
labelXMargin;
x2 = startOfLabel + (originCoords.x - startOfLabel) / midPoint;
y2 =
outerLabelGroupData[i].y +
(originCoords.y - outerLabelGroupData[i].y) / midPoint;
x3 =
outerLabelGroupData[i].x +
outerLabelGroupData[i].w +
labelXMargin;
y3 = outerLabelGroupData[i].y - heightOffset;
break;
}
lineCoordGroups[i] = [
{ x: originCoords.x, y: originCoords.y },
{ x: x2, y: y2 },
{ x: x3, y: y3 }
];
});
var lineGroups = svg
.append('g')
.attr('class', 'lineGroups')
.style('opacity', 1);
var lineGroup = lineGroups
.selectAll('.lineGroup')
.data(lineCoordGroups)
.enter()
.append('g')
.attr('class', 'lineGroup');
var lineFunction = d3.svg
.line()
.interpolate('basis')
.x(function (d) {
return d.x;
})
.y(function (d) {
return d.y;
});
lineGroup
.append('path')
.attr('d', lineFunction)
.attr('stroke', function (d, i) {
return colors[i];
})
.attr('stroke-width', 1)
.attr('fill', 'none');
function rotate(x, y, xm, ym, a) {
a = (a * Math.PI) / 180;
var cos = Math.cos,
sin = Math.sin,
xr = (x - xm) * cos(a) - (y - ym) * sin(a) + xm,
yr = (x - xm) * sin(a) + (y - ym) * cos(a) + ym;
return { x: xr, y: yr };
}
function getSumData(data) {
var sumData = 0;
var countData = data.length;
for (var i = 0; i < countData; i++) {
sumData += data[i].value;
}
return sumData;
}
function getSegmentAngle(index, data, sumValue, opts) {
var options = $.extend(
{
compounded: true,
midpoint: false
},
opts
);
var currValue = data[index].value;
var fullValue;
fullValue = 0;
for (var i = 0; i <= index; i++) {
fullValue += data[i].value;
}
var angle = (fullValue / sumValue) * 360;
if (options.midpoint) {
var currAngle = (currValue / sumValue) * 360;
angle -= currAngle / 2;
}
return angle;
}
});
</script>
</head>
<body>
<div id="pie"></div>
</body>
</html>
附2、svg子标签
<html>
<head>
<meta charset="utf-8">
<title>svg子标签</title>
</head>
<body>
<div>
<p>1.矩形</p>
<p>x 属性定义矩形的左侧位置(例如,x="0" 定义矩形到浏览器窗口左侧的距离是 0px)</p>
<p>y 属性定义矩形的顶端位置(例如,y="0" 定义矩形到浏览器窗口顶端的距离是 0px)</p>
<p>CSS 的 fill-opacity 属性定义填充颜色透明度(合法的范围是:0 - 1)</p>
<p>CSS 的 stroke-opacity 属性定义笔触颜色的透明度(合法的范围是:0 - 1)</p>
</div>
<svg width="500" height="500">
<rect x="20" y="20" width="250" height="100" style="fill:blue;stroke:pink;stroke-width:5;fill-opacity:0.1;stroke-opacity:0.9"/>
</svg>
<div>
<p>2.圆形</p>
<p>cx 和 cy 属性定义圆点的 x 和 y 坐标。</p>
<p>如果省略 cx 和 cy,圆的中心会被设置为 (0, 0)</p>
<p>r 属性定义圆的半径。</p>
</div>
<svg width="500" height="500">
<circle cx="100" cy="50" r="40" stroke="black" stroke-width="2" fill="red"/>
</svg>
<div>
<p>3.椭圆</p>
<p>cx 属性定义圆点的 x 坐标</p>
<p>cy 属性定义圆点的 y 坐标</p>
<p>rx 属性定义水平半径</p>
<p>ry 属性定义垂直半径</p>
</div>
<svg width="500" height="500">
<ellipse cx="300" cy="150" rx="200" ry="80" style="fill:rgb(200,100,50);stroke:rgb(0,0,100);stroke-width:2"/>
</svg>
<div>
<p>4.线</p>
<p>x1 属性在 x 轴定义线条的开始</p>
<p>y1 属性在 y 轴定义线条的开始</p>
<p>x2 属性在 x 轴定义线条的结束</p>
<p>y2 属性在 y 轴定义线条的结束</p>
</div>
<svg width="500" height="500" >
<line x1="0" y1="0" x2="300" y2="300" style="stroke:rgb(99,99,99);stroke-width:2"/>
</svg>
<div>
<p>5.路径</p>
<p>定义了一条路径,</p>
<p>它开始于位置 250 150,到达位置 150 350,</p>
<p>然后从那里开始到 350 350,</p>
<p>最后在 250 150 关闭路径。</p>
</div>
<svg width="500" height="500">
<path d="M250 150 L150 350 L350 350 Z" />
</svg>
<div>
<p>6.多边形</p>
<p>points 属性定义多边形每个角的 x 和 y 坐标</p>
</div>
<svg width="500" height="500">
<polygon points="220,100 300,210 170,250" style="fill:#cccccc; stroke:#000000;stroke-width:1"/>
</svg>
<div>
<p>7.折线</p>
<p>标签用来创建仅包含直线的形状。</p>
</div>
<svg width="500" height="500">
<polyline points="0,0 0,20 20,20 20,40 40,40 40,60" style="fill:white;stroke:red;stroke-width:2"/>
</svg>
</body>
</html>
附3、svg背景图片解析
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>angular</title>
<style>
div {
width: 100px;
height: 100px;
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23000' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: center center;
background-size: 100px 100px;
background-color: gray;
border:2px solid green;
}
</style>
</head>
<body>
<div></div>
</body>
</html>