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)
这行代码将连接后得到的
lon
和lat
列重命名为x
和y
,这通常是为了绘图方便或符合后续处理的习惯。
inner_join(nodes %>% select(id, lon, lat), by = c('to' = 'id'))
类似于前面的操作,这次是将修改过的
edges
数据框再次与节点的经纬度信息进行内连接,但这次连接依据是edges
中的to
列与nodes
中的id
列。这样每条边的终点也被赋予对应节点的经纬度信息。
rename(xend = lon, yend = lat)
将第二次连接后得到的
lon
和lat
列重命名为xend
和yend
,为绘制起点到终点的直线做准备。
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(...)
映射到category
和weight
字段。曲线的弯曲度为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_x
和nudge_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'))
这段代码相较于前一段代码有以下几个主要修改和增加:
多边形层 (
geom_polygon
):
增加了
fill = region
属性到aes
函数中,这表示多边形的填充颜色现在是基于region
字段动态变化的,而不是固定的灰色。修改了边框颜色为黑色。
增加了
show.legend = F
,这表示不显示图例,之前的代码中默认可能显示图例。曲线层 (
geom_curve
):
去除了曲线的颜色通过
aes
动态映射,而是设置成了统一的黑色。去除了曲线宽度的动态映射,只保留了基于
weight
的大小映射。坐标系 (
coord_fixed
):
增加了
xlim
和ylim
参数,这用于设置X轴和Y轴的显示范围,可以用于聚焦到地图的特定部分。主题设置 (
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包绘制网络地图
重要提示:数据和代码获取:请查看主页个人信息!!! 载入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"); //输出:1716998400 //如果是明天 $midnightToday 86400 //后天 $midnightToday 86400*2//ORM中比对使用 $row ModelVisit::where(uid,$this->uid)->where(visi…...

CATIA进阶操作——创成式曲面设计入门(1)线架设计,三维点、直线、平面、曲线
目录 引出三维空间点生成三维直线三维平面三维曲线总结异形弹簧新建几何体草图编辑,画一条样条线进行扫掠,圆心和半径画出曲面上的螺旋线再次选择扫掠,圆心和半径 其他自定义信号和槽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客户端提供了一组代理方法,每个方法对应于web服务的一个方法。代理方法使用与它所对应的web服务方法相同的签名,并在被请求时调用…...

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

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

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

【设计模式深度剖析】【7】【结构型】【享元模式】| 以高脚杯重复使用、GUI中的按钮为例说明,并对比Java类库设计加深理解
👈️上一篇:外观模式 | 下一篇:结构型设计模式对比👉️ 设计模式-专栏👈️ 目录 享元模式定义英文原话直译如何理解?字面理解例子:高脚杯的重复使用例子:GUI中的按钮传统方式使用享元模式 4个角色1. …...

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

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

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

【数据挖掘】3σ原则识别数据中的异常值(附代码)
写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 路虽远,行则将至&#…...

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

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

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

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

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

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

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

新宏观范式和产业趋势下,纷享销客如何助力企业出海?
出海,已不再是企业的“备胎”,而是必须面对的“大考”!在这个全球化的大潮中,有的企业乘风破浪,勇攀高峰,也有的企业在异国他乡遭遇了“水土不服”。 面对“要么出海,要么出局”的抉择ÿ…...

安装zookeeper
一、搭建前准备 192.168.1.99 sdw1 192.168.1.98 sdw2 192.168.1.97 sdw3 二、搭建 1、各主机修改/etc/hosts,/etc/hostname文件 /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhos…...

深入分析 Android Activity (二)
文章目录 深入分析 Android Activity (二)1. Activity 的启动模式(Launch Modes)1.1 标准模式(standard)1.2 单顶模式(singleTop)1.3 单任务模式(singleTask)1.4 单实例模式…...

数据结构——经典链表OJ(二)
乐观学习,乐观生活,才能不断前进啊!!! 我的主页:optimistic_chen 我的专栏:c语言 点击主页:optimistic_chen和专栏:c语言, 创作不易,大佬们点赞鼓…...

文件IO(三)
文件IO(三) 左移右移Linux的man 手册文件IO打开文件操作文件关闭文件 caps lock开灯关灯读取按键文件IO操作目录文件打开目录文件操作目录文件 库动态库和静态库的优缺点创建静态库创建动态库 按下右ctrl键 亮灭灯 左移右移 Linux的man 手册 文件IO 打开…...

单实例11.2.0.3迁移到RAC11.2.0.4_使用RMAN 异机恢复
保命法则:先备份再操作,磁盘空间紧张无法备份就让满足,给自己留退路。 场景说明: 1.本文档的环境为同平台、不同版本(操作系统版本可以不同,数据库小版本不同),源机器和目标机器部…...

JavaScript第四讲:函数,作用域,运算符
前言 在JavaScript的广阔天地中,函数、作用域、算术运算符和逻辑运算符是构成代码世界的基石。它们各自扮演着不同的角色,却又紧密相连,共同编织出丰富多彩的程序逻辑。无论是编写一个简单的网页交互,还是构建一个复杂的应用程序…...

IDEA中,MybatisPlus整合Spring项目的基础用法
一、本文涉及的知识点【重点】 IDEA中使用MybatisPlus生成代码,并使用。 Spring整合了Mybatis框架后,开发变得方便了很多,然而,Mapper、Service和XML文件,在Spring开发中常常会重复地使用,每一次的创建、修…...

从不同角度看如何让大模型变得更聪明呢?
算法创新,从代码上优化大模型,可以采取一系列策略来提升其性能和效率。 算法优化:对模型的算法进行精细调整,如改进神经网络架构,使用更高效的层(如深度可分离卷积),或者优化递归神经…...

Buffer Pool运行机制理解
Buffer Pool机制理解 一、为什么使用Buffer Pool? 众所周知,磁盘数据是以数据页的形式来去读取的,一个数据页默认大小 16K,也就是说你本意只想读取一行数据,但是它会给你加载一页的数据到buffer pool里面。这样的话就…...