2014-11-19 3 views
4

여러 줄거리로 구성된 여러 줄거리로 구성된 줄거리를 만들고 싶습니다. 예를 들어 각 셀에 3 개의 줄이있는 5x2 격자를 말하고 싶습니다. 더 정확히 말하면, 필자가 필요로하는 것은 한 가지 그림이 아니라 하나의 플롯에서 여러 번 플로팅 기능을 사용하는 방법을 찾는 것입니다.중첩 된 레이아웃 R

레이아웃을 사용하여 외곽에 공통 축을 갖는 플롯을 쌓는 함수를 작성했습니다. TraMineR 패키지의 seqIplot 및 seqdplot 함수에 실제로 필요합니다. 그러나 문제는 해당 문제와 관련이 없으므로 여기서 barplot을 사용한 최소한의 작업 예제가 나와 있습니다.

layout(matrix(c(1:2), nrow=1)) 
stackedplot(list(1:10, 10:1, rep(1,10))) 
stackedplot(list(rep(1,10), 1:10, 10:1)) 
:

stackedplot <- function(data){ 
    layout(matrix(c(1:3), nrow=3)) 
    par(mar=c(0,0,0,0), oma=c(4,1,1,1), mgp=c(3,0.5,0), cex=1) 
    barplot(data[[1]], axes=F, xlab="", ylab="", horiz=TRUE) 
    barplot(data[[2]], axes=F, xlab="", ylab="", horiz=TRUE) 
    barplot(data[[3]], axes=F, xlab="", ylab="", horiz=TRUE) 
    axis(1, at=c(0:10)/10, outer=TRUE) 
    mtext("Label", line=2, side=1) 
} 
stackedplot(list(1:10, 10:1, rep(1,10))) 

내가 뭘하고 싶은 다시 레이아웃 같은 것을 사용하고, 즉, 레이아웃, (물론, 작동하지 않는,)이 같은의 그리드에 대한 stackedplot을 사용하는 것입니다

내가 성공하지, split.screen을 시도 :

split.screen(c(1,2)) 
screen(1) 
stackedplot(list(1:10, 10:1, rep(1,10))) 
screen(2) 
stackedplot(list(rep(1,10), 1:10, 10:1)) 
close.screen(all = TRUE) 
나는 또한 그리드 패키지를 시도

,하지만 분명히 그것은 기본 그래픽과 호환되지 않습니다.

grid.newpage() 
pushViewport(viewport(x=0, y=0, width=0.5, height=1, 
          default.units="native")) 
print(stackedplot(list(1:10, 10:1, rep(1,10))), newpage=FALSE) 
pushViewport(viewport(x=0.5, y=0, width=0.5, height=1, 
         default.units="native")) 
print(stackedplot(list(rep(1,10), 1:10, 10:1)), newpage=FALSE) 
+0

AFAIK는 중첩 된'layout's은 불가능합니다. 그리고'split.screen'은'layout'과 섞이지 않는 것으로 기록되어 있습니다. – Roland

+0

TraMineR에서 문제가 발생하면 seqIplot (group = NULL, withlegend = FALSE)을 사용할 수 있으며 TraMineR은 layout 명령을 호출하지 않습니다. –

+0

고마워, 마티아스.그러나이 문제는 TraMineR과 직접적으로 관련이있는 것 같지는 않지만 모든 (기본) 그래픽과 함께 제공됩니다. 현재 gridBase 패키지는 "중첩 된 레이아웃"을 그리는 데 유망 해 보입니다. – Satu

답변

2

더 많은 조사와 도움을 받아서 다른 사람에게 유용 할 경우를 대비하여 지금 내 자신의 질문에 대답하고 있습니다.

gridBase 패키지를 사용하여 기본 그래픽에 사용할 수있는 grid 패키지로 중첩 된 레이아웃을 만들 수 있습니다. 누적 플롯의 함수는 다음과 같습니다.

library(grid) 
library(gridBase) 

stackedplot <- function(data, main=""){ 

    top.vp <- viewport(layout=grid.layout(nrow=5, ncol=1, 
             heights=unit(c(3, 1, 1, 1, 5), 
                c("lines", "null", "null", "null", "lines"))), 
        width=unit(0.9, "npc")) 

    title <- viewport(layout.pos.row=1, layout.pos.col=1, name="title") 
    p1 <- viewport(layout.pos.row=2, layout.pos.col=1, name="plot1") 
    p2 <- viewport(layout.pos.row=3, layout.pos.col=1, name="plot2") 
    p3 <- viewport(layout.pos.row=4, layout.pos.col=1, name="plot3") 
    xaxis <- viewport(layout.pos.row=5, layout.pos.col=1, name="xaxis") 

    splot <- vpTree(top.vp, vpList(title, p1, p2, p3, xaxis)) # Defining the hierarchy of the viewports 
    pushViewport(splot) # Creating viewports for plotting with the definitions of splot 

    upViewport() # Navigating up in the viewport tree 
    downViewport("plot1") # Navigating down in the viewport tree, searching for viewport "plot1" 
    grid.rect() # Plotting a rectangle (borders for the viewport) 
    par(plt=gridPLT(), new=TRUE) # Taking the dimensions of the viewport for a base graphics plot 
           # Adding plot to an existing plot 
    barplot(data[[1]], axes=FALSE, xlab="", ylab="", horiz=TRUE) 

    upViewport() 
    downViewport("plot2") 
    grid.rect() 
    par(plt=gridPLT(), new=TRUE) 
    barplot(data[[2]], axes=FALSE, xlab="", ylab="", horiz=TRUE) 

    upViewport() 
    downViewport("plot3") 
    grid.rect() 
    par(plt=gridPLT(), new=TRUE) 
    barplot(data[[3]], xlab="", ylab="", horiz=TRUE) 

    upViewport() 
    downViewport("xaxis") 
    grid.text("X label", y = unit(2, "lines")) 

    upViewport() 
    downViewport("title") 
    grid.text(main, y = unit(1, "lines")) 

    upViewport(2) 
} 

함수는 제 뷰포트 설명 상이한 높이가 뷰포트의 5x1 그리드로 분할되고 (윈도우의 폭의 90 %). 그리드의 각 뷰포트에는 나중에 호출 할 수있는 이름이 지정됩니다. 뷰포트 트리 (splot)는 뷰포트의 계층 구조를 정의하는 vpTree으로 설명됩니다. 뷰포트를 설명한 후 실제로는 플롯 할 준비가 된 것은 pushViewport입니다.

이제 각각의 명명 된 뷰포트가 검색되어 플로팅 용으로 upViewport (뷰포트 트리에서 올라감) 및 downViewport (뷰포트 트리에서 요청 된 뷰포트를 찾음)으로 열립니다.

여기에 gridPLT이 필요합니다 (또는 gridFIG 또는 gridOMI 사용 가능, 자세한 내용은 gridBase 설명서 참조). 그 후 모든 기본 그래픽 함수를 사용하여 현재 뷰포트에 플롯 할 수 있습니다.

요청한 플롯 이후에 upViewport(2)은 루트로 다시 이동하는 데 사용됩니다 (계층 구조에서 2 개의 뷰포트까지).

이제 stackedplot 함수를 다음과 같이 다른 격자에서 여러 번 호출 할 수 있습니다.

opar <- par(no.readonly=TRUE) # Saving graphical parameters 
plot.new() # Needed for par(new=TRUE) in stackedplot() 

multitop.vp <- viewport(layout=grid.layout(1,2), width = unit(0.95, "npc")) 
pl1 <- viewport(layout.pos.col=1, layout.pos.row=1, name="A") 
pl2 <- viewport(layout.pos.col=2, layout.pos.row=1, name="B") 
vpall <- vpTree(multitop.vp, vpList(pl1,pl2)) 
pushViewport(vpall) 

upViewport() 
downViewport("A") 
stackedplot(data=list(1:10,10:1,rep(10,10)),main="A") 

upViewport() 
downViewport("B") 
stackedplot(data=list(10:1,rep(10,10),1:10),main="B") 

upViewport(2) 
par(opar) # Returning the graphical parameters saved earlier 

enter image description here

+2

더 새롭고 유용한 대안은 gridGraphics 패키지입니다. 여기서'grid.echo'는 기본 그래픽의 그리드 기반 버전을 생성합니다. – baptiste