在循环中创建图形:一个图形与其他图形不同

Creating graphs in a loop: one graph different from the others

我有一个详细的代码来创建一系列图表。我想在我创建的许多图表中的一个中放一条垂直线。

考虑以下简单代码:

library(ggplot2)
library(grid)
library(gridExtra)


plots <- list()

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 = 500, color="red")
}


grid.arrange(grobs=plots, nrow=2)

我想要图 4 的红色竖线,但其他的不行。我将如何有效地做到这一点?

只需拆分您的剧情制作并设置条件:)

library(ggplot2)
library(grid)
library(gridExtra)


plots <- list()

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()
    if (i == 4) plots[[i]] <- plots[[i]] + geom_vline(xintercept = 500, color="red")
}


grid.arrange(grobs=plots, nrow=2)

对于这件事,您不需要 for 循环和 if 语句。您可以使用分面;

library(ggplot2)
library(grid)
library(gridExtra)
library(dplyr)

set.seed(123) ## set the seed for random numbers to be reproducible
df <- bind_rows(lapply(1:4, function(x) 
                              data.frame(V1=rnorm(1000), V2=seq(1000))), .id = 'facet')

ggplot(df, aes(x= V2, y=V1)) +
  geom_point() +
  facet_wrap(~facet) +
  geom_vline(data=data.frame(xint=500,facet=4), aes(xintercept = xint), color = "red")