用一个计算去处理,
是的,要去设置的
我也看不了
是边距的问题
// 线性渐变 需要手动添加 linearGradient 标签 // 径向渐变同理 function linearGradient(container, color1, color2) { var defs = container.append("defs"); var gradient = defs .append("linearGradient") .attr("id", "linearColor") .attr("x1", "0%") .attr("y1", "0%") .attr("x2", "0%") .attr("y2", "100%"); gradient .append("stop") .attr("offset", "0%") .style("stop-color", color1.toString()); gradient .append("stop") .attr("offset", "100%") .style("stop-color", color2.toString()); return gradient; }
这是我写的第一个曲线的代码,你自己改一下吧
这是index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/style.css" media="screen" type="text/css"/>
</head>
<body>
<div id = "container"></div>
<script type="text/javascript" src="http://d3js.org/d3.v3.js"></script>
<script type = "text/javascript"src="js/index.js"></script>
</body>
</html>
------------------------------------------------------------------------------------------------------------------
这是style.css
#container{
background: #ddd;
width:500px;
height:250px;
}
path{
fill:none;
stroke:#4682B4;
stroke-width:2;
}
.domain,tick line{
stroke:grey;
stroke-width:1;
}
------------------------------------------------------------------------------------------------------------------
这是index.js
var width = 500,
height = 250,
margin = {left:50,top:30,right:20,bottom:20},
g_width = width-margin.left-margin.right,
g_height = height-margin.top-margin.bottom;
//svg
var svg = d3.select("#container")
.append("svg")
//width.height
.attr("width",width)
.attr("height",height)
var g = d3.select("svg")
.append("g")
.attr("transform","translate("+margin.left+","+margin.top+")")
var data = [1,3,5,7,8,4,3,7]
var scale_x = d3.scale.linear()
.domain([0,data.length-1])//输入范围
.range([0,g_width])//输出范围
var scale_y = d3.scale.linear()
.domain([0,d3.max(data)])
.range([g_height,0])
var line_generator = d3.svg.line()
.x(function(d,i){return scale_x(i);})
.y(function(d){return scale_y(d);})
.interpolate("cardinal")
d3.select("g")
.append("path")
.attr("d",line_generator(data))
var x_axis = d3.svg.axis().scale(scale_x),
y_axis = d3.svg.axis().scale(scale_y).orient("left");
g.append("g")
.call(x_axis)
.attr("transform","translate(0,"+g_height+")")
g.append("g")
.call(y_axis)
.append("text")
.text("Price($)")
.attr("transform","rotate(-90)")
.attr("text-anchor","end")
.attr("dy","1em")
添加的那个属性无效你要说清楚啊 ?
没有源代码
translate(50,30)
是d3.js
你div的class类名明明是contaiiner,所以js里面应该写成d3.select('#contaiiner')
直接用路径的方法去获取就可以了
d3.csv("js/数据.csv", type, function(data) {
console.log(data);
}取到一组以.csv结尾的数据
因为这个函数作为CSV(url,type,function(data){})的参数传到了csv的函数里面,csv函数的具体逻辑可以去查下d3的文件,可以理解成数据是在csv中走的,只是在csv中执行了下type(d)
是因为你使用的 d3js 版本比视频中老师用的新,接口不一样。
参考 这里:
https://d3js.org.cn/document/d3-shape/#curves
使用指定的 alpha 值([0, 1]
) 返回一条 Catmull–Rom
生成器。如果 alpha 为 0
则等价于 curveCardinal,如果 alpha 为 1
则会生成 chordal
曲线,如果 alpha 为 0.5
则会生成 centripetal spline
老师 使用的接口
d3.line().x().y().interpolate('cardinal')
等价于新的接口用法
d3.line().x().y().curve(CatmullRom.alpha(0.5))
里面的 0.5 设置为 0
表示的一个数据范围的输入
直接写.append("svg")就好了
兄弟 这样才对
d3.csv("data.csv", type, function(data){ console.log(data); function type(d){ d.population = +d.population; return d; } var bar_width = 50, bar_padding = 10, svg_width = (bar_width + bar_padding) * data.length, svg_height=500; });
版本不一样,你直接写d3.line()即可,不用svg
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="text/css" href="css/style.css">
<title>barchart_horizontal</title>
</head>
<body>
<div id="container"></div>
<script type="text/javascript" src="js/d3.min.js"></script>
<script type="text/javascript" src="js/index.js"></script>
</body>
</html>
我是自己网上下了一个d3.min.js文件,放在了js文件夹下
我只能说一下概念,能力有限,不好意思。
在对应的标签中用hover样式,里面调用函数显示内容,内容里面传入对应内容节点数组的x,y参数,然后对应的调用另一个显示内容的函数,用来显示内容。
哦。。我看到下面发现scale_x里domain输出是d.year
数据源长度不够
var width = 500, height = 250, margin = {left: 50, top: 30, right: 20, bottom: 20}, g_width = width - margin.left - margin.right, g_height = height - margin.top - margin.bottom; // 类似jq的链式调用 // 制作图中的线条 var svg = d3.select('#container') .append("svg:svg") // width,height .attr('width', width)//attribute .attr('height', height); var g = svg.append("g") .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); var data = [1, 3, 5, 7, 8, 4, 3, 7]; // 放大 var scale_x = d3.scaleLinear() .domain([0, data.length - 1]) .range([0, g_width]); var scale_y = d3.scaleLinear() .domain([0, d3.max(data)]) .range([g_height, 0]);// 切换坐标轴的朝向 var line_generator = d3.line() .x(function (d, i) { // d代表数据 // i代表下标 return scale_x(i); }) .y(function (d) { return scale_y(d); }) .curve(d3.curveCatmullRom.alpha(0.5)); g.append('path').attr('d', line_generator(data)); // 制作坐标轴 var x_axis = d3.axisBottom(scale_x), y_axis = d3.axisLeft(scale_y); g.append("g").call(x_axis) .attr("transform", "translate(0," + g_height + ")"); g.append("g").call(y_axis) .append("text").text("Price($)") // 设置单位等 .attr("transform", "rotate(-90)") // 定位 .attr("text-anchor", "end") .attr("dy", "1em");
#container { background: #ddd; width: 500px; height: 250px; } path { fill: none; stroke: #4682B4; stroke-width: 2; } text { fill: #000; } .domain, .tick line { stroke: gray; }
sublime text
贴代码 (^·_·^),多重复看视频,还有控制台信息
QAQ ~~~ (注: 老师的是 v3版本, 可能你用的是 v4)