Programing

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

lottogame 2020. 2. 11. 22:18
반응형

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


같은 줄거리에 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 에서이 작업을 수행하는 방법을 아는 사람이 있습니까?


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

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

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

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

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


다층 플롯을 구성 할 때는 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'철학은 데이터를 긴 형식으로 사용하는 것이 좋습니다. 해당 코드를 보려면 이 답변 https : //.com/a/19039094/1796914를 참조하십시오.


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

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

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


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기능을 처리하는 의미 도구이다.


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

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


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


화면을 분할하려면 다음과 같이하십시오.

(예를 들어 다음에 두 개의 플롯을 위해)

par(mfrow=c(1,2))

plot(x)

plot(y) 

참조 링크


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

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

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

배열로 플롯 할 값을 유지하는 대신 매트릭스에 저장하십시오. 기본적으로 전체 매트릭스는 하나의 데이터 세트로 취급됩니다. 그러나 행렬에 행이있을 때 같은 수의 수정 자 (예 : 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")

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


관용적 Matlab plot(x1,y1,x2,y2)은 다음과 ggplot2같은 방법으로 R로 번역 될 수 있습니다 .

x1 <- seq(1,10,.2)
df1 <- data.frame(x=x1,y=log(x1),type="Log")
x2 <- seq(1,10)
df2 <- data.frame(x=x2,y=cumsum(1/x2),type="Harmonic")

df <- rbind(df1,df2)

library(ggplot2)
ggplot(df)+geom_line(aes(x,y,colour=type))

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

ggplot2를 사용하여 다양한 x 축 범위를 가진 Zhao의 듀얼 라인 플롯을 Tingting에서 영감을 얻었 습니다 .


플롯 패키지 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")

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


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

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

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


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

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

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


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

작업 데모 스크린 샷 :

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

참고 URL : https://stackoverflow.com/questions/2564258/plot-two-graphs-in-same-plot-in-r



반응형