R에서 같은 플롯으로 두 개의 그래프를 플로팅


571

같은 줄거리에 y1과 y2를 플로팅하고 싶습니다.

x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)
plot(x, y1, type = "l", col = "red")
plot(x, y2, type = "l", col = "green")

그러나 내가 이것을 이렇게 할 때, 그들은 같은 음모로 함께 그려지지 않습니다.

Matlab에서 할 수는 hold on있지만 R 에서이 작업을 수행하는 방법을 아는 사람이 있습니까?


3
확인하십시오 ?curve. 사용하십시오 add=TRUE.
동 형사상

더 구체적인 ggplot2 답변에 대해서는 이 질문 을 참조하십시오 .
Axeman

답변:


617

lines()또는 points()기존 그래프에 추가되지만 새 창을 만들지는 않습니다. 따라서해야 할 일

plot(x,y1,type="l",col="red")
lines(x,y2,col="green")

10
다음 간단한 예제에서 왜 작동하지 않습니까? > plot (sin)> lines (cos) as.double (y) 오류 : 'builtin'유형을 'double'유형의 벡터로 강제 변환 할 수 없음
Frank

23
이것은보기 쉽다. plot (sin)을 사용하면 실제 데이터 대신 함수를 전달합니다. plot ()이이를 감지하고 plot.function ()을 사용하여 함수를 플로팅합니다 (여러 디스패치에서 읽어서 자세히 알아보십시오). 그러나 lines.function ()이 정의되어 있지 않으므로 lines ()은 class 함수의 매개 변수로 무엇을해야하는지 알 수 없습니다. 행은 클래스 ts의 데이터 및 시계열 개체 만 처리 할 수 ​​있습니다.
Soumendra

27
@Frank 다음과 같이하십시오 : plot(sin); curve(cos, add=TRUE).
동 형사상

2
x가 다른 경우 어떻게 사용합니까? 한 그래프에 x1과 y1이 있고 동일한 그래프에 x2와 y2의 다른 그래프를 추가한다고 가정 해보십시오. x1과 x2는 범위는 같지만 값이 다릅니다.
Kavipriya

1
정확히 동일합니다.lines(x2,y2,...)lines(x,y2,...)
bnaul

220

par동일한 그래프이지만 다른 축에서 플롯하고 사용할 수도 있습니다 . 다음과 같은 것 :

plot( x, y1, type="l", col="red" )
par(new=TRUE)
plot( x, y2, type="l", col="green" )

당신이에 대해 자세히 읽어 경우 parR, 당신은 정말 흥미로운 그래프를 생성 할 수 있습니다. 또 다른 책은 Paul Murrel의 R Graphics입니다.


3
"그림을"기능을 찾을 수 없습니다 : (TRUE 그림 (새 =)) 파 오류 : 내 R은 나에게 오류 제공
알레산드로 Jacopson을

5
귀하의 방법은 두 플롯에 대해 올바른 척도 (y 축)를 유지합니까?
Alessandro Jacopson 2016 년

1
@uvts_cvs 예, 원래 그래프를 토토에 유지합니다.
Sam

10
이것의 문제는 여러 플롯 요소를 다시 작성한다는 것입니다. 나는 xlab="", ylab="", ...두 번째에 몇 가지를 포함시킬 것 plot입니다.
isomorphismes

118

다층 플롯을 구성 할 때는 ggplot패키지 를 고려해야 합니다. 아이디어는 기본 미학으로 그래픽 객체를 만들고 점진적으로 향상시키는 것입니다.

ggplotstyle은 데이터를 압축해야합니다 data.frame.

# Data generation
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
df <- data.frame(x,y1,y2)

기본 솔루션 :

require(ggplot2)

ggplot(df, aes(x)) +                    # basic graphical object
  geom_line(aes(y=y1), colour="red") +  # first layer
  geom_line(aes(y=y2), colour="green")  # second layer

여기에 + operator기본 객체에 추가 레이어를 추가하는 데 사용됩니다.

함께 ggplot하면 플롯의 모든 단계에서 그래픽 개체에 액세스 할 수 있습니다. 일반적인 단계별 설정은 다음과 같습니다.

g <- ggplot(df, aes(x))
g <- g + geom_line(aes(y=y1), colour="red")
g <- g + geom_line(aes(y=y2), colour="green")
g

g플롯을 생성하고 모든 단계에서 (적어도 하나 이상의 레이어를 만든 후) 볼 수 있습니다. 플롯의 추가 마법은 생성 된 객체로도 만들어집니다. 예를 들어 축에 레이블을 추가 할 수 있습니다.

g <- g + ylab("Y") + xlab("X")
g

최종 g모습 :

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

업데이트 (2013-11-08) :

의견에서 지적했듯이 ggplot'철학은 데이터를 긴 형식으로 사용하는 것이 좋습니다. 해당 코드를 보려면 이 답변 을 참조하십시오.


5
Henrik 에서 제안한 대로 데이터는 실제로 "긴"형식 ggplot이어야하며 사용하는 "와이드"형식보다 자연스럽게 처리해야합니다.
krlmlr

1
@Henrik : 아니요, 우선 답변을 주셔서 감사합니다. 아마도이 답변의 저자는 ggplot'철학' 에 잘 맞도록 편집 할 수 있습니다 .
krlmlr

1
@krlmlr, 나는 질문을보다 명확하게 다루기 위해 대답을 편집하려고했습니다. 추가 업데이트를 제안하십시오. 건배.
Henrik

3
ggplot (aes ())에 x를 정의하고 geom _ * ()에 y를 정의하는 방법을 가르쳐주었습니다. 좋은!
Dan

41

나는 당신이 찾고있는 대답은 다음과 같습니다.

plot(first thing to plot)
plot(second thing to plot,add=TRUE)

25
이것은 작동하지 않는 것 같습니다. "add" is not a graphical parameter경고를 한 다음 첫 번째 플롯 위에 두 번째 플롯을 인쇄합니다.
Waldir Leoncio


이것의 좋은 장점 중 하나는 축 제한과 제목을 일관성있게 유지하는 것 같습니다. 이전 방법 중 일부는 더 많은 옵션을 지정하는 데 어려움을 겪지 않는 한 R이 y 축에 두 세트의 눈금을 그립니다. 말할 것도없이, 축에 두 세트의 눈금이 있으면 오해의 소지가 있습니다.
RMurphy

1
추가 매개 변수는 R의 기본 / 기본 하나 몇 가지 플롯 방법에 대한 작동하지만,하지
cloudscomputes

2
나는 같은 오류가 발생했습니다 "add" is not a graphical parameter. 내 R은 R version 3.2.3 (2015-12-10)입니다. par(new=TRUE)이 플롯간에 명령을 사용할 수 있습니다 .
quepas

29

matplot기능을 사용하십시오 :

matplot(x, cbind(y1,y2),type="l",col=c("red","green"),lty=c(1,1))

동일한 지점 에서 평가 된 경우 y1이를 사용하십시오 . 그것은 더 큰 경우에 클리핑 될 다른 답변 중 일부와 달리 ( 또는 ) 더 큰 것에 맞추기 위해 Y 축의 배율을 조정합니다 (ggplot 솔루션은 대부분 괜찮습니다).y2xy1y2y2y1

또는 두 선에 동일한 x 좌표가없는 경우 첫 번째 플롯에서 축 제한을 설정하고 다음을 추가하십시오.

x1  <- seq(-2, 2, 0.05)
x2  <- seq(-3, 3, 0.05)
y1 <- pnorm(x1)
y2 <- pnorm(x2,1,1)

plot(x1,y1,ylim=range(c(y1,y2)),xlim=range(c(x1,x2)), type="l",col="red")
lines(x2,y2,col="green")

이 Q가 4 살이고 아무도 언급하지 않았 matplot거나 x/ylim...


25

tl; dr :curve (와 함께 add=TRUE) 또는 을 사용하려고합니다 lines.


par(new=TRUE)눈금 표시와 축 레이블을 두 번 인쇄하므로 동의하지 않습니다 . 예 :

사인과 포물선

의 출력입니다 plot(sin); par(new=T); plot( function(x) x**2 ).

세로 축 레이블이 어떻게 엉망인지보십시오! 범위가 다르기 때문에 설정해야 할 것입니다 ylim=c(lowest point between the two functions, highest point between the two functions). 이는 내가 보여 드리려는 보다 쉽지 않으며, 두 개의 곡선을 추가하려는 것이 아니라 많은 곡선을 추가하려는 경우 덜 쉽습니다.


무엇 항상 음모를 꾸미고에 대해 저를 혼동하는 것은 사이의 차이 curvelines. 다음은 두 가지 중요한 플로팅 명령의 이름이라는 것을 기억 할 수없는 경우 (단지 노래 십시오.)

여기 사이의 큰 차이점 curvelines.

curve와 같은 함수를 그릴 것 curve(sin)입니다. lines다음과 같이 x 및 y 값으로 점을 플로팅 lines( x=0:10, y=sin(0:10) )합니다.

그리고 여기에는 약간의 차이가 있습니다. 수행하려는 작업에 대해 curve호출 add=TRUE해야하지만 lines기존 플롯에 추가한다고 가정합니다.

아이디와 사인

호출 결과는 다음과 같습니다 plot(0:2); curve(sin).


뒤에서을 확인하십시오 methods(plot). 그리고 확인하십시오 body( plot.function )[[5]]. plot(sin)R 을 호출 sin하면 함수 (y 값이 아님)를 파악 하고 plot.function메소드를 사용하여 호출 curve합니다. 그래서 curve기능을 처리하는 의미 도구이다.


17

플롯을 두 개의 열 (서로 옆에 2 개의 플롯)으로 나누려면 다음과 같이 할 수 있습니다.

par(mfrow=c(1,2))

plot(x)

plot(y) 

참조 링크


16

@redmode에서 설명했듯이을 사용하여 동일한 그래픽 장치에서 두 줄을 그릴 수 있습니다 ggplot. 그 대답에서 데이터는 '와이드'형식이었습니다. 그러나 사용 ggplot하는 경우 일반적으로 데이터를 데이터 형식으로 '긴'형식으로 유지하는 것이 가장 편리합니다. 그런 다음 다른 '그룹화 변수'를 사용하여aes 주제 인수 선 종류 또는 색상과 같은 선의 속성이 그룹화 변수에 따라 달라지고 해당 범례가 나타납니다.

이 경우, colour데이터 세트의 여러 변수 레벨에 대한 선 색상과 일치 하는 가설을 사용할 수 있습니다 (여기서 y1 대 y2). 그러나 먼저 reshape2패키지의 'melt'함수를 사용하여 데이터를 와이드 형식에서 긴 형식으로 녹여야 합니다. 데이터를 재구성하는 다른 방법은 여기에 설명되어 있습니다. data.frame을 와이드에서 긴 형식 으로 재구성 .

library(ggplot2)
library(reshape2)

# original data in a 'wide' format
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)
df <- data.frame(x, y1, y2)

# melt the data to a long format
df2 <- melt(data = df, id.vars = "x")

# plot, using the aesthetics argument 'colour'
ggplot(data = df2, aes(x = x, y = value, colour = variable)) + geom_line()

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


15

격자 / 격자 그래픽이 아닌 기본 그래픽을 사용하는 경우 점 / 선 / 다각형 함수를 사용하여 새 플롯을 시작하지 않고 플롯에 세부 정보를 추가하여 MATLAB의 홀드 기능을 모방 할 수 있습니다. 멀티 플롯 레이아웃의 경우 par(mfg=...)사물을 추가 할 플롯을 선택할 수 있습니다 .


14

오버 플롯에 포인트를 사용할 수 있습니다.

plot(x1, y1,col='red')

points(x2,y2,col='blue')

7

배열로 플롯 할 값을 유지하지 않고 매트릭스에 저장하십시오. 기본적으로 전체 매트릭스는 하나의 데이터 세트로 취급됩니다. 그러나 행렬에 행이있을 때 같은 수의 수정 자 (예 : col ())를 플롯에 추가하면 R은 각 행이 독립적으로 처리되어야 함을 알 수 있습니다. 예를 들면 다음과 같습니다.

x = matrix( c(21,50,80,41), nrow=2 )
y = matrix( c(1,2,1,2), nrow=2 )
plot(x, y, col("red","blue")

데이터 세트의 크기가 다른 경우가 아니면 작동합니다.


이것은 제공 : 오류가있는 경우 (as.factor)에서 {: 인수가 논리적으로 해석하지 않습니다
baouss


5

플롯 패키지 의 ggplotly()함수를 사용하여 gggplot2 예제 중 하나를 대화식 플롯으로 바꿀 수 있지만 ggplot2 없이는 이런 종류의 플롯이 더 좋습니다 .

# call Plotly and enter username and key
library(plotly)
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)

plot_ly(x = x) %>%
  add_lines(y = y1, color = I("red"), name = "Red") %>%
  add_lines(y = y2, color = I("green"), name = "Green")

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


음모가 훌륭해 보인다. 이거 공짜인가요 ?
데니스

@denis, 무제한 무료 공개 플로팅 및 유료 개인 플로팅 또는 사내 옵션이 있습니다. 참고 항목 계획 페이지를 .
Mateo Sanchez

4
대부분의 R 패키지는 100 % 무료이며 오픈 소스입니다 (MIT 라이센스). 음모 계정이 있거나없는 계정으로 사용할 수 있습니다.
카슨

4

ggvis를 사용하여 플롯을 만들 수도 있습니다 .

library(ggvis)

x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
df <- data.frame(x, y1, y2)

df %>%
  ggvis(~x, ~y1, stroke := 'red') %>%
  layer_paths() %>%
  layer_paths(data = df, x = ~x, y = ~y2, stroke := 'blue')

다음과 같은 플롯이 생성됩니다.

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


2

사용 plotly( plotly1 차 및 2 차 y 축으로 솔루션 추가- 누락 된 것으로 보입니다) :

library(plotly)     
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)

df=cbind.data.frame(x,y1,y2)

  plot_ly(df) %>%
    add_trace(x=~x,y=~y1,name = 'Line 1',type = 'scatter',mode = 'lines+markers',connectgaps = TRUE) %>%
    add_trace(x=~x,y=~y2,name = 'Line 2',type = 'scatter',mode = 'lines+markers',connectgaps = TRUE,yaxis = "y2") %>%
    layout(title = 'Title',
       xaxis = list(title = "X-axis title"),
       yaxis2 = list(side = 'right', overlaying = "y", title = 'secondary y axis', showgrid = FALSE, zeroline = FALSE))

작업 데모 스크린 샷 :

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


코드를 컴파일하고 작동하지 않습니다. 먼저 %> %로 오류를 표시하고 삭제 한 다음 Error in library(plotly) : there is no package called ‘plotly’왜 오류를 표시 합니까?
Bellatrix 2016 년

패키지를 설치 했습니까 plotly? install.packages("plotly")명령 을 사용하여 패키지를 설치해야합니다 .
Saurabh Chauhan 2016 년

1

격자 라이브러리를 사용할 수도 있습니다

library(lattice)
x <- seq(-2,2,0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
xyplot(y1 + y2 ~ x, ylab = "y1 and y2", type = "l", auto.key = list(points = FALSE,lines = TRUE))

특정 색상

xyplot(y1 + y2 ~ x,ylab = "y1 and y2", type = "l", auto.key = list(points = F,lines = T), par.settings = list(superpose.line = list(col = c("red","green"))))

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.