r - 循环更改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() 保持一致。每个图表的标题应该是不同的颜色:红色,蓝色,绿色......等。
谢谢你。
解决方案
您的子集不正确:您使用了 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))
推荐阅读
- python - 如何在 For 循环的范围内添加“i”(Python)
- ms-access - MS Access 报告组总计
- python - For循环遍历Numpy数组会出错
- javascript - 向对象内的每个对象添加属性的正确方法
- google-chrome - 在没有 service-worker 的 Chromium 浏览器中安装仅在线 (PWA) Web 应用程序
- json - 从雪花中的子查询创建 JSON
- python - 在查询参数中过滤或排序 API 请求
- python - 两个列表的积分没有给出预期的结果
- r - 如何将两列整数转换为一列日期,以便将其绘制在图表上
- angular - fullcallendar 的角度选择器不起作用