首页 > 解决方案 > 循环更改ggtitle

问题描述

我想根据一个变量的值对我的数据集进行子集化,并以该变量的值作为绘图的名称并作为 ggtitle 绘制一个 ggplot 并保存每个绘图。

最后,我想将所有图表合并到一个页面中。

这是一个简化的例子。

y=rnorm(100, 0,1)
x=sample(100, 5, replace = T)

k=5
z=sample(k, 100, replace=T)

z <- factor(z, levels = c(1,2,3,4,5),
                    labels = c("red", "blue", "green", "purple", "yellow"))

dat=data.frame(y=y, x=x, z=z)
library(ggplot2)

for(i in seq_len(k))
{
dat2 = data.frame(dat[dat$z=='i',])

i <- ggplot(dat2, aes(x=x, y=y)) +
  geom_point() +
  ggtitle(i)
}

library(gridExtra)
grid.arrange(red, blue, green, purple,yellow, nrow = 2)

我无法将变量保存为 i 并与 ggtitle() 保持一致。每个图表的标题应该是不同的颜色:红色,蓝色,绿色......等。

谢谢你。

标签: rloopsggplot2

解决方案


您的子集不正确:您使用了 string'i'而不是 variable i

您可以简单地使用构面而不是for循环和grid.arrange

dat=data.frame(y=y, x=x, z=z)
ggplot(dat, aes(x = x, y = y)) + 
  geom_point() + 
  facet_wrap(~ z)

如果你想循环和排列,你需要使用一个列表:

plots <- list()

for(z in levels(z)) {
  dat2 = data.frame(dat[dat$z==z,])

  plots[[z]] <- ggplot(dat2, aes(x=x, y=y)) +
    geom_point() +
    ggtitle(z)
}

library(gridExtra)
grid.arrange(plots$red, plots$blue, plots$green, plots$purple, plots$yellow, nrow = 2)

请注意,我使用 z 的值作为循环变量,而不是1:5.

这更优雅地完成为:

colors <- c("red", "blue", "green", "purple", "yellow")
N <- 100

dat <- data.frame(x = sample(N, 5, replace = T),
                  y = rnorm(N, 0,1),
                  z = sample(colors, N, replace=T))

plot_color <- function(col, dat) {
  dat2 <- dat[dat$z==col,]

  ggplot(dat2, aes(x=x, y=y)) +
    geom_point() +
    ggtitle(col)
}

plots <- purrr::map(colors, plot_color, dat = dat)
do.call(grid.arrange, c(plots, nrow = 2))


推荐阅读