【d3.js实践教程特别篇】PornHub发布基于d3的网民观看成人视频时长分布交互式地图

学习d3.js(以下都简称d3)也有一段时间了,运行d3做了几个项目。我发现中文的d3教程很少,国外资料多但要求有一定的英文阅读能力(推荐网址:http://bl.ocks.org/mbostock),于是就萌发了写一个d3实际运用系列文章的想法,现在开始付之行动。在系列中,我会用d3+html5 canvas实现一些实际效果(如统计结果展示,地图数据展示等),希望可以跟大家共同学习交流。

代码我公布在git.cschina.com上,大家可以clone到本地运行,地址是:http://git.oschina.net/0604hx/d3lesson

运行环境是java 7+,tomcat 7.0.47+(以后会用到websocket,所以需要javaee7 跟 tomcat 7+的支持),IDE 是IntelliJ IDEA 13, 项目的视图使用了freemarker。

这是d3实践的特别篇,代码不是我写的,是从PornHub网站中copy出来,进行了简化、美化处理,并加上了一些注释。

早上看到了一则微博:

我想很多人对PornHub会有所认识,这是全球三大色情网站之一,内容可是相当丰富的哟。咳咳,跑题了...

微博里面提到的地图目测是d3.js的应用,所以想看看具体的代码。但是PornHub在国内是无法访问的(就连搜索这个关键字都不能....),于是使用vpn登录,可以正常访问PornHub网站,哇,里面好多资源呀!这网站不被墙真是没天理了!我收回心,毕竟我不是来看片的,我是来学习技术的呀!

我找到了交互式地图,网址为:http://www.pornhub.com/infographic/longest

从地图上可以看到,全球范围内的网民观看成人视频的平均时长。同时,可以切换到美国地图。除了根据国家形式查看,还可以转到城市级别,这时会在地图上标出全球的主要城市,当鼠标移动到城市的图标上去可以看到城市名字跟观看时长等数据。地图可以放大缩小。

看了下代码,js文件就两个:

data.min.js 是数据(包括了国家级别、城市级别的数据)

main.js 是绘制地图还有交互用的

usa.json 是美国的geoJson数据

world.json 则是世界地图数据

为了大家访问查看效果,我将地图部署到了d3lesson的项目中,有兴趣的朋友可以在git中导出项目然后运行。

通过这个例子,可以学习到地图的切换、缩放、小图标在大地图缩放是的处理方法(因为地图放大后,图标也会跟着放大,这样的话,不够美观)等。

具体的代码可以再git中查看(我都加了注释的),在这里主要讲一下里面绘图方法:

var m, //svg对象
		r, //放置地图的 g 集合
		u, //坐标转换器
		n,	//path
		a,	//zoom元素
		e;	//地图块数据
    var o, l;

    //绘制地图
    function j() {
        o = $("#map").width();      //得到大地图宽度
        l = $("#map").height();     //得到大地图高度
        d3.json($("body").data("base-url") + c.mapScope + ".json",
        function(w) {
            m = d3.select("#map").append("svg").attr("width", o).attr("height", l);
            $("#map").css("background", c.mapOptions[c.mapDisplayMode].mapBackgroundColor).css("cursor", "move");
            r = m.append("g");
            if (c.mapScope == "world") {
                u = d3.geo.mercator().translate([0, 0]).scale(1).rotate([ - 11.5, 0])
            } else {
                u = d3.geo.albersUsa().translate([0, 0]).scale(1)
            }
            e = topojson.feature(w, w.objects[(c.mapScope == "world") ? "collection": "usa"]);
            e.features = e.features.filter(function(x) {
                return x.id !== 11;
            });
            var g = r.selectAll(".country").data(e.features);
            n = d3.geo.path().projection(u);
            q();       //完成地图的位移,不然页面时显示不出地图的
            if (c.mapDisplayMode == "cities") {
                r.append("path").datum(topojson.merge(w, w.objects[(c.mapScope == "world") ? "collection": "usa"].geometries.filter(function(x) {
                    return x.id !== 11
                }))).attr("class", "dropshadow").attr("d", n).style("fill", "#5e8fa7").attr("width", o).attr("height", l).attr("transform", "translate(0,5)")
            }
            g.enter().append("path").attr("class", "country").attr("d", n).attr("id",
            function(y, x) {
                return "c" + y.id
            });

            d3.selectAll("path.country").attr("class", "country")
				//给地图块上色,函数的z参数,就是对应元素的data对象(由之前调用data()函数分配)
				.style("fill",function(z) {
					if (c.mapDisplayMode == "countries") {
						//或者具体的时间长, 数据结构在  data.min.js
						var y = mapTimeData[c.mapScope][c.mapDisplayMode][z.id].t;
						var x = d(y);   //判断颜色级别
						return x
					} else {
						return c.mapOptions[c.mapDisplayMode].mapItemsColor
					}
				})
				.style("stroke-width", 1).style("stroke", c.mapOptions[c.mapDisplayMode].strokeColor);
            p();         //创建qtip的提示

			/*
			一下的3行代码是设置svg的滚轮放大效果
			*/
			d3.behavior.zoom();
            a = d3.behavior.zoom().scaleExtent([c.minZoomLevel, c.maxZoomLevel]).on("zoom", k);
            m.call(a).call(a.event)
        });
    }

再来几张效果图:

时间: 2024-10-22 03:09:54

【d3.js实践教程特别篇】PornHub发布基于d3的网民观看成人视频时长分布交互式地图的相关文章

【d3.js实践教程02】基于中国地图的高考一本录取率排行

学习d3.js(以下都简称d3)也有一段时间了,运行d3做了几个项目.我发现中文的d3教程很少,国外资料多但要求有一定的英文阅读能力(推荐网址:http://bl.ocks.org/mbostock),于是就萌发了写一个d3实际运用系列文章的想法,现在开始付之行动.在系列中,我会用d3+html5 canvas实现一些实际效果(如统计结果展示,地图数据展示等),希望可以跟大家共同学习交流. 代码我公布在git.cschina.com上,大家可以clone到本地运行,地址是:http://git.

【d3.js实践教程01】d3基本操作

学习d3.js(以下都简称d3)也有一段时间了,运行d3做了几个项目.我发现中文的d3教程很少,国外资料多但要求有一定的英文阅读能力(推荐网址:http://bl.ocks.org/mbostock),于是就萌发了写一个d3实际运用系列文章的想法,现在开始付之行动.在系列中,我会用d3+html5 canvas实现一些实际效果(如统计结果展示,地图数据展示等),希望可以跟大家共同学习交流. 代码我公布在git.cschina.com上,大家可以clone到本地运行,地址是:http://git.

vue / js使用video获取视频时长

项目中遇到上传视频功能,需要有预览和获取视频时长功能,因之前使用upload(有需要的话可以参考下我之前的文章),这里就不赘述,直接用来上传视频,不过在上传之前和上传成功后的钩子里,获取不到时长: 没有时长怎么办呢,只能用原生JS来获取: 上传成功以后,将成功的路径绑定给video 使用js获取duration并赋给时间参数 这时你会发现,你得到的值是NaN 视频还未加载下来,无法同步获取到,使用定时器即可解决 OK了,现在可以获取到了 希望本文对你有所帮助! 原文地址:https://www.

持续集成之jenkins实践教程 基础篇 4 集成redmine

作为持续集成的利器Jenkins已经得到了广泛地应用,仅仅作为一个工具,Jenkins已然了了自己的生态圈,支持其的plugin更是超过1300+.在实际中如何使用以及如何更好地使用jenkins,一直是大家在实践并讨论的.本系列文章将会从如何使用jenkins方面对一些细节进行总结和整理,这篇文章将会介绍如何在Jenkins中实现与redmine的集成 事前准备 只要有jenkins即可,没有的可以使用Jenkins官方的镜像或者安装包,或者使用Easypack中封装的基本一致的Jenkins

版本管理之gitlab实践教程 基础篇 3

comment是版本管理中非常重要的内容,尤其是在经年累月的大型项目中,铁打的项目,流水的SE,哪怕只言片语的留下,对后来者问题的对应很多时候都能起到重要作用,这篇文章用来讲解git中如何进行comment的管理. 为什么需要comment 为什么需要comment,理由有很多:规范,可读,可维护,bug分析等等.很多人可能在新入一个大型项目时候进行原因调查时候都有很多障碍,尤其是业务不清晰,然后再加上经年累月的bug修改,导致目前的代码已经面目全非的可能性很多,如果有点comment,那就是绝

Node.js入门教程 第一篇 (环境配置及概念原理)

Node.js 概念 Node.js本质上是使用Google的V8引擎制作出来的服务框架.V8本身是Google为了解决Chrome浏览器的性能问题而制作的前端引擎(开源).本身依托于浏览器引擎,这也是为什么Node.js使用的是前端的JavaScript语言编程. V8的诞生是Google为了解决JavaScript的性能问题,用了内联缓存和隐藏类技术实现的前端引擎.V8使用C++编写,也因此V8可以在C++项目中完美兼容使用. V8被Google使用在大多数产品中,如Chrome浏览器,安卓

ASP.NET MVC4 新手入门教程特别篇之一----Code First Migrations更新数据库结构(数据迁移)修改Entity FrameWork 数据结构(不删除数据)

背景 code first起初当修改model后,要持久化至数据库中时,总要把原数据库给删除掉再创建(DropCreateDatabaseIfModelChanges),此时就会产生一个问题,当我们的旧数据库中包含一些测试数据时,当持久化更新后,原数据将全部丢失,故我们可以引入EF的数据迁移功能来完成. 要求 已安装NuGet 过程示例 原model using System; using System.Collections.Generic; using System.Linq; using

网页图表Highcharts实践教程之图表代码构成

网页图表Highcharts实践教程之图表代码构成 Highcharts第一个实例 下面我们来实现本书的第一个Highcharts实例. [实例1-1]下面来制作北京连续一周最高温度折线图.操作过程如下: (1)新建一个网页文件,命名为Hello.html.同时,将title设置为Hello Highcharts.代码如下: <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head>

网页图表Highcharts实践教程之认识Highcharts

网页图表Highcharts实践教程之认识Highcharts 第1章  认识Highcharts Highcharts是国际知名的一款图表插件.它完全使用Javascript编写实现.其结构清晰,使用简单.开发人员可以很轻松地构建出常见的各种图表类型.本章将简要介绍Highcharts的特点,并实现第一个Highcharts图表. Highcharts概述 为了更好学习Highcharts的使用,我们首先了解如何获取Highchrts插件和Highcharts所支持的图表类型. 下载Highc