从 lapply 向 PDF 添加单独的图例
Add separate legend to PDF from lapply
我创建了一个多页 PDF,其中包含从数百个唯一标识符生成的图表。基本上,我想每页添加一个单独的图例面板。
PDF基本构造为详细 and here
关于如何使用 grid.arrange 为几个图形对象添加单独图例的演练有很多,最有希望的是 here and here。
基本上步骤是:
- 创建数据库
- 使用lapply 制作图形对象列表并
- 创建一个 pdf 图形对象列表。
我怀疑该过程在第 3 步失败 - 将图例添加到 grob 列表中。
要重现问题
color.names <- setNames(c("A", "B", "C", "D", "F"), c("green3", "chocolate1", "darkgoldenrod1", "firebrick1"))
group.colors <- c(A = "#333BFF", B = "#CC6600", C ="#9633FF", D = "#E2FF33", F = "#E3DB71")
SOexample <- data.frame(
studentid = runif(100,min=500000, max=999999),
grade = runif(100, min=20, max=100),
lettergrade = sample(c("A", "B","C","D","F"),size=100,replace=TRUE),
firstname = sample(c("Alan", "Billy","Charles","Donna","Felicia"),size=100,replace=TRUE)
)
生成图例
df <- SOexample
gl <- ggplot(df, aes(x=" ", y=as.numeric(grade), ymin=50, ymax=100))+ geom_boxplot()+ guides(fill=FALSE) + geom_point(aes(colour=lettergrade)) + labs( x=" ", y=" ") + ggtitle(sprintf("%s", df$firstname), aes(cex=.05)) + scale_colour_manual(name="Number", values=group.colors) + scale_fill_manual(name="", values="red") + theme_grey() + theme(legend.position="none", plot.title = element_text(size = 8, face = "bold"), plot.subtitle=element_blank()) + theme(axis.title.x=element_blank(), axis.text.x=element_blank(), axis.ticks.x=element_blank())
使用cowplot抓取图例的功能
install.packages("cowplot")
library(cowplot)
leg <- get_legend(gs + theme(legend.position="right"))
制作所有图形对象
plist = lapply(split(SOexample, factor(SOexample$studentid)), function(df) { ggplot(df, aes(x=" ", y=as.numeric(grade), ymin=50, ymax=100))+ geom_boxplot()+ guides(fill=FALSE) + geom_point(aes(colour=lettergrade)) + labs( x=" ", y=" ") + ggtitle(sprintf("%s", df$firstname), aes(cex=.05)) + scale_colour_manual(name="Number", values=group.colors) + scale_fill_manual(name="", values="red") + theme_grey() +theme(legend.position="none", plot.title = element_text(size = 8, face = "bold"), plot.subtitle=element_blank()) + theme(axis.title.x=element_blank(),axis.text.x=element_blank(), axis.ticks.x=element_blank())})
制作 PDF
pdf("allpeople.pdf", pointsize=8)
for (i in seq(1, length(plist), 11)) {
grid.arrange(grobs=plist[i:(i+11)],
ncol=4, left="Magic Numbers", bottom=" ")
}
dev.off()
我怀疑该过程在创建 PDF 阶段崩溃了。理想情况下,我会在 grid.arrange 步骤中将图例作为图形对象添加到 / 中,例如
grobs[12]<- leg
但运气不好,而且 plist()
过程中的最后一项似乎还没有完全转换为图形对象。
使用这种自动生成的方法,即无法单独列出图形对象,如何将图例添加到PDF的每一页?
有多种选择(例如,ggsave('file.pdf',marrangeGrob(plist,ncol=4,nrow=3))
),但为了更好地控制,我可能会这样做:
pl <- split(plist, gl(10,10))
pdf("allpeople.pdf", pointsize=8)
for (i in seq_along(pl)) {
grid.arrange(grobs=c(pl[[i]], list(leg)),
ncol=4,
left="Magic Numbers",
bottom=" ")
}
dev.off()
我创建了一个多页 PDF,其中包含从数百个唯一标识符生成的图表。基本上,我想每页添加一个单独的图例面板。
PDF基本构造为详细
关于如何使用 grid.arrange 为几个图形对象添加单独图例的演练有很多,最有希望的是 here and here。
基本上步骤是:
- 创建数据库
- 使用lapply 制作图形对象列表并
- 创建一个 pdf 图形对象列表。
我怀疑该过程在第 3 步失败 - 将图例添加到 grob 列表中。
要重现问题
color.names <- setNames(c("A", "B", "C", "D", "F"), c("green3", "chocolate1", "darkgoldenrod1", "firebrick1"))
group.colors <- c(A = "#333BFF", B = "#CC6600", C ="#9633FF", D = "#E2FF33", F = "#E3DB71")
SOexample <- data.frame(
studentid = runif(100,min=500000, max=999999),
grade = runif(100, min=20, max=100),
lettergrade = sample(c("A", "B","C","D","F"),size=100,replace=TRUE),
firstname = sample(c("Alan", "Billy","Charles","Donna","Felicia"),size=100,replace=TRUE)
)
生成图例
df <- SOexample
gl <- ggplot(df, aes(x=" ", y=as.numeric(grade), ymin=50, ymax=100))+ geom_boxplot()+ guides(fill=FALSE) + geom_point(aes(colour=lettergrade)) + labs( x=" ", y=" ") + ggtitle(sprintf("%s", df$firstname), aes(cex=.05)) + scale_colour_manual(name="Number", values=group.colors) + scale_fill_manual(name="", values="red") + theme_grey() + theme(legend.position="none", plot.title = element_text(size = 8, face = "bold"), plot.subtitle=element_blank()) + theme(axis.title.x=element_blank(), axis.text.x=element_blank(), axis.ticks.x=element_blank())
使用cowplot抓取图例的功能
install.packages("cowplot")
library(cowplot)
leg <- get_legend(gs + theme(legend.position="right"))
制作所有图形对象
plist = lapply(split(SOexample, factor(SOexample$studentid)), function(df) { ggplot(df, aes(x=" ", y=as.numeric(grade), ymin=50, ymax=100))+ geom_boxplot()+ guides(fill=FALSE) + geom_point(aes(colour=lettergrade)) + labs( x=" ", y=" ") + ggtitle(sprintf("%s", df$firstname), aes(cex=.05)) + scale_colour_manual(name="Number", values=group.colors) + scale_fill_manual(name="", values="red") + theme_grey() +theme(legend.position="none", plot.title = element_text(size = 8, face = "bold"), plot.subtitle=element_blank()) + theme(axis.title.x=element_blank(),axis.text.x=element_blank(), axis.ticks.x=element_blank())})
制作 PDF
pdf("allpeople.pdf", pointsize=8)
for (i in seq(1, length(plist), 11)) {
grid.arrange(grobs=plist[i:(i+11)],
ncol=4, left="Magic Numbers", bottom=" ")
}
dev.off()
我怀疑该过程在创建 PDF 阶段崩溃了。理想情况下,我会在 grid.arrange 步骤中将图例作为图形对象添加到 / 中,例如
grobs[12]<- leg
但运气不好,而且 plist()
过程中的最后一项似乎还没有完全转换为图形对象。
使用这种自动生成的方法,即无法单独列出图形对象,如何将图例添加到PDF的每一页?
有多种选择(例如,ggsave('file.pdf',marrangeGrob(plist,ncol=4,nrow=3))
),但为了更好地控制,我可能会这样做:
pl <- split(plist, gl(10,10))
pdf("allpeople.pdf", pointsize=8)
for (i in seq_along(pl)) {
grid.arrange(grobs=c(pl[[i]], list(leg)),
ncol=4,
left="Magic Numbers",
bottom=" ")
}
dev.off()