2016-11-08 5 views
-1

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

Вот как один набор данных выглядит следующим образом:

df <- data.frame(dose=c(10,0.625,2.5,0.156,0.0391,0.00244,0.00977,0.00061,10,0.625,2.5,0.156,0.0391,0.00244,0.00977,0.00061,10,0.625,2.5,0.156,0.0391,0.00244,0.00977,0.00061),viability=c(6.12,105,57.9,81.9,86.5,98.3,96.4,81.8,27.3,85.2,80.8,92,82.5,110,90.2,76.6,11.9,89,35.4,79,95.8,117,82.1,95.1),stringsAsFactors=F) 

Вот доза-реакция подходит:

library(drc) 
fit <- drm(viability~dose,data=df,fct=LL.4(names=c("Slope","Lower Limit","Upper Limit","ED50"))) 

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

pred.df <- expand.grid(dose=exp(seq(log(max(df$dose)),log(min(df$dose)),length=100))) 
pred <- predict(fit,newdata=pred.df,interval="confidence") 
pred.df$viability <- pred[,1] 
pred.df$viability.low <- pred[,2] 
pred.df$viability.high <- pred[,3] 

И вот как выглядит один сюжет:

library(ggplot2) 
p <- ggplot(df,aes(x=dose,y=viability))+geom_point()+geom_ribbon(data=pred.df,aes(x=dose,y=viability,ymin=viability.low,ymax=viability.high),alpha=0.2)+labs(y="viability")+ 
    geom_line(data=pred.df,aes(x=dose,y=viability))+coord_trans(x="log")+theme_bw()+scale_x_continuous(name="dose",breaks=sort(unique(df$dose)),labels=format(signif(sort(unique(df$dose)),3),scientific=T))+ggtitle(label="all doses") 

добавив несколько оценок параметров на графике:

params <- signif(summary(fit)$coefficient[-1,1],3) 
names(params) <- c("lower","upper","ed50") 
p <- p + annotate("text",size=3,hjust=0,x=2.4e-3,y=5,label=paste(sapply(1:length(params),function(p) paste0(names(params)[p],"=",params[p])),collapse="\n"),colour="black") 

Что дает:

enter image description here

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

Я думал, что разумное решение будет использовать grid.arrange:

В качестве примера я буду цикл 20 раз на этом примере набор данных:

plot.list <- vector(mode="list",20) 
for(i in 1:20){ 
    plot.list[[i]] <- ggplot(df,aes(x=dose,y=viability))+geom_point()+geom_ribbon(data=pred.df,aes(x=dose,y=viability,ymin=viability.low,ymax=viability.high),alpha=0.2)+labs(y="viability")+ 
    geom_line(data=pred.df,aes(x=dose,y=viability))+coord_trans(x="log")+theme_bw()+scale_x_continuous(name="dose",breaks=sort(unique(df$dose)),labels=format(signif(sort(unique(df$dose)),3),scientific=T))+ggtitle(label="all doses")+ 
    annotate("text",size=3,hjust=0,x=2.4e-3,y=5,label=paste(sapply(1:length(params),function(p) paste0(names(params)[p],"=",params[p])),collapse="\n"),colour="black") 
} 

А потом сюжет с помощью:

library(grid) 
library(gridExtra) 
grid.arrange(grobs=plot.list,ncol=3,nrow=ceiling(length(plot.list)/3)) 

enter image description here

Вт это, очевидно, плохо масштабируется. Поэтому мой вопрос заключается в том, как создать эту фигуру с лучшим масштабированием - это значит, что все объекты сжаты пропорционально таким образом, что создает фигуру, которая все еще визуально взаимодействует.

+0

земля в файл и использовать большие значения для '' height' и width'. И, возможно, урезать лишние ярлыки. Или объедините все ваши прогнозы в один фрейм данных и используйте 'facet_wrap'. – Gregor

+0

'png (" myplot.png ", width = 1600, height = 2400); grid.arrange (...); dev.off() ' – Gregor

+0

Кстати, вам не нужно указывать как nrow, так и ncol в grid.arrange() – baptiste

ответ

1

Вы должны установить размер устройства так, чтобы графики оставались читаемыми, например.

pl = replicate(11, qplot(1,1), simplify = FALSE) 
g = arrangeGrob(grobs = pl, ncol=3) 
ggsave("plots.pdf", g, width=15, height=20) 

enter image description here

Смежные вопросы