2013-02-15 26 views
3

R에서 2 x 2 배열로 4 개의 산점도를 그립니다 (실제로 rpy2를 통해 플롯하고 있음). 나는 각각이 종횡비 1을 가지길 원하지만 동일한 척도이기 때문에 비교할 수 있도록 모든 하위 플롯에 대해 동일한 X와 Y 틱이 표시됩니다. 나는 par이 작업을 수행하려고 :R에 동일한 축을 가진 여러 분산 형 플롯 만들기 R

par(mfrow=c(2,2)) 
# scatter 1 
plot(x, y, "p", asp=1) 
# scatter 2 
plot(a, b, "p", asp=1) 
# ... 

편집 :

> par(mfrow=c(2,2)) 
> for (n in 1:4) { plot(iris$Petal.Width, rnorm(length(iris$Petal.Width)), "p", asp=1) } 

분산의하지만 서로 다른과 올바른 유형을 작성합니다

여기에 내가 지금 무엇을의 직접적인 예입니다 저울. 위의 전화 번호가 인 경우 ylimxlim을 동일하게 설정하면이 문제를 해결하지 않습니다. 각 축마다 여전히 눈금과 눈금 수가 매우 다르므로 불필요하게 해석하기가 어려워집니다. 나는 X 축과 Y 축을 동일하게하고 싶다. 예를 들어,이 :

enter image description here

같은 축이 모든 줄거리에 사용되는 것을 보장하는 가장 좋은 방법은 무엇입니까 :

for (n in 1:4) { plot(iris$Petal.Width, rnorm(length(iris$Petal.Width)), "p", asp=1, xlim=c(-4, 6), ylim=c(-2, 4)) }

잘못된 결과를 생성?

axis=same 또는 par(mfrow=...)과 같은 매개 변수는 lattice의 기본 동작처럼 들리지만 모든 서브 플로트에서 축을 공유하고 동일하게 만드는 매개 변수입니다.

lgautier는 ggplot으로 멋진 코드를 제공했지만 사전에 축을 알고 있어야합니다. 나는 각 서브 플롯의 데이터를 반복적으로 반복하지 않고 플롯되도록 정확한 틱을 계산하고 싶다는 점을 분명히 밝히고 싶습니다. 그것이 사전에 알려 져야한다면, ggplot 솔루션은 단지 plot으로 그려지는 것보다 훨씬 더 복잡하며 명시 적으로

agstudy가 격자가있는 솔루션을 제공합니다. 이것은 내가 원하는 것에 가장 가깝게 보입니다. 각 분산에 대한 틱 위치를 명시 적으로 사전 계산할 필요는 없지만 새로운 사용자는 격자를 일반적인 플롯처럼 보이게 만드는 방법을 찾을 수 없습니다. 산출

> xyplot(y~x|group, data =dat, type='p', 
     between =list(y=2,x=2), 
     layout=c(2,2), aspect=1, 
       scales =list(y = list(relation='same'), alternating=FALSE)) 

가 :

enter image description here

가 어떻게이 R 기지 같은이 모양을 만들 수 있습니다 내가 들어 왔 가장 가까운이 무엇입니까? 각 하위 그림의 상단에 이러한 group 부제가 없거나 각 흩 뿌리기의 상단과 오른쪽에 레이블이 지정되지 않은 틱이 표시되도록하려면 흩어져있는 각 x와 y에 레이블을 지정하기 만하면됩니다. 또한 X 및 Y에 대한 공유 레이블을 찾고 있지 않습니다. 각 서브 플로트에는 고유 한 X 및 Y 레이블이 있습니다. 여기에서 선택한 데이터는 의미가 없지만 축 레이블은 각 분산에서 동일해야합니다.

격자를 R베이스처럼 보이게하는 쉬운 방법이 없다면, 각각의 정확한 위치를 미리 계산하지 않고 R에서해야 할 일을 할 수있는 방법이 없다는 것 (놀랍게도)입니다. 각 하위 플롯에서 눈금을 긋는다. 데이터를 미리 반복해야한다.

+3

일반적인 눈금이 필요한 경우 ** ggplot2 ** 또는 ** 격자 **와 패 시팅 또는 트레일 링 (각각)을 사용하는 것이 훨씬 쉽습니다. – joran

+0

ggplot2는 나에게 너무 복잡 할 수 있기 때문에, 특히 lattice를 사용하여이 작업을 수행하는 데 대한 포인터에 매우 흥미가 있습니다. – user248237dfsf

+0

글쎄, 축의 눈금과 범위를 계산하는 것은 격자 또는 ggplot2가 후드없이 무엇을하는지입니다. 눈금과 범위가 동일하도록 새로운 플롯이 작성되면 이전 플롯을 업데이트하는 솔루션을 사용한 것으로 보입니다. 이것은 그리드로 구현 될 수 있지만 틱 마크와 범위를 미리 계산하는 것은 훨씬 적은 노력으로 보인다. – lgautier

답변

2

ggplot2는 시작할 때 가장 예쁜/쉬운 비율을 가질 수 있습니다. RPY2와

예 :

from rpy2.robjects.lib import ggplot2 
from rpy2.robjects import r, Formula 

iris = r('iris') 

p = ggplot2.ggplot(iris) + \ 
    ggplot2.geom_point(ggplot2.aes_string(x="Sepal.Length", y="Sepal.Width")) + \ 
    ggplot2.facet_wrap(Formula('~ Species'), ncol=2, nrow = 2) + \ 
    ggplot2.GBaseObject(r('ggplot2::coord_fixed')()) # aspect ratio 
# coord_fixed() missing from the interface, 
# therefore the hack. This should be fixed in rpy2-2.3.3 

p.plot() 

당신이 완전히 분리 플롯을 의미 할 수 있습니다 것을 볼 이전의 대답에 코멘트를 읽기. R에 대한 기본 플롯팅 시스템에서는 par(mfrow(c(2,2)) 또는 par(mfcol(c(2,2)))이 가장 쉬운 방법이며, 종횡비, 축 범위 및 눈금 표시는 일관된 방식으로 일관되게 유지됩니다.

R에서 플롯하기위한 가장 유연한 시스템은 grid 일 수 있습니다. 보이는 것만 큼 나쁘지는 않습니다. 생각하는 것은 장면 그래프입니다.ggplot2 그리드 문서화에

from rpy2.robjects.vectors import FloatVector 

from rpy2.robjects.lib import grid 
grid.newpage() 
lt = grid.layout(2,2) # 2x2 layout 
vp = grid.viewport(layout = lt) 
vp.push() 


# limits for axes and tickmarks have to be known or computed beforehand 
xlims = FloatVector((4, 9)) 
xbreaks = FloatVector((4,6,8)) 
ylims = FloatVector((-3, 3)) 
ybreaks = FloatVector((-2, 0, 2)) 

# first panel 
vp_p = grid.viewport(**{'layout.pos.col':1, 'layout.pos.row': 1}) 
p = ggplot2.ggplot(iris) + \ 
    ggplot2.geom_point(ggplot2.aes_string(x="Sepal.Length", 
              y="rnorm(nrow(iris))")) + \ 
    ggplot2.GBaseObject(r('ggplot2::coord_fixed')()) + \ 
    ggplot2.scale_x_continuous(limits = xlims, breaks = xbreaks) + \ 
    ggplot2.scale_y_continuous(limits = ylims, breaks = ybreaks) 
p.plot(vp = vp_p) 
# third panel 
vp_p = grid.viewport(**{'layout.pos.col':2, 'layout.pos.row': 2}) 
p = ggplot2.ggplot(iris) + \ 
    ggplot2.geom_point(ggplot2.aes_string(x="Sepal.Length", 
              y="rnorm(nrow(iris))")) + \ 
    ggplot2.GBaseObject(r('ggplot2::coord_fixed')()) + \ 
    ggplot2.scale_x_continuous(limits = xlims, breaks = xbreaks) + \ 
    ggplot2.scale_y_continuous(limits = ylims, breaks = ybreaks) 
p.plot(vp = vp_p) 

모어 rpy2 documentation about graphics에서 문서, 후 : RPY2, ggplot2, 그리드와.

+0

감사합니다. rpy의 ggplot 예제는 나에게 미래에 매우 도움이 될 것입니다. 그래도 제가 그리드/ggplot 솔루션을 원하는대로 할 수는 없지만 (저는 R베이스와 비슷한 매우 간단한 플롯을 찾고 있습니다.) See my 편집. – user248237dfsf

+0

마지막 질문에 대한 첫 번째 해결책에서는 각 x/y 값의 샘플을 설명하는 추가 열이있는 데이터 프레임을 사용합니다. ggplot이이 레이블을 읽으므로 하나의 호출로 ggplot에서 multiplot을 만드는 데 사용할 수 있습니다. 두 번째 솔루션에서는 그리드를 사용하여 명시 적으로 각 서브 플로트를 만듭니다. 일반적으로 어떤 솔루션을 사용 하시길 권장합니까? 플롯을 개별적으로 만들거나, (파이썬 데이터 구조, 제 경우에는) 항상 여분의 레이블을 가지고이 레이블을 읽도록 ghplot을 변형 시키십시오. – user248237dfsf

+0

@ user248237 : 일반적으로 권장되는 솔루션은 상위 수준 기능을 사용하는 솔루션입니다. 여기에는'ggplot2' (또는'lattice')와 하나의'data.frame'이 있습니다 (그리고 여러분은 그 패키지에서 전투 테스트를 거친 코드로 레이아웃을 처리하게됩니다). 'grid'는 플로팅에 대한 더 낮은 수준의 인터페이스이며, 특별한 필요가 없을 때만 사용해야합니다 (예 : rpy2 문서의 "plot in plot"예제).레코드의 경우'격자 '와'ggplot2'가'grid'의 맨 위에 구현됩니다. – lgautier

3

latticeggplot2 데이터를 변경해야합니다. 예를 들어

  1. 는 ...
  2. ,
  3. 각 data.frame 그룹 = 1,2에 대한 그룹 열을 추가 (X = X1, Y = Y1) 4 data.frame을 만들
  4. lattice

    dat <- data.frame(x = rep(sample(1:100,size=10),4), 
            y = rep(rnorm(40)), 
            group = rep(1:4,each =10)) 
    
    xyplot(y~x|group,  ## conditional formula to get 4 panels 
         data =dat,  ## data 
         type='l',  ## line type for plot 
         groups=group,  ## group ti get differents colors 
         layout=c(2,2)) ## equivalent to par or layout 
    

    enter image description here

    을 사용하여 다음 번

예에서 4 data.frame을 rbind

추 신 : 성교를 설정할 필요가 없습니다. xyplot에서 기본 sacles 설정은 same (모든 패널에 동일한 sacles)입니다. 내가 정의 여기에 예를 들어, 플롯의 많은 세부 사항을 제어 할 수 있도록 기능을 세우고 격자 인수의 수가 많은

xyplot(y~x|group, data =dat, type='l',groups=group, 
     layout=c(2,2), scales =list(y = list(relation='free'))) 

편집 : 당신은 예를 들어 수정할 수 있습니다

  1. 스트립 라벨과 제목에 사용할 텍스트
  2. 크기와 축 눈금 레이블 배치,
  3. 패널의 열과 행 사이의 간격 크기입니다.

    xyplot(y~x|group, data =dat, type='l',groups=group, 
         between =list(y=2,x=2), 
         layout=c(2,2), 
         strip = myStrip, 
         scales =list(y = list(relation='same',alternating= c(3,3)))) 
    

myStrip <- function(var.name,which.panel, which.given,...) { 
    var.name <- paste(var.name ,which.panel) 
    strip.default(which.given,which.panel,var.name,...) 
    } 

enter image description here

격자 음모 기본 그래픽 플롯을 얻기 위하여 편집, 당신이 시도 할 수 있습니다 :

xyplot(y~x|group, data =dat, type='l',groups=group, 
     between=list(y=2,x=2), 
     layout=c(2,2), 
     strip =FALSE, 
     xlab=c('a','a'), 
     xlab.top=c('a','a'), 
     ylab=c('b','b'), 
     ylab.right = c('b','b'), 
     main=c('plot1','plot2'), 
     sub=c('plot3','plot4'), 
     scales =list(y = list(alternating= c(3,3)), 
        x = list(alternating= c(3,3)))) 

enter image description here

+0

감사합니다. 그러나이 레이아웃은 별도의 축이 없기 때문에 내 데이터를 모호하게합니다. 모두 축약되어 훨씬 더 복잡합니다. 나는 네 가지 별개의 산점도를 얻고 싶습니다. 각각의 산란도는 같은 스케일로 존재합니다. 게시물에서 내 전화처럼. R이 모든 하위 플롯에 동일한 척도를 사용하도록하는 방법이 있어야합니다. – user248237dfsf

+0

@ user248237 내 편집 내용을 볼 수 있습니다. – agstudy

+0

응답으로 편집하십시오 ... – user248237dfsf

2

답변이 이미 선택되었지만 해당 답변은 OP가 원했던베이스 R 대신 ggplot을 사용합니다. ggplot은 빠른 플로팅에 유용하지만 출판을 위해서는 종종 ggplot이 제공하는 것보다 더 세밀하게 제어해야합니다. 그것은 기본 플롯이 탁월한 곳입니다.

나는 par의 영리한 사용뿐만 아니라 layout()split.screen()를 사용하여 같은 몇 가지 다른 멋진 트릭과 협력 할 수있는 마법의 Sean Anderson's explanation을 읽는 건의 할 것입니다. 그의 설명을 사용

, 나는이 함께했다 :

# Assume that you are starting with some data, 
# rather than generating it on the fly 
data_mat <- matrix(rnorm(600), nrow=4, ncol=150) 
x_val <- iris$Petal.Width 

Ylim <- c(-3, 3) 
Xlim <- c(0, 2.5) 

# You'll need to make the ylimits the same if you want to share axes 


par(mfrow=c(2,2)) 
par(mar=c(0,0,0,0), oma=c(4,4,0.5,0.5)) 
par(mgp=c(1, 0.6, 0.5)) 
for (n in 1:4) { 
    plot(x_val, data_mat[n,], "p", asp=1, axes=FALSE, ylim=Ylim, xlim=Xlim) 
    box() 
    if(n %in% c(1,3)){ 
    axis(2, at=seq(Ylim[1]+0.5, Ylim[2]-0.5, by=0.5)) 
    } 
    if(n %in% c(3,4)){ 
    axis(1, at=seq(min(x_val), max(x_val), by=0.1)) 
    } 
} 

Plot with shared margins

아직 여기해야 할 몇 가지 작업이 있습니다. OP와 마찬가지로 데이터는 중간에 부각되어 보입니다. 물론 모든 플로팅 영역이 사용되도록 작업을 조정하는 것이 좋습니다.

관련 문제