Как сделать сетку по условию - R - PullRequest
1 голос
/ 06 марта 2020

У меня есть несколько файлов, имеющих одинаковые и разные черты. Поэтому я сделал цикл на основе имен столбцов для создания гистограммы:

Вот так (только часть):

for (i in 3:10) {
if (colnames(data)[i]=="ww_age") {
  a<-ggplot(data, aes(x=ww_age)) + 
    geom_histogram(color="black", fill="white")

}} 

до

for (i in 3:10) {
if (colnames(data)[i]=="ww_weight") {
  f<-ggplot(data, aes(x=ww_weight)) + 
    geom_histogram(color="black", fill="white")

}}

Итак, я будет иметь несколько комбинаций для каждого файла, например, для файла A у меня будет a,b,c,d,e,f графика, а для файла B у меня будет a,c,d. Итак, я хотел бы сделать сетку для каждого набора графики, например:

pdf("figura3.pdf",width=8,height=14,paper='special')
grid.newpage()
grid.draw(rbind(ggplotGrob(a), ggplotGrob(b),ggplotGrob(c), 
                ggplotGrob(d), ggplotGrob(e),ggplotGrob(f), 
size = "last"))
dev.off()

Но как я могу сделать по условию? Для a до f в ситуации A и просто использование a,c,d в ситуации B.

1 Ответ

1 голос
/ 06 марта 2020

Например, у нас есть два файла,

df = data.frame(x=1,y=2,sapply(1:8,function(i)rnorm(100,i,1)))
colnames(df)[3:10] = paste0("column_",letters[1:8])
write.table(df,"fileA.txt",row.names=FALSE,quote=FALSE,sep="\t")

df = data.frame(x=1,y=2,sapply(1:8,function(i)rnorm(100,i,1)))
colnames(df)[3:10] = paste0("column_",LETTERS[1:8])
write.table(df,"fileB.txt",row.names=FALSE,quote=FALSE,sep="\t")

Теперь мы напишем функцию, которая может прочитать файл, взять определенные столбцы и создать комбинированный график:

library(tidyr)
library(tibble)
library(ggplot2)

plotfun = function(datafile,colvars){
data = read.delim(datafile,stringsAsFactors=FALSE)
plotdf = pivot_longer(data[,colvars],everything())
p = ggplot(plotdf,aes(x=value))+
geom_histogram(color="black", fill="white") + facet_wrap(~name)
return(p)
}

Мы тестируем его в одном файле с несколькими столбцами:

plotfun("fileA.txt",c("column_a","column_b","column_e"))

enter image description here

Теперь нам нужно определить список, который говорит, что это за файлы, что это столбец для построения и как его сохранить:

LIST = list(
A = list(file="fileA.txt",
colvars = c("column_a","column_b","column_c","column_d","column_e","column_f"),
pdf = "A.png"),
B = list(file="fileA.txt",colvars = c("column_a","column_c","column_d"),pdf="B.png")
)

Теперь мы перебираем этот список:

for(i in 1:length(LIST)){
p = plotfun(LIST[[i]]$file,LIST[[i]]$colvars)
ggsave(p,file=LIST[[i]]$pdf)
}

enter image description here

...