6. 世界地图叠加饼图

先前在isme j上看见了这个地图,想用R试着做一下


经过不屑努力

最终效果如下:

虽谈不上完美复现,但也很接近,需要手动修一修解决饼图重叠的情况
下面是完整代码:
 

library(readxl)
library(albersusa)
library(biscale)
library(sf)
library(tidyverse)
library(hrbrthemes)
library(ggtext)
library(scatterpie)
library("ggsci")
library(extrafont)
#读入虚构数据
data_test <- read_excel("坐标esmj.xlsx")
data_test <- data_test %>% 
  filter(grepl("SRF", `Sample label`))
data_test <- data_test %>%
  select(1, 5, 6, 12:16)
library(ggplot2)
library(maps)
p <- ggplot() + 
  geom_polygon(data=map_data('world'), aes(x=long, y=lat, group=group), fill='gray40') +  
  theme(panel.grid.major = element_blank(),  # 去除主要网格线
        panel.grid.minor = element_blank(),  # 去除次要网格线
        panel.background = element_blank(),  # 去除背景填充
        panel.border = element_rect(colour = "black", fill=NA, size=1),  # 添加边框
        axis.line = element_line(color = "black")) +  # 确保轴线可见
  scale_x_continuous(breaks=c(-180,-120, -60, 0, 60, 120, 180), expand=c(0,0),
                     labels=c('180°','120°W','60°W','0','60°E','120°E','180°'))+  
  scale_y_continuous(breaks=c(-60, -30, 0, 30, 60),expand=c(0, 0),
                     labels=c('60°S','30°S','0','30°N','60°N'))+  
  labs(x='Longitude',y='Latitude')

print(p)

#可视化绘制
p=p + 
  scatterpie::geom_scatterpie(data = data_test,
                              aes(x = Long, y = Lat, r = log(abundant+1)*2 , fill = factor(c("MPP-A", "MPP-B", "MPP-C", "P-RSP2"))),
                              cols = c("MPP-A", "MPP-B", "MPP-C", "P-RSP2"),
                              alpha = 1, 
                              color = "white",  # 设置饼图边缘为白色
                              size = 0.5) +  # 设置饼图边框的大小
  scale_fill_manual(name = "", 
                    values = c("MPP-A" = "pink", "MPP-B" = "skyblue", "MPP-C" = "orange", "P-RSP2" = "grey")) +
  theme(plot.title = element_markdown(hjust = 0.5, vjust = .5, color = "black", size = 20, margin = margin(t = 1, b = 12)),
        plot.subtitle = element_markdown(hjust = 0, vjust = .5, size = 15),
        plot.caption = element_markdown(face = 'bold', size = 12),
        panel.grid.major = element_blank(),  # 去除主要网格线
        panel.grid.minor = element_blank(),  # 去除次要网格线
        panel.background = element_blank(),  # 去除背景填充
        panel.border = element_rect(colour = "black", fill=NA, size=1),  # 添加边框
        axis.line = element_line(color = "black"),
        axis.text = element_text(face = "bold", family="serif", size = 12, color = 'black'),
        axis.title = element_text(face = "bold", family="serif", size = 15))

# 添加一个实际的圆
# 修正后的用于图例的数据框
legend_data <- data.frame(
  x0 = rep(-120, 4),  # 经度设置为 -70
  y0 = c(-55, -60, -65, -70),  # 不同的纬度值以避免重叠,并使得每个点在图例显示时都可见
  size = c(log(2), log(11),log(51),log(101))  # 想要在图例中表示的圆的实际半径值
)


p <- p +
  geom_point(data = legend_data, aes(x = x0, y = y0, size = size), alpha = 1, color = "gray40") + 
  scale_size_continuous(name = "KPKG",
                        breaks = c(log(2), log(11),log(51),log(101)),
                        labels = c("1", "10", "50", "100"),
                        range = c(log(2)*4, log(101)*4)) +
  coord_fixed() +
  theme(legend.background = element_rect(fill = "transparent"),  # 设置图例背景为透明
        legend.key = element_rect(fill = "transparent", colour = NA))  # 设置图例项背景为透明

# 显示图表
print(p)


ggsave("ismej.pdf", plot = last_plot(), width = 12, height = 9)
  

值得注意的是,地图上饼图的图例我是通过生成圆,来形成的,最后通过wpsPDF编辑删掉了那四个圆。对KPKG的处理也是通过log(x+1)*2处理的,和原文有出入,然而原文并没有说明如何转换的,我们只能猜测。
下面是data_test(经过列筛选过后)的格式 :abundant表示KPKG,最后四列代表四个类群的相对丰度。

关注我,以后的内容更精彩哦。
另外如有错误欢迎指正!
b站号:羽球最强生信

微信公众号:小秋的R语言笔记

闲鱼号/淘宝号:小秋家的小卖铺

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值