如何在ggplot热力图中按Haul 1的Percent值降序排列Species轴
按指定分组数值排序ggplot热力图Y轴物种
要实现仅基于Haul 1的Percent值降序排列Y轴的Species,不能直接用reorder()(它默认会计算每个Species所有Percent值的均值来排序),需要先提取Haul=1对应的数值确定排序顺序,再将Species转为因子指定水平。
解决步骤
提取Haul=1对应的Species排序顺序
从数据集中筛选Haul为1的行,按Percent降序排列后提取Species名称:# 先加载dplyr,未安装则先执行install.packages("dplyr") library(dplyr) sorted_species <- data[data$Haul == 1, ] %>% arrange(desc(Percent)) %>% pull(Species)运行后
sorted_species结果为c("b", "c", "d", "a"),完全符合你的期望顺序。应用排序规则绘制热力图
有两种方式可以应用这个排序:- 方法一:提前修改数据集
将原数据的Species列转为指定水平的因子,再用你原本的ggplot代码绘制:data$Species <- factor(data$Species, levels = sorted_species) ggplot(data, aes(Haul, Species)) + geom_tile(aes(fill = Percent)) + scale_fill_gradient(low = "white", high = "red") + labs(fill = "% Sites")+ theme_bw() - 方法二:直接在ggplot中指定
无需修改原数据集,直接在aes参数中设置因子水平:ggplot(data, aes(Haul, factor(Species, levels = sorted_species))) + geom_tile(aes(fill = Percent)) + scale_fill_gradient(low = "white", high = "red") + labs(fill = "% Sites", y = "Species")+ theme_bw()
- 方法一:提前修改数据集
你的原始数据与代码
数据集构造代码
Species = rep(c("a","b","c","d"),3) Haul = rep(c(1,2,3),4) Percent = c(25,0,25,50,25,0,75,0,50,100,0,50) data = data.frame(Species, Haul, Percent)
原尝试代码的问题
你之前用reorder(Species, Percent)时,它会对每个Species的所有Percent值取均值来排序:
- a的均值:(25+25+100)/3 = 50
- b的均值:(0+0+0)/3 = 0
- c的均值:(25+75+0)/3 ≈ 33.33
- d的均值:(50+50+50)/3 = 50
最终排序为b、c、a/d,自然不符合仅用Haul1数值排序的需求。
内容的提问来源于stack exchange,提问作者elisemillar
相关产品推荐
相关产品推荐

