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

在前面的博客中已经介绍了如何绘制地图,这一节学习如何绘制地区分布图。如果对绘制地图还不熟悉的话可以了解一下之前我写的博客:数据可视化【十】绘制地图

Intergrating(整合) TopoJSON with tabular data(列表数据)

在前面的博客中没有使用到tsv文件,因为我找到的TopoJSON中本来就包含国家的名字。但是如果想要知道国家更多的数据仅仅知道国家的名字是不够的,因此还需要导入关于国家其他数据的tsv文件。当导入多个文件的时候最好使用Promis.all,这样就可以在文件全部都加载后再开始执行。需要将多个任务都放在一个数组里面,然后再在then中用一个数组接收读入的数据。

Promise.all([tsv('https://unpkg.com/world-atlas@1.1.4/world/50m.tsv'),json('https://cdn.jsdelivr.net/npm/world-atlas@2.0.2/countries-50m.json')
]).then(([tsvData, topsJSONdata]) => {}

为了快速处理tsv文件,我们使用reduce函数将其放到一个类中。其中iso_n3JSON文件中的id对应

const rowById = tsvData.reduce((accumulator, d)=>{accumulator[d.iso_n3] = d;return accumulator;}, {});//前面是reduce的执行,后面是accumulator的初始值

为了使得JSON文件中的每个元素都包含这个国家更多的信息,我们使用assign函数将同一个国家的信息进行合并

const countries = feature(topsJSONdata, topsJSONdata.objects.countries);// console.log(countries);countries.features.forEach(d => {Object.assign(d.properties, rowById[d.id]);});

Creating a loadAndProcessData module

上面载入数据的过程其实可以当作另一个模块,因此我们把上面的代码单独放在一个用于加载数据的文件中
loadAndProcessData.js

import {json, tsv} from 'd3';
import {feature} from 'topojson';export const loadAndProcessData = () => Promise.all([tsv('https://unpkg.com/world-atlas@1.1.4/world/50m.tsv'),json('https://cdn.jsdelivr.net/npm/world-atlas@2.0.2/countries-50m.json')
]).then(([tsvData, topsJSONdata]) => {const rowById = tsvData.reduce((accumulator, d)=>{accumulator[d.iso_n3] = d;return accumulator;}, {});const countries = feature(topsJSONdata, topsJSONdata.objects.countries);// console.log(countries);countries.features.forEach(d => {Object.assign(d.properties, rowById[d.id]);});return countries;});

并在index.js中将相应的代码都放在loadAndProcessData函数的then

Visualizing an ordered attribute with color

在得到国家的其他属性之后,我们就可以根据国家的其他标签给国家上色
我们可以首先观察一下tsv文件中都有什么。太多了这里就不显示了,比如说里面有一个标签是经济,我们不妨使用经济给不同国家不同的颜色。

为了方便修改标签,我们把获取数据属性的操作放到一个函数里,并且在后面所有的地方都通过这个函数获取属性,这样做的好处是如果我们不想要这个标签,我们只需要在这一个地方进行修改就可以。

我们使用scaleOrdinal来得到从标签到颜色的映射,对于标签我们需要进行一定的排序处理,而颜色区间d3有现成的函数可以让我们很方便的得到渐变的颜色从而区分不同的等级。

我们可以搜索d3-scale-chromatic,里面有很多函数。在这里我们选择schemeSpectral[k],这个k是标签分类的个数,我们可以直接得到:

const colorValue = d => d.properties.income_grpconst colorScale = scaleOrdinal().domain(countries.features.map(colorValue));colorScale.domain(colorScale.domain().sort().reverse()).range(schemeSpectral[colorScale.domain().length]);

制作好颜色标签以后就是在添加path的后面设置fill属性,我之前做的是随机选择一个颜色,这里就改为根据上面已经设置好的颜色尺得到对应的颜色。

Showing data from 2 attributes in tooltip

在得到好看的颜色以后,我们还希望对应的标签的内容可以改变,这一点很容易再到,只需要在设置text的时候加上对应的属性即可。

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

初步效果图如下:
在这里插入图片描述

Adding a color legend

我们还希望添加一个颜色图例,这样就可以很方便地知道什么颜色对应的是什么内容而不必要一一去看。根据上一节(数据可视化【十二】颜色图例和尺寸图例)我们制作的颜色图例,可以直接进行使用。
index.js

  colorLegendG.call(colorLegend, {colorScale,circleRadius: 8,spacing : 20,textOffset : 15,backgroundRectWidth: 250});

colorLegend.js中,图例有一个背景,通过添加一个矩形来实现

  const backgroundRect = selection.selectAll('rect').data([null]);const n = colorScale.domain().length;backgroundRect.enter().append('rect').merge(backgroundRect).attr('x', -circleRadius * 2).attr('y', -circleRadius * 2).attr('rx', circleRadius * 2).attr('width', backgroundRectWidth).attr('height', spacing * n + circleRadius * 3).attr('fill', 'white').attr('opacity', 0.8);

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

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

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

相关文章

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…

浏览器访问本地文件

之前一直苦恼无法在浏览器访问本地文件,尤其是写的网页需要调用外部数据的时候,今天学习到可以用python很方便的解决问题 如果有python3环境,直接在对应的文件夹下运行(这里是Ubuntu环境,如果是Windows应该在命令行也…

Ubuntu使用jupyter notebook +导出PDF

因为最近需要做数据分析的工作,所以复习了一下numpy和pandas,并安装了jupyter notebook进行数据分析,这里记录一下环境的设置。 ps:jupyter notebook真香 安装 python3 -m pip install --upgrade pip //升级pip pip3 install jupyter使用 …

SSH:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

给服务器重装了一下系统,结果报了上述错误: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! ...在网上找…