首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在循环中更改ggtitle

在循环中更改ggtitle
EN

Stack Overflow用户
提问于 2019-08-05 11:40:49
回答 2查看 1.5K关注 0票数 1

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

最后,我想把所有的图表合并成一页。

下面是一个简化的例子。

代码语言:javascript
复制
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)

我在保存变量时遇到了问题,因为我使用了ggtitle()。每个图形的标题应该是不同的颜色:红色、蓝色、green....etc。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-05 11:46:06

您的子设置不正确:您使用的是字符串'i',而不是变量i

您可以简单地使用facet代替for循环和grid.arrange

代码语言:javascript
复制
dat=data.frame(y=y, x=x, z=z)
ggplot(dat, aes(x = x, y = y)) + 
  geom_point() + 
  facet_wrap(~ z)

如果要循环和安排,则需要使用列表:

代码语言:javascript
复制
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

这样做更得体,因为:

代码语言:javascript
复制
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))
票数 1
EN

Stack Overflow用户

发布于 2019-08-05 13:02:56

您可以使用for循环,也可以使用组合框/do.call以更短、更快的速度执行;

代码语言:javascript
复制
myplots = lapply(seq_len(k), function(i){
    p <- ggplot(data.frame(dat[dat$z==i,]), aes(x=x, y=y)) +
        geom_point() +
        ggtitle(i)
    ggsave(paste0(i,'.png'),p)        # if you want to save each plot
    return(p)
})
do.call(grid.arrange, myplots) 

在环境中有单独的地块

代码语言:javascript
复制
names(myplots) = seq_len(k)
list2env(myplots)

或单独执行此操作(例如在循环/lapply内);

代码语言:javascript
复制
assign('blue',myplots[[1]])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57357879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档