R ggplot2在循环中标记图

R ggplot2在循环中标记图,r,for-loop,ggplot2,R,For Loop,Ggplot2,我想把每个图形的垂直线和垂直线的标签放在一个循环中。行的位置保存在数据帧“网格”中 虽然线的位置看起来正确,但标签值及其位置已关闭。我的问题是为什么 library(ggplot2) library(grid) library(gridExtra) plots <- list() grid <- data.frame(x=seq(4), y=c(200, 400, 600, 800)) for (

我想把每个图形的垂直线和垂直线的标签放在一个循环中。行的位置保存在数据帧“网格”中

虽然线的位置看起来正确,但标签值及其位置已关闭。我的问题是为什么

    library(ggplot2)
    library(grid)
    library(gridExtra)
    
    
    plots <- list()
    
    grid <- data.frame(x=seq(4), y=c(200, 400, 600, 800))
    
    for (i in 1:4) {
      V1 <- rnorm(1000)
      V2 <- seq(1000)
      df <- data.frame(V1, V2)
      
      plots[[i]] <- ggplot(df, aes(x= V2, y=V1)) +
        geom_point() +
      geom_vline(xintercept = grid[i,2], color="red")+ 
      geom_text(aes(x=grid[i,2], label=grid[i,2], y=3))
    
    }
    
    
    grid.arrange(grobs=plots, nrow=2)
库(ggplot2)
图书馆(网格)
图书馆(gridExtra)

绘图我会采用不同的方法,使用方面

我也可能会在facet/loop之外计算示例(第二个选项)

库(ggplot2)

grid_df我会采用不同的方法,使用方面

我也可能会在facet/loop之外计算示例(第二个选项)

库(ggplot2)

理想情况下,您应该使用
注释
。以下代码按预期工作

库(ggplot2)
图书馆(网格)
图书馆(gridExtra)

绘图理想情况下,您应该使用
注释
。以下代码按预期工作

库(ggplot2)
图书馆(网格)
图书馆(gridExtra)

情节为了回答你问题的“为什么”部分,我不得不做一点实验。也许其他人可以用更多的专家知识和事实来丰富我的解释(我只是根据我的直觉回答:D)

由于似乎没有问题,如果在循环内部或在循环外部(在另一个1:4迭代的循环中)打印绘图,我认为绘图[[I]]只存储生成绘图的语法。如果在循环外部执行plot[[i]],它将使用grid[i,2]来指定geom_文本部分的标签和位置。循环外i为4,这就是为什么所有绘图使用相同的位置/标签(800)

但我真的不明白为什么geom_vline的行为不一样,或者为什么aes.inherit或lapply的使用解决了这个问题。。。如果其他人能对此有所了解,我将不胜感激:)

库(ggplot2)
图书馆(网格)
图书馆(gridExtra)

情节为了回答你问题的“为什么”部分,我不得不做一点实验。也许其他人可以用更多的专家知识和事实来丰富我的解释(我只是根据我的直觉回答:D)

由于似乎没有问题,如果在循环内部或在循环外部(在另一个1:4迭代的循环中)打印绘图,我认为绘图[[I]]只存储生成绘图的语法。如果在循环外部执行plot[[i]],它将使用grid[i,2]来指定geom_文本部分的标签和位置。循环外i为4,这就是为什么所有绘图使用相同的位置/标签(800)

但我真的不明白为什么geom_vline的行为不一样,或者为什么aes.inherit或lapply的使用解决了这个问题。。。如果其他人能对此有所了解,我将不胜感激:)

库(ggplot2)
图书馆(网格)
图书馆(gridExtra)

嗨,对我来说,诀窍就是设定。geom_文本中的inherit.aes=FALSE。我也试图找出原因,但我找不到一个好的答案。如果在每次迭代中打印绘图,则绘图是完美的。如果您在lappy中使用代码(而不是plots[[i]]只是plots),它也可以工作。因此,geom_文本似乎覆盖了for循环中所有以前的列表元素。。。这似乎很奇怪。更奇怪的是,情节的其余部分没有受到影响。。。如果有人对这个问题有一个很好的答案,请分享:)你真的需要考虑使用方面。循环不是R中的最佳实践,大多数时候,特别是当矢量化解决方案可用时。嗨,对我来说,诀窍是设置。geom_文本中的inherit.aes=FALSE。我也试图找出原因,但我找不到一个好的答案。如果在每次迭代中打印绘图,则绘图是完美的。如果您在lappy中使用代码(而不是plots[[i]]只是plots),它也可以工作。因此,geom_文本似乎覆盖了for循环中所有以前的列表元素。。。这似乎很奇怪。更奇怪的是,情节的其余部分没有受到影响。。。如果有人对这个问题有一个很好的答案,请分享:)你真的需要考虑使用方面。循环不是R中的最佳实践,大多数情况下,特别是当矢量化解决方案可用时。
        library(ggplot2)
        library(grid)
        library(gridExtra)
        
        plots <- list()
        
        grid <- data.frame(x=seq(4), y=c(200, 400, 600, 800))
        
        for (i in 1:4) {
            V1 <- rnorm(1000)
            V2 <- seq(1000)
            df <- data.frame(V1, V2)
            
            plots[[i]] <- ggplot(df, aes(x= V2, y=V1)) +
                geom_point() +
                geom_text(aes(x=grid[i,2], label=grid[i,2], y=3)) +
                geom_vline(xintercept = grid[i,2], color="red") 
                
            
            print(plots[[i]]) # not part of the original syntax
            
        }
        
        
        # leads to wrong position of geom_text
        plots
    
        # leads to wrong position of geom_text
        grid.arrange(grobs=plots, nrow=2)
        
        # correct position of geom_text
        for (i in 1:4){
            print(plots[[i]])
        }
        
        # new grid values also affect plots
        grid <- data.frame(x=seq(4), y=c(2000, 4000, 6000, 8000))
        
        # leads to wrong position of geom_text
        plots