如何让geom_line按0-15-30深度顺序绘制土壤剖面折线?
解决ggplot折线按指定深度顺序连接的问题
问题核心在于geom_line是按照数据框的行顺序连接点的,如果你的subset_data里Depth不是按0、15、30的顺序排列,折线就会出现乱序。下面给出两种解决方案,更推荐第二种(符合ggplot的tidy data规范):
方案一:直接排序现有宽格式数据
先给筛选后的数据集按Depth从小到大排序,再用原代码画图即可:
# 筛选数据并按Depth排序 subset_data <- subset(data, Core == "1", select = c(Depth, "16S_B", "16S_A")) subset_data <- subset_data[order(subset_data$Depth), ] # 原画图代码不变 ggplot(subset_data, aes(y = Depth)) + geom_line(aes(x = `16S_B`, color = "16S_B")) + geom_line(aes(x = `16S_A`, color = "16S_A")) + labs(x = "copies/g", y = "深度", color = "变量") + scale_color_manual(values = c("16S_B" = "blue", "16S_A" = "red")) + ggtitle("Core 1的16S_B和16S_A折线图") + scale_y_reverse(limits = c(31, 4)) + scale_x_log10()
方案二:转成tidy长格式(更推荐)
ggplot对长格式数据支持更友好,代码更简洁,后续扩展变量也更方便:
# 先加载tidyr包(未安装的话先运行install.packages("tidyr")) library(tidyr) # 筛选数据并转成长格式 subset_data <- subset(data, Core == "1", select = c(Depth, "16S_B", "16S_A")) long_data <- pivot_longer(subset_data, cols = c(`16S_B`, `16S_A`), names_to = "变量", values_to = "copies_g") # 按Depth排序,确保点的连接顺序正确 long_data <- long_data[order(long_data$Depth), ] # 画图(仅需一次geom_line) ggplot(long_data, aes(y = Depth, x = copies_g, color = 变量)) + geom_line() + labs(x = "copies/g", y = "深度", color = "变量") + scale_color_manual(values = c("16S_B" = "blue", "16S_A" = "red")) + ggtitle("Core 1的16S_B和16S_A折线图") + scale_y_reverse(limits = c(31, 4)) + scale_x_log10()
核心逻辑:只要让数据框的行按照你需要的深度顺序(0→15→30)排列,geom_line就会自动按该顺序连接点。转长格式能避免重复调用geom_line,是ggplot推荐的使用方式。
内容的提问来源于stack exchange,提问作者M.Cairó
相关产品推荐
相关产品推荐

