R语言ggplot2包绘制网络地图

重要提示:数据和代码获取:请查看主页个人信息!!!

载入R包

rm(list=ls())
pacman::p_load(tidyverse,assertthat,igraph,purrr,ggraph,ggmap)

网络节点和边数据

nodes <- read.csv('nodes.csv', row.names = 1)
edges <- read.csv('edges.csv', row.names = 1)

节点数据权重计算

g <- graph_from_data_frame(edges, directed = FALSE, vertices = nodes)
nodes_for_plot <- nodes %>% mutate(weight = degree(g))

网络边和地图经纬度数据整理

edges_for_plot <- edges %>%inner_join(nodes %>% select(id, lon, lat), by = c('from' = 'id')) %>%rename(x = lon, y = lat) %>%inner_join(nodes %>% select(id, lon, lat), by = c('to' = 'id')) %>%rename(xend = lon, yend = lat) %>% mutate(category = as.factor(category))

edges_for_plot <- edges %>%

  • 这行代码开始了一个管道操作,将 edges 数据框作为输入。edges 数据框应该包含图中的边的信息,例如每条边的起点和终点。

inner_join(nodes %>% select(id, lon, lat), by = c('from' = 'id'))

  • nodes %>% select(id, lon, lat) 首先从 nodes 数据框中选择 id(节点标识符)、lon(经度)、lat(纬度)这三列。

  • inner_join 函数将 edges 数据框与上述选择的节点数据进行内连接。连接的依据是 edges 中的 from 列与 nodes 中的 id 列相匹配,这样每条边的起点都会被赋予对应节点的经纬度信息。

rename(x = lon, y = lat)

  • 这行代码将连接后得到的 lonlat 列重命名为 xy,这通常是为了绘图方便或符合后续处理的习惯。

inner_join(nodes %>% select(id, lon, lat), by = c('to' = 'id'))

  • 类似于前面的操作,这次是将修改过的 edges 数据框再次与节点的经纬度信息进行内连接,但这次连接依据是 edges 中的 to 列与 nodes 中的 id 列。

  • 这样每条边的终点也被赋予对应节点的经纬度信息。

rename(xend = lon, yend = lat)

  • 将第二次连接后得到的 lonlat 列重命名为 xendyend,为绘制起点到终点的直线做准备。

mutate(category = as.factor(category))

  • 这行代码使用 mutate 函数将 category 列转换为因子(factor)类型。因子类型在 R 中用于表示分类变量,这可能是为了在绘图或分析时处理边的类别。

ggplot2出图

ggplot(nodes_for_plot) + geom_polygon(aes(x = long, y = lat, group = group),data = map_data('world'),fill = "#CECECE", color = "#515151",size = 0.15) +geom_curve(data = edges_for_plot, aes(x = x, y = y, xend = xend, yend = yend, # draw edges as arcscolor = category, size = weight),curvature = 0.33,alpha = 0.5) +scale_size_continuous(guide = FALSE, range = c(0.25, 2)) + # scale for edge widthsgeom_point(aes(x = lon, y = lat, size = weight),           # draw nodesshape = 21, fill = 'white',color = 'black', stroke = 0.5) +scale_size_continuous(guide = FALSE, range = c(1, 6)) +    # scale for node sizegeom_text(aes(x = lon, y = lat, label = name),             # draw text labelshjust = 0, nudge_x = 1, nudge_y = 4,size = 3, color = "white", fontface = "bold") +coord_fixed() 

 

基础图层

  • ggplot(nodes_for_plot): 初始化一个ggplot对象,可能包含一些特定点的节点数据。

  • geom_polygon(...): 添加一个多边形层,这里是使用了世界地图的数据。aes(x = long, y = lat, group = group)设置了多边形的坐标和分组。填充颜色设为灰色#CECECE,边界颜色设为深灰#515151,边界宽度为0.15。

曲线层

  • geom_curve(...): 添加曲线层,用于绘制边缘或连接线,具体数据来自edges_for_plot。这里曲线的颜色和宽度通过aes(...)映射到categoryweight字段。曲线的弯曲度为0.33,透明度为0.5。

边缘宽度的比例尺

  • scale_size_continuous(guide = FALSE, range = c(0.25, 2)): 设置曲线宽度的连续比例尺,范围从0.25到2,不显示图例。

点层

  • geom_point(...): 添加点层,用于绘制节点。节点位置通过aes(x = lon, y = lat)设置,大小通过weight控制。点的形状设为21(带边框的圆形),填充颜色为白色,边框颜色为黑色,边框宽度为0.5。

节点大小的比例尺

  • scale_size_continuous(guide = FALSE, range = c(1, 6)): 设置节点大小的连续比例尺,范围从1到6,不显示图例。

文本层

  • geom_text(...): 添加文本层,用于绘制节点旁的文本标签。文本位置通过微调nudge_xnudge_y设置,水平对齐hjust = 0(左对齐)。文本大小为3,颜色为白色,字体加粗。

坐标系

  • coord_fixed(): 设置一个固定比例的坐标系,确保纬度和经度的比例一致,通常用于地图数据以保持比例正确。

这段代码的整体作用是在世界地图上绘制节点和节点间的连接线,并且附加文本标签,适用于展示网络、路径或者其他地理相关的数据。

映射颜色

ggplot(nodes_for_plot) + geom_polygon(aes(x = long, y = lat, group = group, fill = region), show.legend = F,data = map_data('world'),color = "black",size = 0.15) +geom_curve(data = edges_for_plot, aes(x = x, y = y, xend = xend, yend = yend, # draw edges as arcssize = weight),color = 'black', curvature = 0.33,alpha = 0.5) +scale_size_continuous(guide = FALSE, range = c(0.25, 2)) + # scale for edge widthsgeom_point(aes(x = lon, y = lat, size = weight),           # draw nodesshape = 21, fill = 'white',color = 'black', stroke = 0.5) +scale_size_continuous(guide = FALSE, range = c(1, 6)) +    # scale for node sizegeom_text(aes(x = lon, y = lat, label = name),             # draw text labelshjust = 0, nudge_x = 1, nudge_y = 4,size = 3, color = "white", fontface = "bold") +coord_fixed(xlim = c(-150, 180), ylim = c(-55, 80)) + theme(panel.grid = element_blank()) +theme(axis.text = element_blank()) +theme(axis.ticks = element_blank()) +theme(axis.title = element_blank()) +theme(legend.position = "right") +theme(panel.grid = element_blank()) +theme(panel.background = element_rect(fill = "#596673")) +theme(plot.margin = unit(c(0, 0, 0.5, 0), 'cm'))

这段代码相较于前一段代码有以下几个主要修改和增加:

  1. 多边形层 (geom_polygon):

    • 增加了fill = region属性到aes函数中,这表示多边形的填充颜色现在是基于region字段动态变化的,而不是固定的灰色。

    • 修改了边框颜色为黑色。

    • 增加了show.legend = F,这表示不显示图例,之前的代码中默认可能显示图例。

  2. 曲线层 (geom_curve):

    • 去除了曲线的颜色通过aes动态映射,而是设置成了统一的黑色。

    • 去除了曲线宽度的动态映射,只保留了基于weight的大小映射。

  3. 坐标系 (coord_fixed):

    • 增加了xlimylim参数,这用于设置X轴和Y轴的显示范围,可以用于聚焦到地图的特定部分。

  4. 主题设置 (theme):

    • 新增多个

      theme

      函数调用,用于定制图表的美观性和可读性:

      • panel.grid = element_blank():去除背景的网格线。

      • axis.text = element_blank()和其他相关axis设置:去除坐标轴的文本、刻度、标题等元素,使图表更为简洁。

      • legend.position = "right":设置图例位置在右侧。

      • panel.background = element_rect(fill = "#596673"):设置面板背景颜色为深灰蓝色。

      • plot.margin = unit(c(0, 0, 0.5, 0), 'cm'):调整图表的边缘空白。

数据和代码获取:请查看主页个人信息

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

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

相关文章

5.29工效学-人因工程人机交互

对于工效学这门课&#xff0c;一直都感觉很有意思&#xff0c;是一个值得再认真一点的课。可惜上课的时候效率不高&#xff0c;有感兴趣的东西课后也没有自行去拓展开来&#xff0c;前面的课我感觉还讲了比较重要的东西&#xff0c;但是&#xff0c;全忘了呢&#xff08;真的对…

Llama改进之——分组查询注意力

引言 今天介绍LLAMA2模型引入的关于注意力的改进——分组查询注意力(Grouped-query attention,GQA)1。 Transformer中的多头注意力在解码阶段来说是一个性能瓶颈。多查询注意力2通过共享单个key和value头&#xff0c;同时不减少query头来提升性能。多查询注意力可能导致质量下…

民国漫画杂志《时代漫画》第38期.PDF

时代漫画38.PDF: https://url03.ctfile.com/f/1779803-1248636380-dd7daa?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

Webrtc支持HEVC之FFMPEG支持HEVC编解码(一)

一、前言 Webrtc使用的FFMPEG(webrtc\src\third_party\ffmpeg)和官方的不太一样,使用GN编译,各个平台使用了不一样的配置文件 以Windows为例,Chrome浏览器也类似 二、修改配置文件 windows:chromium\config\Chrome\win\x64 其他平台: chromium\config\Chrome\YOUR_SYS…

基础—SQL—DQL(数据查询语言)分组查询

一、引言 分组查询的关键字是&#xff1a;GROUP BY。 二、DQL—分组查询 1、语法 SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组后过滤条件 ]; 注意&#xff1a; 1、[ ] 里的内容可以有可以没有。 2、这条SQL语句有两块指定条件的地方&#…

CSS Canvas鼠标点击特效之天女散花(文本粒子动画)

1.效果 2.代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><style>body,html {margin: 0;padding: 0;wi…

【SQL学习进阶】从入门到高级应用【三范式】

文章目录 什么是数据库设计三范式三范式一对多怎么设计多对多怎么设计一对一怎么设计最终的设计 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f495;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01; &#x1f495;希望您在这里可以感受到一份…

微信小程序-页面配置

一、页面配置文件的作用 小程序中&#xff0c;每个页面都有自己的.json配置文件&#xff0c;用来对当前页面的窗口外观、页面效果等进行配置 二、页面配置和全局配置的关系 小程序中&#xff0c;app.json中的window节点&#xff0c;可以全局配置小程序中每个页面的窗口表现 …

牛客网刷题 | BC105 菱形图案

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 KiKi学习了循环&am…

Facebook代运营 | Facebook广告投放步骤及要点

Facebook体量大&#xff0c;素材的更新频率快&#xff0c;通过Facebook进行广告投放的用户也越来越多&#xff0c;Facebook坐拥大量用户&#xff0c;同时有着非常科学的用户画像构建系统和推送机制&#xff0c;对于很多广告涉足的伙伴来说&#xff0c;更加的友好。 1. 创建广告…

「计网」网络初识

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;计网 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 网络初识 &#x1f349;IP 地址 & 端口号&#x1f349;网络协议&#x1f34c;TCP/IP 网络协议 &#x1f349;封装和分用&#x1f349…

数据隐私新篇章:Facebook如何保护用户信息

随着数字化时代的到来&#xff0c;数据隐私保护成为了社交媒体平台和用户共同关注的焦点。作为全球最大的社交网络之一&#xff0c;Facebook一直致力于保护用户的隐私和数据安全。本文将深入探讨Facebook在数据隐私保护方面的措施和实践&#xff0c;以及其如何开启数据隐私的新…

领域建模(系统操作复习)

习题 问题 考察点 领域建模 识别概念类 固定模板 Conceptual Class Category Examples specifications,designs, or descriptions of things roles of people containers of other things things in a container abstract noun concepts organizations events processes (…

车载电子电器架构 —— 智能座舱技术范围(万字长文精讲)

车载电子电器架构 —— 智能座舱技术范围 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

0基础认识C语言(理论+实操3)

所有籍籍无名的日子里 我从未看轻自己半分 小伙伴们&#xff0c;一起开始我们今天的话题吧 一、算法操作符 1.双目操作符 为何叫双目操作符呢&#xff1f;其实是因为我们进行加减乘除的时候&#xff0c;至少得需要两个数字进行这些运算&#xff0c;而这个数字就被称为操作数…

算法题解记录27+++随机链表的复制(百日筑基)

一、题目描述&#xff1a; 题目难度&#xff1a;中等 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每…

Leetcode - 周赛399

目录 一&#xff0c;3162. 优质数对的总数 I 二&#xff0c;3163. 压缩字符串 III 三&#xff0c;3164. 优质数对的总数 II 四&#xff0c; 3165. 不包含相邻元素的子序列的最大和 一&#xff0c;3162. 优质数对的总数 I 假设 x 是 nums1 数组中的值&#xff0c;y 是 nums2…

WebGL实现医学教学软件

使用WebGL实现医学教学软件是一个复杂但非常有益的项目&#xff0c;可以显著提升医学教育的互动性和效果。以下是详细的实现步骤&#xff0c;包括需求分析、技术选型、开发流程和注意事项。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作…

Python自动实时查询预约网站的剩余名额并在有余额时发邮件提示

本文介绍基于Python语言&#xff0c;自动、定时监测某体检预约网站中指定日期的体检余额&#xff0c;并在有体检余额时自动给自己发送邮件提醒的方法。 来到春招末期&#xff0c;很多单位进入了体检流程。其中&#xff0c;银行&#xff08;尤其是四大行&#xff09;喜欢“海检”…

404.左叶子之和

计算给定二叉树的所有左叶子之和。 示例&#xff1a; 思路&#xff1a; 通过父节点来判断七子节点是不是我们要收集的元素。因为如果遍历到孩子节点&#xff0c;我们无法判断它是左孩子还是右孩子。 后序遍历&#xff0c;左右中。 判断当前节点是不是左叶子是无法判断的&…