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