R语言:地图气泡图&根据经纬度为数据分省

R语言:地图气泡图&根据经纬度为数据分省

地图气泡图

参考 R语言 | 绘制中国地图,侵删

rm(list=ls())
library(ggplot2)
library(tidyverse)
library(sf)
library(terra)
library(ggspatial) #ggplot2的地图制作拓展包
library(tidyterra)

# 1. 准备地图
# 设置投影
crs_84 <- st_crs("EPSG:4326")  ## WGS 84 大地坐标 #st_crs 从sf或sfc对象检索坐标参考系
crs_al <- st_crs("+proj=aea +lat_1=25 +lat_2=47 +lon_0=105")

# 获取地图
china_map <-
  sf::st_read("https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json") %>%
  st_transform(crs_al) #st_transform 变换特征,或将星体对象中的栅格扭曲/重采样到新的坐标参考系

# 绘制中国地图框架
china <-
  china_map %>%
  st_make_valid() %>%
  st_union() %>%
  st_as_sf()

plot(china)

# 2. 准备经纬度数据
# 此处随机生成一组数据
set.seed(123)

# 生成随机的经度和纬度
longitude <- rnorm(50, 110, 4) - 4
latitude <- rnorm(50, 30, 3) + 2

# 生成随机的数值
values <- sample(1:50, 100, replace = TRUE)  # 从1到100中随机抽样,共生成100个数值

# 创建数据框
data <- data.frame(longitude, latitude, values)
# 将经纬度数据点投影到中国地图的投影坐标系中
data_points_sf <- st_as_sf(data, coords = c("longitude", "latitude"), crs = crs_84)
data_points_projected <- st_transform(data_points_sf, crs_al)

# 3.绘图
# 绘制大陆区域
p1 <- ggplot() +
  geom_sf(data = data_points_projected, aes(size = values), shape = 21, color = "white", fill = "yellow") +
  geom_sf(size = .2, fill = "transparent", color = "#060d1b", data = china_map) +
  scale_size_continuous(range = c(0.5,5), breaks = c(5, 10, 15, 20), labels = c("5 Mt/a", "10 Mt/a", "15 Mt/a", "20 Mt/a")) +
  theme_bw() +
  theme(legend.text = element_text(size = 6))
p1

# 截取南海诸岛
p2 <-p1 +
  coord_sf(crs = crs_84) + ## 将投影坐标转换为大地坐标
  scale_x_continuous(expand = c(0, 0), limits = c(107, 122), breaks = seq(70, 140, 10)) +
  scale_y_continuous(expand = c(0, 0), limits = c(2, 24), breaks = seq(10, 60, 10)) +
  guides(fill = "none", color = "none") +
  theme_bw() +
  theme(axis.text = element_blank(),
        axis.ticks = element_blank(),
        axis.title = element_blank())+
  guides(size = FALSE)
p2

# 图形拼接出图
p1 + coord_sf(crs = crs_al, default_crs = crs_84) +
  scale_x_continuous(expand = c(0, 0),limits=c(72,142),breaks=seq(70, 140, 10)) +
  scale_y_continuous(expand = c(0, 0),limits = c(17,55.5), breaks = seq(10, 60, 10)) +
  labs(fill="elevant",color="elevant")+
  annotation_scale(location = "bl",bar_cols = c("gray10", "white")) + # 设置距离刻度尺
  annotation_north_arrow(location="tl",style = north_arrow_nautical(
    fill = c("black","white"),
    line_col = "gray20")) +
  annotation_custom(ggplotGrob(p2),xmin=123,xmax=138.8,ymin=13.5,ymax=27)+
  labs(title = bquote("CO"[2] ~ "captured by CCUS in 2050"))+
  theme(axis.text = element_text(color="black") # 坐标轴标签颜色
        axis.title = element_blank(), # 去掉坐标轴标题
        legend.background=element_blank(), # 去除图例背景
        legend.position = c(1.01,0.95),legend.justification = c(1,1), # 调整图例位置
        legend.text = element_text(size = 6), # 图例文字大小
        legend.title = element_text(size = 10)) 

数据形式为n * 3 的dataframe:
在这里插入图片描述
以上代码作图得到:
在这里插入图片描述

根据经纬度获取省份

之前已经获得了地图和省份划分,因此可以直接获得粗略的位置信息,即每个点属于哪个省份,而不需要调用百度地图API。

# data <- data.frame(longitude, latitude, values)
# data_points_sf <- st_as_sf(data, coords = c("longitude", "latitude"), crs = crs_84)
# data_points_projected <- st_transform(data_points_sf, crs_al)

# 将之前投影过的数据与地图连接
data_points_with_province <- st_join(data_points_projected, china_map)
print(data_points_with_province)

连接后的表格,为每个点找到了对应的省份

# 求和作柱状图,数值由高到低排序
values_prov <- aggregate(data_points_with_province$values, by = list(data_points_with_province$name), sum)

ggplot(values_prov, aes(x = reorder(Group.1, -x), y = x)) +
  geom_bar(stat = "identity", fill = "#9370DB") +
  labs(title = "标题", x = "省份", y = "Y坐标轴")+
  theme_classic()+  theme(axis.text.x = element_text(angle = 30, hjust = 1))  # 将标签旋转45度,并且水平居中对齐
  • 16
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值