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.mzph.cn/bicheng/20821.shtml

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

相关文章

【Python技术】AI编程新手快速入门学习LangChain大模型框架

如果我们要搞AI智能体&#xff0c;普通人一般 借助腾讯元器、 coze、KIMI 或者其他大平台搞一搞&#xff0c;比如我配置的coze智能体在微信公众号聊天。 对于程序员来说&#xff0c;一言不合就喜欢搞代码。 前面文章也介绍了不少关于AI知识库问答&#xff0c;AIagent 不少开源…

指纹采集技术

目录 1.概述 1.1 捺印油墨采集 1.2 现场指纹提取 1.3 在线指纹采集 2. 指纹采集器的关键技术指标 2.1 采集面积 2.2 分辨率 2.3 图像质量 2.4 耐用性 1.概述 最早的指纹采集技术是油墨法&#xff0c;至少已经有上百年的历史。1990年代出现了活体指纹采集器&#xff0c…

大数据测试/ETL开发,如何造测试数据

相信很多的小伙伴&#xff0c;有些是大数据测试岗位&#xff0c;有些是ETL开发&#xff0c;都面临着如何要造数据的情况。 1&#xff0c;造数背景 【大数据测试岗位】&#xff0c;比较出名的就是宁波银行&#xff0c;如果你在宁波银行做大数据开发&#xff0c;对着需求开发完…

数学建模 —— 层次分析法(2)

目录 一、层次分析法&#xff08;AHP&#xff09; 二、构造比较判断矩阵 2.1 两两比较法 三、单准则下的排序及一致检验 3.1 单准则下的排序 3.2 一致性检验 四、层次总排序 4.1 层次总排序的步骤 4.2 总排序一致性检验 一、层次分析法&#xff08;AHP&#xff09; 方…

xdp、dpdk、rdma能在同一网卡上同时使用吗?

文心一言 XDP、DPDK和RDMA是三种不同的技术&#xff0c;它们各自在Linux网络性能优化中扮演了不同的角色。关于它们能否在同一网卡上同时使用&#xff0c;我们需要考虑以下几个方面&#xff1a; XDP&#xff08;eXpress Data Path&#xff09;&#xff1a; XDP是Linux内核提供…

SVM算法-非线性分类背后技术详解

引言 支持向量机&#xff08;SVM&#xff09;是一种强大的监督学习算法&#xff0c;广泛应用于分类和回归任务中。本文将详细介绍SVM算法在非线性分类任务中的应用&#xff0c;并通过代码示例来展示其背后的技术精髓。我们将分三大部分来展开&#xff0c;本部分将重点介绍SVM算…

【C++面试50题】

以下是针对C程序员面试可能遇到的一些问题&#xff0c;涵盖了从基础语法、面向对象、STL、内存管理、模板、异常处理、并发编程等多个方面。 ### 基础概念与语法 1. C与C的主要区别是什么&#xff1f; 2. 什么是构造函数和析构函数&#xff1f;它们何时被调用&#xff1f; 3. 什…

17、Spring系列-SpringMVC-请求源码流程

前言 Spring官网的MVC模块介绍&#xff1a; Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;从一开始就已包含在Spring框架中。正式名称“ Spring Web MVC”来自其源模块的名称&#xff08;spring-webmvc&#xff09;&#xff0c;但它通常被称为“ Spring MVC…

[AI Google] 三种新方法利用 Gemini 提高 Google Workspace 的生产力

Workspace 侧边栏中的 Gemini 现在将使用 Gemini 1.5 Pro&#xff0c;新的 Gemini for Workspace 功能即将登陆 Gmail 移动应用&#xff0c;等等。 Gemini for Google Workspace 帮助个人和企业更好地利用 Google 应用——从在 Gmail 中撰写邮件到在 Sheets 中组织项目计划。过…

glpi 安装与使用

1、环境介绍 操作系统&#xff1a;龙蜥os 8.9 nginx&#xff1a;1.26.1 php&#xff1a;8.2.19 mysql&#xff1a;MarinaDB 10.3.9 glpi&#xff1a;10.0.6 fusioninventory&#xff1a;fusioninventory-10.0.61.1 2、安装epel源 dnf install epel-release -y dnf install htt…

Python | Leetcode Python题解之第125题验证回文串

题目&#xff1a; 题解&#xff1a; class Solution:def isPalindrome(self, s: str) -> bool:n len(s)left, right 0, n - 1while left < right:while left < right and not s[left].isalnum():left 1while left < right and not s[right].isalnum():right - …

2010-2015 年阿拉斯加北坡苔原植物功能类型连续覆盖图

ABoVE: Tundra Plant Functional Type Continuous-Cover, North Slope, Alaska, 2010-2015 2010-2015 年阿拉斯加北坡苔原植物功能类型连续覆盖图 简介 文件修订日期&#xff1a;2021-08-27 数据集版本: 1 摘要 该数据集以 30 米的分辨率提供了阿拉斯加北坡约 12.5 万平方…

【RuoYi】实现文件的上传与下载

一、前言 首先&#xff0c;最近在做一个管理系统&#xff0c;里面刚好需要用到echarts图和富文本编辑器&#xff0c;然后我自己去看了官网觉得有点不好懂&#xff0c;于是去B站看来很多视频&#xff0c;然后看到了up主【程序员青戈】的视频&#xff0c;看了他讲的echarts图和富…

利用Python处理DAX多条件替换

小A&#xff1a;白茶&#xff0c;救命啊~~~ 白茶&#xff1a;什么情况&#xff1f; 小A&#xff1a;是这样的&#xff0c;最近不是临近项目上线嘛&#xff0c;有一大波度量值需要进行类似的调整&#xff0c;一个两个倒没啥&#xff0c;600多个&#xff0c;兄弟&#xff0c;救命…

从JS角度直观理解递归的本质

让我们写一个函数 pow(x, n)&#xff0c;它可以计算 x 的 n 次方。换句话说就是&#xff0c;x 乘以自身 n 次。 有两种实现方式。 迭代思路&#xff1a;使用 for 循环&#xff1a; function pow(x, n) {let result 1;// 在循环中&#xff0c;用 x 乘以 result n 次for (let i…

opencv进阶 ——(九)图像处理之人脸修复祛马赛克算法CodeFormer

算法简介 CodeFormer是一种基于AI技术深度学习的人脸复原模型&#xff0c;由南洋理工大学和商汤科技联合研究中心联合开发&#xff0c;它能够接收模糊或马赛克图像作为输入&#xff0c;并生成更清晰的原始图像。算法源码地址&#xff1a;https://github.com/sczhou/CodeFormer…

如何快速找到 RCE

背景介绍 本文将分享国外白帽子在‘侦察’阶段如何快速发现 RCE 漏洞的经历。以Apache ActiveMQ 的 CVE-2023–46604 为特例&#xff0c;重点介绍如何发现类似此类的漏洞&#xff0c;让我们开始吧。 快速发现过程 在‘侦察’阶段&#xff0c;白帽小哥会保持每周更新一次目标…

1940java swing零售库存管理系统myeclipse开发Mysql数据库CS结构java编程

一、源码特点 java swing 零售库存管理系统 是一套完善的窗体设计系统&#xff0c;对理解SWING java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;&#xff0c;系统主要采用C/S模式开发。 应用技术&#xff1a;javamysql 开发工具&#xff1a;…

适合技术小白学习的项目1863java在线视频网站系统 Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java在线视频网站系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。 开发环境为TOMCAT7.0,Myeclipse8.5开发…

数据库、数据表的基本操作

1.数据库的基本操作 &#xff08;1&#xff09;创建数据库 &#xff08;2&#xff09;删除数据库 &#xff08;3&#xff09;将数据库的字符集修改为gbk gbk是汉字内码扩展规范&#xff0c;是GB2312和GB13000的扩展&#xff0c;主要用于简体中文。 &#xff08;4&#xff09;…