数据可视化【十】绘制地图

Loading and parsing TOPOJSON

导入Topojson d3文件
地址:https://unpkg.com/topojson@3.0.2/dist/topojson.min.js
想要找d3文件的话去unpkg.com好像大部分都能找到的样子

Rendering geographic features

寻找合适的地图数据:谷歌搜索world-atlas npm,第一个网站点进去,然后选择合适的d3文件。
这个文件里面的地图是Topojson格式的,想要转化为geojson需要使用topojson中的feature函数,传入两个参数,例如:

json('https://cdn.jsdelivr.net/npm/world-atlas@2/countries-110m.json').then(data => { const countries = feature(data, data.objects.countries);console.log(countries);	}

然后就可以使用数据,给每个数据添加path,然后通过设置属性d进行绘制

Using different map projections

图形的不同关键就在绘制d的函数的不同。
d3官网上有许多绘制不同形状地图的函数,可以根据需要选择自己喜欢的。
网址:https://github.com/d3/d3-geo-projection
这里选择的是geoEqualEarth,这个函数需要从d3文件中导入。于此同时还需要导入geoPath函数

const projection = geoEqualEarth();
const pathGenerator = geoPath().projection(projection);json('https://cdn.jsdelivr.net/npm/world-atlas@2/countries-110m.json').then(data => { const countries = feature(data, data.objects.countries);console.log(countries);	svg.selectAll('path').data(countries.features).enter().append('path').attr('class', 'country').attr('d', pathGenerator);});

Rendering the projected sphere outline

然后就是通过设置CSS文件设置颜色,为了让地图的圆形凸显出来,我们要先给边框创建一个path

svg.append('path').attr('class', 'sphere').attr('d', pathGenerator({type:"Sphere"}));

然后在CSS文件中根据设置的类设置颜色:

.country{fill: #15ed76;stroke: black;stroke-opacity: 0.3;
}.sphere{fill: #15beed;
}

Tweaking map styles

最后的图形效果如图:
在这里插入图片描述代码地址:https://vizhub.com/Edward-Elric233/b21d1d4d6db34c9092c3252f39212bda

Highlighting on Hover using CSS

上面的效果已经不错了,但是如果我们想要鼠标放在上面就自动变色的话,我们可以在CSS文件里面添加hover属性,然后就可以了。

styles.css

.country:hover {
/*   鼠标放在上面可以变色 */fill : red;
}

效果图:
在这里插入图片描述

Adding simple tooltips(using )

我们还希望鼠标停留在上面的画可以提示国家的名称,想要做到这点,我们可以给每个path添加title,然后设置文本为国家名称即可。例如:
index.js

g.selectAll('path').data(countries.features).enter().append('path').attr('class', 'country').attr('d', pathGenerator).append('title')//添加title,然后鼠标放在上面就可以出现标题.text(d => d.properties.name);

我这里的数据直接就有国家名称,视频中的没有还需要使用tsv文件查找。如果有需要的话可以看原视频。

Loading multiple data files

Looking up country name from id

Panning & Zooming

当然我们还希望能够放大和缩小,这样才能看到更多的细节。为了实现这个效果,我们要把所有的东西都放到g上,然后再让svg.call(zoom().on('zoom', callback))添加鼠标滑轮事件。具体到这里我们希望图像的大小可以跟随滑轮的滚动而变化:

const g = svg.append('g');svg.call(zoom().on('zoom',() => {g.attr('

效果图:
在这里插入图片描述这里的地图应该比上面的清晰许多,是因为这里使用的数据是以10m为单位的,所以分辨率高一点。如果需要的话只需要把最前面地图的topojson的网址换成10m的即可:https://cdn.jsdelivr.net/npm/world-atlas@2.0.2/countries-10m.json

(比较大,加载稍微有点慢)

视频中的内容到这里就结束了,可是我总觉得这样的颜色有些丑,我想起来在以前做柱状图的时候我嫌弃他的颜色太丑自己做了一个选择颜色的函数,在这里也可以用一下:

let colorSet = ['#eb2617', '#ffaa00', '#4dff00', '#00fbff', '#bb00ff', '#eeff00'];const createGetColor = (idx)=>{var i = idx || -1;return {get : () => {i=(i+1)%colorSet.length; return colorSet[i];}};
};const getColor = createGetColor();

createGetColor函数会返回一个对象,对象中get属性为函数,这个函数中使用了外层的变量i,因此i不会被释放掉,相当于静态变量,每次调用这个函数这个变量都会加一,起到遍历颜色数组的功能。

在有了这个获取颜色函数以后我们只需要删掉CSS文件中设置地图颜色语句,然后在append后面设置属性即可。

g.selectAll('path').data(countries.features).enter().append('path').attr('class', 'country').attr('fill', getColor.get).attr('d', pathGenerator).append('title')//添加title,然后鼠标放在上面就可以出现标题.text(d => d.properties.name);

效果图:在这里插入图片描述
在这里插入图片描述

颜色选择的有点鲜艳,不过看起来还不错,有点世界地图的感觉。

代码地址:https://vizhub.com/Edward-Elric233/2e91c94015e345afb0c9f3ae6cde412f

感觉这个球体部分地方有些变形,我们可以换一个地图的形状

例如换成geoMercator
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383603.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据可视化【十一】树状图

Constructing a node-link tree visualization 首先将节点之间的连线画出来。 使用json函数读取文件以后,使用hierarchy等函数得到连线的数组,然后绑定这个数组,给每个元素添加一个path,绘画使用的是一个函数linkHorizontal&…

数据可视化【十二】 颜色图例和尺寸图例

有了前面的知识,制作一个图例应该不是很难,关键是我们想要制作一个可以在其他地方进行使用的图例,这样就需要能够动态地设置图例的大小,位置,等等。 这里直接上代码: colorLegend.js export const color…

数据可视化【十三】地区分布图

在前面的博客中已经介绍了如何绘制地图,这一节学习如何绘制地区分布图。如果对绘制地图还不熟悉的话可以了解一下之前我写的博客:数据可视化【十】绘制地图 Intergrating(整合) TopoJSON with tabular data(列表数据) 在前面的博客中没有使用到tsv文件…

3.01【python正则表达式以及re模块】

python正则表达式以及re模块 元字符 正则表达式的语法就由表格中的元字符组成,一般用于搜索、替换、提取文本数据 元字符含义.匹配除换行符以外的任何单个字符*匹配前面的模式0次或1次匹配前面的模式1次或多次?匹配前面的模式0次或1次[]用于定义字符集&#xff…

Linux配置编程环境+云服务器上传文件

Java环境配置 Ubuntu https://www.cnblogs.com/lfri/p/10437266.html Centos https://blog.csdn.net/qq_21077715/article/details/85536399 Tomcat配置 Centos https://blog.csdn.net/qq_21077715/article/details/85541685 https://www.cnblogs.com/newwind/p/9904561…

gbd + cgbd

gbd:传送门 cgbd:传送门 | 传送门

数据可视化【十四】交互式过滤地区分布图

在前面的博客中已经介绍了如何绘制地区分布图,这一节学习如何绘制交互式过滤地区分布图。如果对绘制地区分布图还不熟悉的话可以了解一下之前我写的博客:数据可视化【十三】地区分布图 整体的框架仍然是在之前的基础上进行修改,主要是添加交…

Ubuntu环境搭建

本文记录了一些常用的Ubuntu软件 然后首先修改软件源:软件和更新->Ubuntu软件->下载自:其他站点(修改为阿里云) 在关闭的时候需要更新什么的 然后修改更新方式,将不支持的更新去掉 常用的Windows软件 网易云…

1 两数之和

虽然只是一道很简单的题,但是也给我很多思考。 刚看到这道题的时候没有仔细思考,直接写了个排序和二分查找,想着对每个数字查找另一个数字会不会出现,复杂度是O(nlognnlogn)O(nlognnlogn)O(nlognnlogn),主要训练了一下…

834 树中距离之和

这道题我自己的想法只有对每个点都用一遍Dijkstra然后再求和,显然会超时,所以我都没有尝试。 研究了一下题解,发现题解很巧妙,自己对树的处理还是太稚嫩,之前树链剖分学的都忘光了。 对于固定根节点的,我…

75 颜色分类

题目已经提示可以一遍扫描了但是我还是没有想到,其实双指针的想法我已经有了,但是一想到有问题就觉得无法实现。这也揭示了我思维上的问题:用一种方法解决问题遇到困难第一件事情不是想着如何攻克而是想着换一种方法。对自己的思维也不自信。…

141 环形链表

要求使用空间复杂度为O(1)的方法,可是我并没有想到。我想到的只有用一个哈希表记录一下所有访问过的节点。 题解给出的空间复杂度为O(1)的方法是使用两个指针,然后让一个一次跑一步,一个一次跑两步,如果跑的快的能追上跑的慢的就…

数据可视化【十五】

经验法则:在颜色不相邻的时候加上背景颜色颜色的个数为6~12比较好。 颜色其实很大程度上由背景决定而不是他本身决定。 D3 Scale-Chromatic 有许多颜色刻度,可以根据自己的需要进行选择。 参考论文:Practical Rules for Using Color in Cha…

Ubuntu修改/删除主目录下的中文文件夹

在Ubuntu的主目录下一般是有一些中文的目录,例如桌面,视频等等,还无法修改名称,在一群英文文件夹里面显得有些突兀(Ubuntu终端下的中文一点也不好看),就想把这些文件夹修改一下,结果…

19 删除链表的倒数第N个

题目的意思很简单,就是删除一个链表倒数第N个节点。 需要用到链表的标准操作:快慢指针。 我们让一个快指针先指向第N个元素,这个时候快指针总比慢指针领先N个元素,等到快指针指向链表尾部的时候慢指针就指向需要删除的元素。 之前…

844. Backspace String Compare

题目的意思大概是有两个字符串,其中的#表示退格键,让比较最后两个字符串是否相当。 很容易想到的思路就是用一个栈进行模拟这个过程,特别需要注意如果一个串是空串也是可以退格的。 但是很容易想到的另一个特性就是,前面的字符有…

链表三连击

876:链表的中间节点 206:反转链表 143:重排练表 链表的中间节点 这个题一看就是最简单的快慢指针,但是在具体实现的时候我还是犹豫思考了一下:要不要在链表前面放置哑节点,快指针应该什么时候判断已经到达…

D3力导引图

学习力导引图的时候在网上没有找到什么好的教程,支离破碎地进行了一段时间的学习,还阅读了d3的关于d3的官方文档,但是始终觉得不的要领。这里记录一下我学习力导引图的一些心得以及推荐一下学习资源。 学习资源 官方文档:https:…

Ubuntu Pycharm启动后卡住无法操作

昨天还好好的,今天打开Pycham突然卡住了,卡在了那个preparing workspace的地方,然后在网上搜索了很多方法都没用。直到在网上看到有个大佬说是因为搜狗输入法的问题,我才突然记起来昨天安装了搜狗输入法。。。 kill掉卡住的Pycha…

327 区间和的个数

题目描述 Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive. Range sum S(i, j) is defined as the sum of the elements in nums between indices i and j (i ≤ j), inclusive. Note: A naive algorithm of O(n2) is t…