我正在尝试在数据中为每个组生成多个方面图。我面临的问题是,在我的实际数据中,有时每个组的方面超过100,而ggplot2
正在尝试将所有方面放入一个图中。这对视觉效果不好。
基本上,我想要实现的是当每页超出一定数量的方面窗口时(让我们说每页绘制10个窗口)我想继续在每组的下一个图中绘制它们。
使这个覆盖的最小例子仅涵盖每组的方面。
x <- rnorm(25,0,5)
y <- rnorm(25,5,10)
gr=rep(c(1,2),c(20,5))
set <- c(rep(1:20,1),1:5)
test_data <- data.frame(x,y,set,gr)
utils::View(test_data)
对于这个最小的例子,gr 1的设定数是20.但我想将它分开,以便每页说10个方面。
library(ggplot2)
library(gtable)
library(grid)
library(gridExtra)
plot_list=list()
for (i in unique(test_data$gr)){
plot_sets<- ggplot(data = test_data[test_data$gr==i,], aes(y = y, x=x,fill=factor(set))) +
geom_point(alpha = 0.8,size=8,shape=21,col="black",aes(group=set)) +
facet_wrap(~set)+
theme_bw()+
theme(legend.position = "top",plot.title=element_text(face="bold",colour ="Blue",size=25),
axis.title.x = element_text(face="bold",size=24),
axis.title.y = element_text(face="bold",size=24),
#axis.text.x = element_blank(),
axis.text.x = element_text(size = 22 , colour = "black",angle=0,vjust = 0.0, hjust = 0),
axis.text.y = element_text(size = 22 , colour = "black"),
strip.text = element_text(size=22, lineheight=1.0,face="bold"),
strip.background = element_rect(fill="#FFFFCC", colour="black", size=0.1),
legend.title = element_text(colour="black", size=20,face="bold"),
legend.text = element_text(colour="black", size=26),
panel.spacing = unit(0.2, "lines"))+
labs(fill='set',col="set",x = "x",y="y",title=paste(i,j,"my_Sets",sep="_"))+
guides(fill = guide_legend(override.aes = list(alpha=1,nrow=1,size=5)))
plot_list[[i]]=plot_sets
}
for (i in 1:length(unique(test_data$gr))) {
file_name = paste(unique(test_data$gr), "my_sets.png", sep="_")
png(paste("C:/test","/",file_name[i],sep=""), width =6400, height =4400, pointsize = 16, units = 'px', res = 200)
grid.draw(plot_list[[i]])
dev.off()
}
我找到了一些相关的帖子,比如
Multiple graphs over multiple pages using ggplot
ggplot2: Plots over Multiple pages
但是他们使用的是.pdf输出,这个例子是最相关的但却适用于.pdf输出
带有.pdf输出版本的@agstudy解决方案
tab <- data.frame(Date = rep(seq(as.Date('2013-03-01'),
by = 'day', length.out = ii), nn),
value = rep(runif(nn, 100, 200)))
tab$Station <- rep(1:nn, each = ii)
*library(gridExtra)
library(ggplot2)
pdf('test.pdf', width=21, height=27)
i = 1
plot = list()
for (n in unique(tab$Station)){
### process data for plotting here ####
plot[[i]] = ggplot(tab[tab$Station==n,], aes(x=Date,y = value)) +
geom_line() +
facet_wrap(~ Station, ncol = 5)
if (i %% 20 == 0) { ## print 8 plots on a page
print (do.call(grid.arrange, plot))
plot = list() # reset plot
i = 0 # reset index
}
i = i + 1
}
if (length(plot) != 0) {
print (do.call(grid.arrange, plot))
}
dev.off()
答案 0 :(得分:1)
cut()
和ggsave()
。假设你有80套你想要包装。
library(tidyverse)
param_n <- 800
data <- data_frame(
x = rnorm(param_n, 0, 5),
y = rnorm(param_n, 5, 10),
group = factor(sample(c(1, 0), param_n, TRUE)),
set = sample(1:(param_n / 10), param_n, TRUE)
)
对于一个情节,这是很多方式,所以你使用cut()
将它分成十页。
data_cut <-
data %>%
mutate(page = cut(set, 10)) # split into 10 groups
然后,您只需遍历每个页面,filter()
输出该数据,然后使用.png
保存ggsave()
个文件。
for (current_page in levels(data_cut$page)) {
fig <-
data_cut %>%
filter(page == current_page) %>%
ggplot(
aes(y = y, x = x,
colour = group,
group = set)) +
facet_wrap(~ set) +
geom_point() +
labs(title = paste("Sets", current_page)) +
theme_bw() +
theme(legend.position = "bottom")
ggsave(
paste0("figures_sets_", current_page, ".png"),
plot = fig
)
}
我简化了你的情节,使代码更紧凑。