ggplot2 仅绘制分组数据框中的最后一个变量

ggplot2 only plotting last variable from grouped dataframe

我正在尝试用 group=model 绘制 3 个模型,但 仅绘制了 data.frame 中的最后一个 模型。我已经在网上进行了大量搜索,但一直无法弄清楚问题所在。

data.frame 有 3 列:剂量(x 轴)、p1(y 轴)和模型(mod1、mod2、mod3)

library(ggplot2)

ggplot(df, aes(x=dose,y=p1, group=model))+
   geom_line(aes(color=model))+
   geom_step(aes(x=dose,y=p1,group=model, col=model))+
   coord_trans(x = 'log10', limx = c(0.01,200), limy=c(0.01,0.05)) +

#Assigning colors to mod1,mod2,mod3
   values = c("mod1" = "darkgreen", "mod2" = "blue", "mod3" = "red"))

#Log Aesthetics, cut for brevity of code, Help with log ticks []

-这不是 mod1 和 mod2 绘制在框架外的问题。

如果有任何相关性:我在下面包含的数据(我用它创建了上面的图形)仅包含 3 个模型下限的几个点 -实际数据集包含8个模型,每个模型有100个点。

df <- structure(list(dose = c(0.5, 0.565608284362011, 0.639825462677876, 
  0.723781164472726, 0.818753245381915, 0.5, 0.565608284362011, 
  0.639825462677876, 0.723781164472726, 0.818753245381915, 0.926187236872587, 
  0.5, 0.565608284362011, 0.639825462677876, 0.723781164472726, 
  0.818753245381915, 0.926187236872587, 1.04771834809099, 1.18519635471669, 
  1.34071375364684, 1.51663761204148, 1.71564559549136), p1 = c(0.0103075076812739, 
  0.0116952370538794, 0.0132672958208565, 0.0150474513444454, 0.017062331184752, 
  0.0103075076812739, 0.0116952370538794, 0.0132672958208565, 0.0150474513444454, 
  0.017062331184752, 0.0193417088954045, 0.0103075076812739, 0.0116952370538794, 
  0.0132672958208565, 0.0150474513444454, 0.017062331184752, 0.0193417088954045, 
  0.0219188012260592, 0.0248305714535104, 0.0281180313564242, 0.0318265316115288, 
  0.036006027058739), model = c("mod1", "mod1", "mod1", "mod1", 
  "mod1", "mod2", "mod2", "mod2", "mod2", "mod2", "mod2", "mod3", 
  "mod3", "mod3", "mod3", "mod3", "mod3", "mod3", "mod3", "mod3", 
  "mod3", "mod3")), .Names = c("dose", "p1", "model"), row.names = c(1L, 
  2L, 3L, 4L, 5L, 101L, 102L, 103L, 104L, 105L, 106L, 201L, 202L, 
  203L, 204L, 205L, 206L, 207L, 208L, 209L, 210L, 211L), class = "data.frame")

据我了解,问题是这些点彼此重叠,这意味着您只能看到更完整的线 (mod3),而其他线在下方。

通过一些基本的数据整理,我们可以去除重复项并得到类似这样的结果

library(ggplot2)
require(tidyr)
require(dplyr)

 df1 <- df %>% spread(model,p1) %>% 
  mutate(mod3=ifelse(is.na(mod2*mod3)==FALSE,NA,mod3),mod2=ifelse(is.na(mod2*mod1)==FALSE,NA,mod2)) 
%>% gather(model,p1,mod1:mod3) %>% filter(is.na(p1)==FALSE) %>% arrange(p1) 

df1 <- rbind(df1,df1[which(df1$p1==max(df1[df1$model=="mod1",]$p1)),])
df1 <- rbind(df1,df1[which(df1$p1==min(df1[df1$model=="mod3",]$p1)),])
df1[nrow(df1),2] <- "mod2"
df1[nrow(df1)-1,2] <- "mod2"


ggplot(df1, aes(x=dose,y=p1, group=model))+
geom_line(aes(color=model))+
geom_step(aes(x=dose,y=p1,group=model, col=model))+
coord_trans(x = 'log10', limx = c(0.01,200), limy=c(0.01,0.05))

输出下图: