先前在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语言笔记
闲鱼号/淘宝号:小秋家的小卖铺