当前位置: 首页 > news >正文

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'):调整图表的边缘空白。

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

相关文章:

R语言ggplot2包绘制网络地图

重要提示&#xff1a;数据和代码获取&#xff1a;请查看主页个人信息&#xff01;&#xff01;&#xff01; 载入R包 rm(listls()) pacman::p_load(tidyverse,assertthat,igraph,purrr,ggraph,ggmap) 网络节点和边数据 nodes <- read.csv(nodes.csv, row.names 1) edges…...

php获取今天凌晨零点的时间

不废话直接上代码 //使用strtotime $midnightToday strtotime("today midnight"); //输出&#xff1a;1716998400 //如果是明天 $midnightToday 86400 //后天 $midnightToday 86400*2//ORM中比对使用 $row ModelVisit::where(uid,$this->uid)->where(visi…...

CATIA进阶操作——创成式曲面设计入门(1)线架设计,三维点、直线、平面、曲线

目录 引出三维空间点生成三维直线三维平面三维曲线总结异形弹簧新建几何体草图编辑&#xff0c;画一条样条线进行扫掠&#xff0c;圆心和半径画出曲面上的螺旋线再次选择扫掠&#xff0c;圆心和半径 其他自定义信号和槽1.自定义信号2.自定义槽3.建立连接4.进行触发 自定义信号重…...

thinkphp6中怎么查看ThinkPHP版本号

<?php namespace app\controller; use app\BaseController; use think\app; //这句 class Index extends BaseController { public function test() { echo App::VERSION; //还有这句 } }...

第十二章 创建Web客户端

文章目录 第十二章 创建Web客户端SOAP向导的概述使用SOAP向导 第十二章 创建Web客户端 web客户端是访问web服务的软件。web客户端提供了一组代理方法&#xff0c;每个方法对应于web服务的一个方法。代理方法使用与它所对应的web服务方法相同的签名&#xff0c;并在被请求时调用…...

调试记录-RK平台用指令开启ADB功能

需求 嵌入式Linux系统调试过程中&#xff0c;为了方便&#xff0c;我们会借鉴Android调试的方法&#xff0c;在Linux系统添加adb功能&#xff0c;主要功能是通过USB线连接开发板和PC&#xff0c;实现两者之间传输文件&#xff0c;在PC上执行指令操作开发板。 实现 前提&…...

奇安信_NAC终端安全准入系统(相关问题整理)

奇安信终端安全准入系统 ,下称NAC 一、入网控制方式 1.IP流量控制 2.802.1X 准入 需要NAC、交换机、终端 以802.1X 3.DHCP 准入 将NAC作为DHCP服务器&#xff0c;为客户端分配地址&#xff0c;并对分配地址的客户端进行入网管控。 &#xff08;*&#xff09;可选 强制入网…...

在iPhone上恢复已删除的Safari历史记录的最佳方法

您是否正在寻找恢复 iPhone 上已删除的 Safari 历史记录的最佳方法&#xff1f;好吧&#xff0c;这篇文章提供了 4 种在有/无备份的情况下恢复 iPhone 上已删除的 Safari 历史记录的最佳方法。现在按照分步指南进行操作。 iPhone 上的 Safari 历史记录会被永久删除吗&#xff1…...

【设计模式深度剖析】【7】【结构型】【享元模式】| 以高脚杯重复使用、GUI中的按钮为例说明,并对比Java类库设计加深理解

&#x1f448;️上一篇:外观模式 | 下一篇:结构型设计模式对比&#x1f449;️ 设计模式-专栏&#x1f448;️ 目录 享元模式定义英文原话直译如何理解&#xff1f;字面理解例子&#xff1a;高脚杯的重复使用例子&#xff1a;GUI中的按钮传统方式使用享元模式 4个角色1. …...

OceanBase 内存研究(OceanBase 3.2.4.5)

内存结构 从官网的结构图可以看出&#xff0c;一台observer可使用的总内存(memory_limit)包括 系统内存(system_memory) 和 租户内存(sys租户与普通租户) 系统内存 系统内存system_memory 属于 observer 的内部内存&#xff0c;允许其它租户共享使用该内存资源 (root10.0.0.…...

麒麟系统 安装xrdp 远程桌面方法记录

一、安装环境 麒麟V10 2107 ft2000 麒麟V10 2107 x86_64 二、安装准备 使用《Kylin-Desktop-V10-Release-2107-arm64.iso》镜像 做好U盘启动系统后&#xff0c;需要安装一个远程桌面工具&#xff0c;可以多用户在windows上使用远程桌面访问麒麟系统。 目前在linux系统上较…...

解析Java中1000个常用类:SafeVarargs类,你学会了吗?

在 Java 编程中,泛型和可变参数(varargs)的结合使用可能会导致一些类型安全的问题。为了解决这些问题,Java 提供了 @SafeVarargs 注解。本文将详细介绍 @SafeVarargs 注解的定义、使用方法、应用场景以及其背后的原理,帮助读者深入理解并掌握这一重要特性。 什么是 @Safe…...

【数据挖掘】3σ原则识别数据中的异常值(附代码)

写在前面&#xff1a; 首先感谢兄弟们的订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…...

人眼是如何看到物体的

我在试图理解人眼如何观察到物体的&#xff0c;发现没有解释。本来我想这应该跟照相机照相的结果一样&#xff0c;但是发现&#xff0c;照相机也不对劲&#xff0c;没有理由能成像啊。 因为物体在散射光的时候&#xff0c;假设散射的光在局部是平行光&#xff0c;那么物体散射…...

vue打包时报错文件包过大

1.问题&#xff1a;npm run build 之后出现 2. 翻译之后意思就是某块过大 3. 解决办法&#xff1a;在vite.config.ts文件上添加 build: { chunkSizeWarningLimit: 1600, }, 4.最终打包...

预编码算法(个人总结)

引言 预编码算法是现代无线通信系统中的关键技术&#xff0c;特别是在多输入多输出&#xff08;MIMO&#xff09;系统中。它们通过在发送端对信号进行处理&#xff0c;减少干扰并提高信道容量。这种技术广泛应用于5G、Wi-Fi和卫星通信系统中。本教程将详细介绍预编码算法的背景…...

【重学C语言】十七、预处理指令

【重学C语言】十七、预处理指令 预处理指令预定义宏`#define` 宏定义示例注意事项特殊符号条件编译头文件包含`#pragma`预处理指令 C语言中的预处理指令(Preprocessor Directives)是一种特殊的指令,它们在编译过程的早期阶段(即实际编译之前)被预处理器(Preprocessor)处…...

SQL注入的危害和原理

在Web应用开发中&#xff0c;SQL注入是一种常见的安全漏洞&#xff0c;它允许攻击者通过注入恶意的SQL语句来执行非法操作&#xff0c;甚至获取敏感数据。本篇博客将详细解释SQL注入的危害和原理&#xff0c;并提供一些解决方案&#xff0c;以帮助新人快速理解并避免这种安全威…...

Unity2D横版摄像机跟随

在Unity2D横版游戏中&#xff0c;摄像机跟随是一个非常重要的功能。一个流畅的摄像机跟随系统可以让玩家更好地沉浸在游戏世界中。本文将介绍如何在Unity中实现2D横版摄像机跟随&#xff0c;并分享一些优化技巧。 一、准备工作 在开始实现摄像机跟随之前&#xff0c;请确保您…...

Practicing Version Control

Part A 新建一个文件夹Git&#xff0c;然后进入文件夹: Windows: 在这个文件夹中右键 > Open Git Bash hereMac: 运行终端&#xff0c;打cd 空格&#xff0c;然后将文件夹拖入终端&#xff0c;按 return 从 Github 上复制 HTTPS&#xff0c;然后 git clone https://githu…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)

目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 ​编辑​编辑 UDP的特征 socke函数 bind函数 recvfrom函数&#xff08;接收函数&#xff09; sendto函数&#xff08;发送函数&#xff09; 五、网络编程之 UDP 用…...

【WebSocket】SpringBoot项目中使用WebSocket

1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖&#xff0c;添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

轻量级Docker管理工具Docker Switchboard

简介 什么是 Docker Switchboard &#xff1f; Docker Switchboard 是一个轻量级的 Web 应用程序&#xff0c;用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器&#xff0c;使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献

Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译&#xff1a; ### 胃肠道癌症的发病率呈上升趋势&#xff0c;且有年轻化倾向&#xff08;Bray等人&#xff0c;2018&#x…...