html svg 折线图原理,D3.js svg绘制折线图

折线图的制作

.axis path,

.axis line{

fill:none;

stroke:black;

shape-rendering:crispEdges;

}

var width=500;

var height=500;

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],]

}

];

var padding={top:70, right:70, bottom: 70, left:70};

var gdpmax=0;

for(var i=0;i

var currGdp=d3.max(dataset[i].gdp,function(d){

return d[1];

});

if(currGdp>gdpmax)

gdpmax=currGdp;

}

console.log(gdpmax);

var xScale=d3.scale.linear()

.domain([2000,2013])

.range([0,width-padding.left-padding.right]);

var yScale=d3.scale.linear()

.domain([0,gdpmax*1.1])

.range([height-padding.bottom-padding.top,0]);

var linePath=d3.svg.line()//创建一个直线生成器

.x(function(d){

return xScale(d[0]);

})

.y(function(d){

return yScale(d[1]);

})

.interpolate("basis")//插值模式

;

//定义两个颜色

var colors=[d3.rgb(0,0,255),d3.rgb(0,255,0)];

var svg=d3.select("body")

.append("svg")

.attr("width",width)

.attr("height",height);

svg.selectAll("path")

.data(dataset)

.enter()

.append("path")

.attr("transform","translate("+padding.left+","+padding.top+")")

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

return linePath(d.gdp);

//返回线段生成器得到的路径

})

.attr("fill","none")

.attr("stroke-width",3)

.attr("stroke",function(d,i){

return colors[i];

});

var xAxis=d3.svg.axis()

.scale(xScale)

.ticks(5)

.tickFormat(d3.format("d"))

.orient("bottom");

var yAxis=d3.svg.axis()

.scale(yScale)

.orient("left");

//添加一个g用于放x轴

svg.append("g")

.attr("class","axis")

.attr("transform","translate("+padding.left+","+(height-padding.top)+")")

.call(xAxis);

svg.append("g")

.attr("class","axis")

.attr("transform","translate("+padding.left+","+padding.top+")")

.call(yAxis);

原理:

1、如果用原生数值代替像素值,显示的图形过小或过大时,就需要将某一区域的值映射到另一区域,但其大小关系不变,这就是比例尺(Scale)了。

2、定义域与值域

在数学中,x 的范围被称为定义域,y 的范围被称为值域。D3 中的比例尺,也有定义域和值域,分别被称为 domain 和 range。开发者只需要指定 domain() 和 range() 的范围,如此即可得到一个计算关系。

3、两种比例尺

①线性比例尺:

78491e6a3cda

其中,d3.scale.linear() 返回一个线性比例尺,返回值可以当做函数来使用的。domain() 和 range() 分别设定比例尺的定义域和值域。

注意:V4 版本改变了写法,应该是 var linear = d3.scaleLinear(); 。

在这里还用到了两个函数,它们经常与比例尺一起出现:

1.d3.max()

2.d3.min()

这两个函数能够求数组的最大值和最小值,是 D3 提供的。

②序数比例尺:

如果,定义域和值域不一定是连续的,都是离散的。那就要用到序数比例尺了。

78491e6a3cda

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值