R에서 하나의 그래프에 여러 플롯을 그리시겠습니까?


13

다음 코드를 사용하여의 그래프에 네 개의 플롯을 그리려고했습니다 R. 플롯 사이에 공간이 많기 때문에 그림에 만족하지 않으므로 플롯의 너비가 플롯을 분석하기에 충분하지 않습니다.

  1. 누군가 네 개의 플롯이있는 멋진 그래프를 생성하도록 도와 줄 수 있습니까?

  2. x 축 레이블을 기본 5 레이블 대신 1에서 10으로 유지하려면 어떻게해야합니까?

데이터:

a1 : 11.013 13.814 13.831 13.714 13.787 13.734 13.778 13.771 13.823 13.659

a2 : 5.181 7.747 8.314 8.061 7.920 8.153 8.540 8.845 7.881 8.301

b1, c1 및 d1에 a1 데이터를 사용했습니다. 여기서 b2, c2 및 d2에 대한 a2 데이터

그림:

여기에 이미지 설명을 입력하십시오

암호:

        op=par(mfrow=c(4,1), mar=c(5.5,5.1,4.1,2.1))
        plot(a1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="A")
        lines(a2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
        par(xpd=T)
        legend(1,26.5,c("X","Y"),bty="n",horiz=T,cex=1.5,col=c("red1","darkblue"),text.col=c("red1","darkblue"),pch=c(1,3),lty=c(2,3),x.intersp=0.4,adj=0.2)
        plot(b1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="B")
        lines(b2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
        plot(c1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="C")
        lines(c2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
        plot(d1/1000, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="D")
        lines(d2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
   > mtext("Price", side=2, at=100,line=3,cex=1.1)

1
pls는 당신의 자료의 세부 사항을 줄 수 있습니까? 아마도 dput (data_from_r)
suncoolsu

@ suncoolsu, 나는 샘플 데이터로 질문을 업데이트했습니다. 감사합니다.
사마 라사

범례가있는 동일한 축에 2 가지 색상과 4 가지 선 유형이있는 경우 어떻게됩니까? 그 코드와 결과를보고 싶습니다.
Paul

@ user87 : 4 개의 플롯이 4 개의 다른 실험에서 나온 것입니다. 따라서 실험 결과를 분석하기 위해 4 개의 플롯을 그리는 것이 좋습니다.
사마 라사

@ user87, 무슨 말인지 잘 모르겠습니다. 새 질문 누군가가 대답 할 시작 아마도 경우 (나는 :) 것)
브랜든 Bertelsen

답변:


16

사용중인 방법과 같은 것을 고수하고 싶다면 layout () 명령을 배우고 싶을 것입니다. 몇 가지 다른 세부 사항이 변경되어 그래프를 훨씬 더 가깝게 얻을 수 있습니다. 또한 그래프간에 변경되는 고유 한 사항 (예 : 데이터 및 여백)을 넣은 다음 루프를 통과 할 수도 있습니다. 또한 직접 axis () 명령으로 하단 축을 만들었으므로 항목의 위치를 ​​제어 할 수 있습니다.

layout(matrix(1:5, ncol = 1), widths = 1,
        heights = c(1,5,5,5,7), respect = FALSE)
par(mar=c(0, 4, 0, 0))
plot(1, type = 'n', axes = FALSE, bty = 'n', ylab = '')
legend('left', , c("X","Y"), bty="n", horiz=T, cex=1.5, col=c("red1","darkblue"), text.col=c("red1","darkblue"), pch=c(1,3), lty=c(2,3), x.intersp=0.4,adj=0.2)
par(mar=c(0, 4, 2, 1), bty = 'o')
plot(a1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", xaxt = 'n', cex.axis=1.4, cex.lab=1.3,cex=1.2, lwd=2.5, col="red1", lty=2, pch=1, main="A")
lines(a2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
par(xpd=T)
plot(b1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", xaxt = 'n', cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="B")
lines(b2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
plot(c1, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", xaxt = 'n', cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="C")
lines(c2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
par(mar=c(4, 4, 2, 1))
plot(d1/1000, type="b", ylim=c(0,14.5), xlab="Time (secs)", ylab="", xaxt = 'n', cex.axis=1.4, cex.lab=1.3,cex=1.2,lwd=2.5,col="red1",lty=2,pch=1, main="D")
lines(d2,type="b",pch=3,lty=3,col="darkblue",lwd=2.5,cex=1.2)
mtext("Price", side=2, at=40,line=2.5,cex=1.1)
axis(1, 1:10, cex.axis = 1.4)

줄거리

나는 이것을 가능한 한 좋게 만드는 데 노력을 기울이지 않았으며 첫 번째 더미 그래프를 만드는 대신 첫 번째 프레임에서 충분한 공간을 설정할 수있었습니다. 불행히도 mar () 설정은 프레임을 채우려 고 시도하고 위쪽 여백은 그래프 위의 레이블이 떨어진 거리에 영향을 미치므로 사용하지 않고 mtext () 또는 text ()로 모든 레이블을 만들어야합니다. 줄거리 내의 주요 설정과 나는 그렇게 느끼고 싶지 않았습니다.


기본 그래픽의 경우 +1입니다. layout () 명령으로 멋진 것을 작성하려고 헛되이 노력했습니다. 다음에 다시 사용해야 할 때 다시 올게요.
Chris Beeley

13

격자 그래픽 패키지를 배우는 것이 좋습니다. 몇 줄로 원하는 것에 가까이 갈 수 있습니다. 먼저 데이터를 다음과 같이 데이터 프레임에 패키징하십시오.

dat <- data.frame (x=rep (1:10, 8), y=c(a1, a2, b1, b2, c1, c2, d1, d2),
        var=factor (rep (c("X", "Y"), each=10)),
        graph=factor (rep (c("A", "B", "C", "D"), each=20)))

결과는 다음과 같습니다.

    x           y var graph
1   1 0.556372979   X     A
2   2 0.754257646   X     A
3   3 0.815432905   X     A
4   4 0.559513013   X     A
5   5 0.763368168   X     A
6   6 0.426415259   X     A
7   7 0.597962532   X     A
8   8 0.723780143   X     A
9   9 0.228920116   X     A
10 10 0.607378894   X     A
11  1 0.865114425   Y     A
12  2 0.919804947   Y     A
13  3 0.437003794   Y     A
14  4 0.203349303   Y     A
15  5 0.620425977   Y     A
16  6 0.703170299   Y     A
17  7 0.174297656   Y     A
18  8 0.698144659   Y     A
19  9 0.732527016   Y     A
20 10 0.778057398   Y     A
21  1 0.355583032   X     B
22  2 0.015765144   X     B
23  3 0.315004753   X     B
24  4 0.257723585   X     B
25  5 0.506324279   X     B
26  6 0.028634427   X     B
27  7 0.475360443   X     B
28  8 0.577119754   X     B
29  9 0.709063777   X     B
30 10 0.308695235   X     B
31  1 0.852567748   Y     B
32  2 0.938889121   Y     B
33  3 0.080869739   Y     B
34  4 0.732318482   Y     B
35  5 0.325673156   Y     B
36  6 0.378161864   Y     B
37  7 0.830962248   Y     B
38  8 0.990504039   Y     B
39  9 0.331377188   Y     B
40 10 0.448251682   Y     B
41  1 0.967255983   X     C
42  2 0.722894624   X     C
43  3 0.039523960   X     C
44  4 0.003774719   X     C
45  5 0.218605160   X     C
46  6 0.722304874   X     C
47  7 0.576140686   X     C
48  8 0.108219812   X     C
49  9 0.258440127   X     C
50 10 0.739656846   X     C
51  1 0.528278201   Y     C
52  2 0.104415716   Y     C
53  3 0.966076056   Y     C
54  4 0.504415150   Y     C
55  5 0.655384900   Y     C
56  6 0.247340395   Y     C
57  7 0.193857228   Y     C
58  8 0.019133583   Y     C
59  9 0.799404908   Y     C
60 10 0.159209090   Y     C
61  1 0.422574508   X     D
62  2 0.823192614   X     D
63  3 0.808715876   X     D
64  4 0.770499188   X     D
65  5 0.049138399   X     D
66  6 0.747017767   X     D
67  7 0.239916970   X     D
68  8 0.152777362   X     D
69  9 0.052862276   X     D
70 10 0.937605577   X     D
71  1 0.850112019   Y     D
72  2 0.675407232   Y     D
73  3 0.273276166   Y     D
74  4 0.455995477   Y     D
75  5 0.695497498   Y     D
76  6 0.688414035   Y     D
77  7 0.454013633   Y     D
78  8 0.874853452   Y     D
79  9 0.568746031   Y     D

그런 다음 격자를 사용하십시오 xyplot.

library (lattice)
xyplot (y ~ x | graph, groups=var, data=dat, type="o",
        layout=c(1, 4), as.table=T, xlab="Time (secs)", ylab="Price")

다음과 같은 멋진 그래프가 생성됩니다.

여기에 이미지 설명을 입력하십시오

편집하다:

다른 기호와 선을 갖고 범례에 표시하려는 경우 문자 그대로 범례를 직접 작성하고 직접 격자를 재정의하지 않은 경우 기본 격자 색상을 얻는 방법을 알아야하기 때문에 복잡해집니다. :

my.text <- levels (dat$var)
my.lty <- c(2, 3)
my.pch <- c(1, 2)
my.col <- trellis.par.get ("superpose.symbol")$col[1:2]
xyplot (y ~ x | graph, groups=var, data=dat, type="o", pch=my.pch, lty=my.lty,
        main="Main Title", layout=c(1, 4), as.table=T, xlab="Time (secs)", ylab="Price",
        key=list (columns=2, text=list (my.text), points=list (pch=my.pch, col=my.col)))

여기에 이미지 설명을 입력하십시오

편집 2 :

두 범주가 "X"및 "Y"와 같이 단순하면 코드와 그래프를 단순화 할 수 있습니다.

xyplot (y ~ x | graph, groups=var, data=dat, type="o", pch=c("X", "Y"), cex=1.25, lty=c(2, 3),
        layout=c(1, 4), as.table=T, xlab="Time (secs)", ylab="Price")

"X"와 "Y"를 점 기호로 사용합니다. 전혀 범례가 필요하지 않으며 그래프 자체에 더 많은 공간을 할당 할 수 있습니다. (반면, 모양이 마음에 들지 않거나 점의 정확한 중심을 결정하기가 더 어려울 수도 있지만, 선이 각 점을 통과 한 이후로 큰 문제는 아닙니다.)

편집 3 :

실제로, strip=F, strip.left=T,그래프 왼쪽에 A, B, C, D, 레이블을 배치하려면 플롯에 추가해야합니다 . 이렇게하면 다음과 같이 긴 그래프에 더 많은 공간이 생깁니다.

xyplot (y ~ x | graph, groups=var, data=dat, type="o", pch=my.pch, lty=my.lty,
        main="Main Title", layout=c(1, 4), as.table=T, xlab="Time (secs)", ylab="Price",
        strip.left=T, strip=F,
        key=list (columns=2, text=list (my.text), points=list (pch=my.pch, col=my.col),
        lines=list (lty=my.lty, col=my.col)))

여기에 이미지 설명을 입력하십시오


@ Wayne : space = "top", pch = c (1,2), lty = c (2,4) 인수와 함께 auto.key를 사용하여 그래프 위에 범례를 유지하려고하지만 pch 값과 lty 값이 작동하지 않습니다. 또한 범례에서 X와 Y를 가로로 유지하고 싶습니다. 이것 좀 도와주세요.
사마 라사

예. 종이에 X와 Y를 구별하려면 다른 pch 값을 사용해야합니다. xyplot에 pch (1,4) 인수를 추가하여 플롯에서 다른 pch 값을 사용할 수 있지만 범례에는 반영되지 않습니다. 범례에서 X 및 Y에 대해 다른 pch 값을 사용하는 방법을 알려주십시오.
사마 라사

좋아, 집에 돌아와서 책을 참고하면 알아 차렸다 편집 된 버전을 확인하십시오.
Wayne

문제 없어요. 내 편집 3은 원본과 비슷한 (그러나 더 잘 보이고 더 많은 그래프 공간을 가진) 최고의 그래프를 제공한다고 생각합니다. 나는 전설을 옮기지 않았다. 선이 범례의 요점을 통과하도록하려면 다음 복잡성 수준으로 가져 와서 사용자 정의 grobs를 만드는 draw.key 항목을 수행해야한다고 생각합니다 ( grid격자에 격자 및 ggplot2 빌드). .
Wayne

네, 이제 그래프가 더 좋습니다. 그러나 일반 플롯 함수를 사용하는 것처럼 범례의 선을 넘어 점을 얻는다면 정말 좋습니다.
사마 라사

9

다음 ggplot2은 원하는 범례 동작을 통합 한 @Brandon 솔루션 버전입니다 .

dat <- data.frame (x=rep (1:10, 8), y=runif(80),
        var=factor (rep (c("X", "Y"), each=10)),
        graph=factor (rep (c("A", "B", "C", "D"), each=20)))

ggplot(data = dat,aes(x = x, y = y)) + 
    facet_wrap(~graph,nrow = 4) + 
    geom_point(aes(shape = var)) + 
    geom_line(aes(colour = var, group = var)) + 
    labs(x = NULL, y = NULL, shape = "", colour = "") + 
    theme_bw() + 
    opts(legend.position = "top", legend.direction = "horizontal")

여기에 이미지 설명을 입력하십시오

나는 전설이 훨씬 쉽지만 ggplot2YMMV에서 발견합니다.

편집하다

의견에서 몇 가지 질문을 해결. 특정 시점 또는 라인 유형을 지정하려면 다음을 사용 scale_aesthetic_manualaesthetic중 하나입니다 shape, linetype예를 들어 등 :

ggplot(data = dat,aes(x = x, y = y)) + 
    facet_wrap(~graph,nrow = 4) + 
    geom_point(aes(shape = var)) + 
    geom_line(aes(colour = var, linetype = var, group = var)) + 
    labs(x = NULL, y = NULL, shape = "", colour = "", linetype = "") + 
    scale_shape_manual(values = 4:5) +
    theme_bw() + 
    opts(legend.position = "top", legend.direction = "horizontal")

다양한 축 레이블의 크기를 변경하려면 일반적으로을 사용하여 테마의 설정을 변경하면됩니다 opts(). 예를 들어 :

ggplot(data = dat,aes(x = x, y = y)) + 
    facet_wrap(~graph,nrow = 4) + 
    geom_point(aes(shape = var)) + 
    geom_line(aes(colour = var, linetype = var, group = var)) + 
    labs(x = "X Label", y = "Y Label", shape = "", colour = "", linetype = "") + 
    theme_bw() + 
    opts(legend.position = "top", legend.direction = "horizontal",
         axis.text.x = theme_text(size = 15),axis.title.y = theme_text(size = 25, angle = 90))

자세한 내용 은 웹 사이트 와 그의 책을 참조하십시오.


2
나는 종종 ggplot2를 선호합니다. 실제로 격자가 너무 복잡해지면 ggplot2로 빠르게 시도해 보았고 모양과 선 스타일을 명시 적으로 선택하려는 경우 범례가 점 / 선 스타일을 올바르게 반영 할 수 없다는 것을 알았습니다. 아마 잘못된 방법으로 그래프에서 작동했지만 ggplot의 범례 생성을 속였습니다. 그것이 당신을 위해 작동하고 코드를 게시 할 수 있습니까?
Wayne

@Joran : 선 종류와 점 종류, 색을 바꾸려고 노력했지만 성공하지 못했습니다. 선 종류 등을 변경하는 방법을 알려 주시겠습니까? 또한 x 및 y 실험실의 크기를 늘리는 방법도 알려주십시오.
사마 라사

나는 지금 전화를 받고있다. 원하는 것을 가지고 집에 가기 전에 @Brandon이 그의 답변을 편집하지 않으면 나중에 오늘 밤에 답변을 얻을 것입니다.
joran

8

Wayne의 답변과 마찬가지로 다른 패키지도 사용합니다. ggplot2

library(ggplot2) 

df <- data.frame(
parameter=runif(300),
Time=1:300,
split=sample(c(1:4),300,replace=T),
split2=sample(c(1:2),300,replace=T)
)

ggplot(df, aes(Time, parameter, colour=as.factor(split2))) + 
geom_line() + 
facet_wrap(~split,nrow=4)

다음과 같은 차트를 제공합니다.

여기에 이미지 설명을 입력하십시오


1
나는 ggplot의 그리드를 좋아하지만 밝은 회색 배경을 끄는 방법이 있습니까?
bluepole

1
+ opts(panel.background=theme_blank())
Brandon Bertelsen

1
다른 변경을 원한다면 입력 theme_get()하여 변경할 수있는 것을 볼 수 있습니다. 그런 다음 마지막 코멘트와 동일한 패턴을 따르십시오.=theme_blank()
Brandon Bertelsen

2
나는 ggplot2를 스스로 할 것이지만 아마도 격자가 더 쉬운 단계라고 생각했다. 어느 쪽이든 이와 같은 그래프를 쌓을 수있는 구조화 된 방법을 제공합니다. 많은 세부 사항을 조정하면 어려울 수 있지만 매력적이고 읽기 쉬운 것을 얻는 것은 쉽습니다. (그래프에 물건을 던지는 대신 데이터를 그래프로 표시 할 올바른 데이터 프레임을 만드는 데 집중해야합니다.
Wayne

Hadley는 데이터를 올바른 모양으로 마사지하기 위해 다른 패키지에 데이터 조작 도구를 제공했습니다. 의심이된다면 대답은 대개 다음과 같습니다.melt()
Brandon Bertelsen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.