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

다음 코드를 사용하여의 그래프에 네 개의 플롯을 그리려고했습니다 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)


답변

사용중인 방법과 같은 것을 고수하고 싶다면 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 ()로 모든 레이블을 만들어야합니다. 줄거리 내의 주요 설정과 나는 그렇게 느끼고 싶지 않았습니다.


답변

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

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)))


답변

다음 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))

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


답변

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)

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