如何在R的Cleveland点图中调整不同物种间的间距?
调整Cleveland点图中物种间的间距
要实现同物种条目间距小、不同物种间距大的效果,直接用scale_y_discrete无法做到(离散轴的刻度间距是固定的),需要将y轴转换为连续变量,手动控制每个条目的位置。以下是具体步骤:
1. 预处理数据,创建自定义y轴位置列
先给每个物种组分配基准位置,再给同物种的两个条目添加小偏移量,确保同物种靠近、不同物种分开:
library(dplyr) library(stringr) # 处理数据,生成自定义y位置 seeds_sync <- seeds_sync %>% # 提取物种的基础名称(去掉末尾的点) mutate(spp_base = str_remove(spp, "\\.$")) %>% # 给每个基础物种分配基准y值 group_by(spp_base) %>% mutate(y_base = cur_group_id()) %>% # 给同物种的两个条目添加偏移量(0和0.2,可按需调整) mutate(y_pos = y_base + (row_number() - 1)*0.2) %>% ungroup()
2. 修改ggplot代码,使用连续y轴
把原代码中的y = spp替换为y = y_pos,并通过scale_y_continuous设置对应的刻度标签:
duracao_pheno_birds <- ggplot(seeds_sync, aes(x = com, y = y_pos, xend = fim, yend = y_pos, group = spp, color = factor(classe))) + geom_segment(size = 2) + geom_point(aes(color = factor(classe)), size = 3.5) + geom_point(aes(x = fim, y = y_pos, color = factor(classe)), size = 3.5) + labs(x = "Meses", y = "Espécies", color = "Categorias") + scale_color_manual(values = c("1" = "#6A0207", "2" = "#3B5708"), labels = c("Sementes coletadas", "Fenologia")) + scale_x_continuous(breaks = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), labels = c("A", "S", "O\n\n2022", "N", "D", "J", "F", "M\n\n 2023", "A", "M", "J", "J")) + # 设置y轴刻度和斜体标签,自动匹配每个条目的物种名称 scale_y_continuous(breaks = seeds_sync$y_pos, labels = lapply(seeds_sync$spp, function(sp) bquote(italic(.(str_remove(sp, "\\.$")))))) + theme_minimal() + theme(legend.position = "top", axis.text.y = element_text(size = 12), text = element_text(size = 14))
3. 调整间距的灵活方式
- 如果想让同物种的条目更靠近,减小偏移量(比如把
0.2改成0.1); - 如果想让不同物种之间的间距更大,修改基准y值的间隔(比如把
y_base = cur_group_id()改成y_base = cur_group_id() * 1.5)。
内容的提问来源于stack exchange,提问作者Hades Ina Matos
相关产品推荐
相关产品推荐

