d3.js学习笔记-05(颜色、路径生成器)

12 篇文章 1 订阅
9 篇文章 2 订阅

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.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值