Re: [问题] ggplot2循环

楼主: celestialgod (天)   2016-12-05 13:36:51
※ 引述《CAPPON (JI3)》之铭言:
: 举个例子
: aaa=matrix(c("A","A","A","B","B","B","C","C","A1","A2","A3","A1","A2","A3","A1
: ","A2",0.92,0.95,0.94,0.91,0.99,0.98,0.88,0.91,0.92,0.94,0.95,0.96,0.98,0.92,0
: .94,0.92),8,4)
: dimnames(aaa)[[2]]=c("Index","Item","M08","12/2")
: 1.by index画图,相同的index画在同一张,item为每一条线。所以会有3张图...想要一页
: 呈现2张图
: 2.因字段名称有文字跟日期...该怎么处理呢?日期部份读入会变成x12.2
: 遇到这2个问题,再麻烦前辈帮忙了
: 谢谢
: ※ 引述《CAPPON (JI3)》之铭言:
: : 程式咨询(我想用R 做某件事情,但是我不知道要怎么用R 写出来)
: : [环境叙述]:
: : R version 3.3.2
: : 请教前辈
: : 想用ggplot产生多张图 , 一页放6张图
: : 用循环去写时,无法产生图形
: : 不晓得是哪里出错了
: : 但如果用i=1 , i=2 一个一个跑却是没问题
: : 另外 产生的pdf档图形的大小是否可以更改呢?
: : 谢谢
: : pdf(file=paste("D:\\123123", ".pdf", sep=""))
: : for ( i in 1:2){
: : ggplot(data_melt_TN[data_melt_TN[,3]==TN[(i-1)*6+1]|data_melt_TN[,3]==TN[(i-
: 1)
: : aes(x = variable, y = value, group = id,
: : colour = Item)) + geom_point(cex=2) + geom_line()
: +
: : scale_color_manual(values=c("red","orange","green"))+
: : facet_wrap(~Index,ncol=2)+
: : theme(axis.text.x = element_text(angle = 90, hjust = 1,size=12))
: : }
: : dev.off()
我不知道你图的x轴是什么,我随便抓一个来画
再来是character, numeric混杂的资料请用data.frame
如果连R的基本物件data.frame都不熟
建议先去找本R书念熟,或是参考置底的R翻转教室学习相关知识再继续比较好
不然下面的程式对你来说,非 常 困 难
我已经尽量用我想到最简单的方法去写了
但是do.call那段,我想不到更好的解法,只能用那个方法...
至于grid跟gridExtra,里面有不少东西,要玩到通透要花一点时间 (我也不熟)
再来是关于你问的日期部分,要自己转换
下面就是程式码:
library(ggplot2)
library(grid)
library(gridExtra)
DF <- data.frame(Index = c("A","A","A","B","B","B","C","C"),
Item = c("A1","A2","A3","A1","A2","A3","A1","A2"),
M08 = c(0.92,0.95,0.94,0.91,0.99,0.98,0.88,0.91),
Dec02 = c(0.92,0.94,0.95,0.96,0.98,0.92,0.94,0.92),
stringsAsFactors = FALSE)
uniIndex <- unique(DF$Index)
graphs <- vector("list", length(uniIndex))
for (i in seq_along(uniIndex))
graphs[[i]] <- ggplot(subset(DF, DF$Index == uniIndex[i]), aes(M08, Dec02))+
geom_line()
pdf("graphs.pdf")
for (i in 1:ceiling(length(uniIndex) / 2)) {
k <- (2*i-1):min(2*i, length(uniIndex))
if (length(k) == 2) {
print(do.call(grid.arrange, c(graphs[k], list(ncol = 2))))
} else {
print(do.call(grid.arrange, list(graphs[[k]], nullGrob(), ncol = 2)))
}
}
dev.off()
grid.arrange其他参数可以在arrangeGrob找到
参数设定方式就是跟ncol放在同一个list就好
最后,我觉得如果你要用ggplot完成你想要的图
真的需要花一点时间去找,然后刻出来
这里也不只这种方法,还可以一次过滤两种index
然后用facet_wrap(~Index)去处理,再把这图print出来
这样最后也能达到类似的效果,只是第三张图会是全幅的
当然这方法会比我写的简单,这里我就只叙述而已
作者: cywhale (cywhale)   2016-12-05 14:51:00
推清楚,其实ggplot2+gridExtra蛮多细致撇步真的要善用google比如multiple facet grid gridExtra 很多个人特殊需求网络上其实都有解法,前阵为了paper做图都靠孤狗大神

Links booklink

Contact Us: admin [ a t ] ucptt.com