[英]Plotting points with error bars from different dataframes ggplot R
我有 3 個數據框,一個包含實際數據,另一個分別包含上限和下限數據。 如何組合這些數據框並在 ggplot 上創建帶有誤差線的散點圖(上限和下限數據用作條形)?
這是數據和繪圖代碼的示例
library(tidyverse)
library(dplyr)
library(ggplot2)
DT <- data.frame(Samples=c("D1", "D2", "D3", "D4"),
ACE=c(0.184, -0.169, 0.054, 0.087),
FLN=c(-0.257, -0.239, -0.009, 0.038),
ANT=c(-0.166, -0.304, 0.238, "" ),
stringsAsFactors=FALSE)
LowerLim <- data.frame(Samples=c("D1", "D2", "D3", "D4"),
ACE=c(-1.514, "", -1.644, -1.611),
FLN=c("", "", "", -1.660),
ANT=c(-1.865, -2.003, 1.937, ""),
stringsAsFactors=FALSE)
UpperLim <- data.frame(Samples=c("D1", "D2", "D3", "D4"),
ACE=c(-0.560, "", -0.689,-0.657),
FLN=c("", "", "", -0.706),
ANT=c(-0.911,-1.049,0.983, "" ),
stringsAsFactors=FALSE)
DTlong <- gather(DT, Cds, Values, "ACE":"ANT", factor_key=TRUE)
DTlong$Samples <- as.character(DTlong$Samples)
DTlong$Samples <- factor(DTlong$Samples, levels=unique(DTlong$Samples))
ggplot(DTlong)+geom_point(aes(color=Samples, y=Values, x=Cds))+
theme(axis.title.x = element_blank())+
theme(axis.text.x=element_text(size=7, angle=90,hjust=0.95,vjust=0.2))+
ggtitle("Points")
這里有幾個問題。 首先,您的某些列是字符格式而不是數字格式,因為您將缺失值設置為""
而不是NA
。 我很欣賞在將數據框打印到屏幕時這可能看起來更自然,但這意味着任何包含""
的列都不再是數字,並且不能用於計算或繪制該列似乎包含的值。
這意味着第一步應該將每個數據框中的三個值列轉換為數值:
DT[-1] <- lapply(DT[-1], as.numeric)
LowerLim[-1] <- lapply(LowerLim[-1], as.numeric)
UpperLim[-1] <- lapply(UpperLim[-1], as.numeric)
第二個問題是您的DT
數據框和UpperLit
數據框似乎是錯誤的,因為 DT 中的所有值都高於UpperLimit
中的值。 出於此答案的目的,我不得不假設這是一個錯誤。 如果你的真實數據沒有這個問題,可以省略這一步:
tmp <- DT
DT <- UpperLim
UpperLim <- tmp
rm(tmp)
第三個問題是要繪制的數據形狀錯誤。 由於行和列的順序都是相同的,我們可以通過將每個數據幀轉換為長格式來實現這一點,並且只保留上下 lim 數據幀的值列。
df <- cbind(pivot_longer(DT, -1, names_to = "Cds", values_to = "Values"),
lower = pivot_longer(LowerLim, -1)$value,
upper = pivot_longer(UpperLim, -1)$value)
現在我們准備好繪圖了。 我們需要在點和誤差條上使用position_dodge
來將它們展開:
ggplot(df, aes(Cds, Values, color = Samples)) +
geom_point(position = position_dodge(width = 0.5), size = 3) +
geom_errorbar(aes(ymin = lower, ymax = upper), width = 0.25, size = 1,
position = position_dodge(width = 0.5)) +
scale_color_brewer(palette = "Set1") +
theme_minimal(base_size = 16) +
theme(axis.title.x = element_blank()) +
ggtitle("Points")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.