programing

동일한 그래프에 두 그래프 표시

goodsources 2023. 6. 5. 23:52
반응형

동일한 그래프에 두 그래프 표시

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

하지만 제가 이렇게 하면, 그들은 같은 플롯에 함께 그려지지 않습니다.

을 할 수 있습니다.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당신은 정말 흥미로운 그래프를 생성할 수 있을 것입니다.또 다른 책은 폴 머렐의 R 그래픽스입니다.

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

ggplot를 타일에데패합야니다해킹를로 패킹해야 .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):

처럼, 에지적된것처럼댓글것▁as.ggplot의 철학은 긴 형식의 데이터를 사용할 것을 제안합니다. 답변을 참조하여 해당 코드를 확인할 수 있습니다.

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

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그리고.y2한 동게평니다에서 됩니다.x점수 를 어느 에 맞게 합니다(Y을 Y더 큰 맞 조 합 니 정 다 게 값 에 축 니 y 다 합 ▁it ▁they1또는y2), 여기서 클립되는 다른 답변 중 일부와 달리y2만약 그것이 더 커지면,y1(ggplot 솔루션은 대부분 문제가 없습니다.)

또는 두 선의 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 ).

세로축 라벨이 얼마나 엉망인지 보세요!을 해야 . 야합니다설해정로다범므르위가합▁▁set▁to▁need▁would▁are▁different▁you▁ranges▁the야설 범ylim=c(lowest point between the two functions, highest point between the two functions)제가 지금 보여드리는 것보다 덜 쉽지요. 곡선을 두 개만 추가하는 것이 아니라 여러 개를 추가하는 것이 훨씬 덜 쉽습니다.


음모에 대해 항상 제가 혼란스러워했던 것은 다음과 같은 차이점입니다.curve그리고.lines(만약 이것들이 개의 중요한 플롯 명령어의 이름이라는 것을 기억할 없다면, 그냥 불러보세요.)

사이에 큰 차이점이 있습니다.curve그리고.lines.

curve 그림은 다과같함플롯다니합수를과 합니다.curve(sin).lines다음과 x및 y을 사용하여합니다.lines( x=0:10, y=sin(0:10) ).

작은: 그고여작차은이있습이다니점기에리있다▁and니습.curve으로 야합니다해출호다▁with▁called와 함께 불러야 .add=TRUE하려고 는 당이하일대해에는려반, 에면신에.lines이미 기존 플롯에 추가하는 것으로 가정합니다.

이드 & 사인

전화한 결과입니다.plot(0:2); curve(sin).


methods(plot) 그고확인을 확인하세요.body( plot.function )[[5]]에 전화할 때.plot(sin)R은 그것을 알아냅니다.sin 값이며, 는노함(노티 값)을 합니다.plot.function 메드서, 결호니다됩출을 부릅니다.curve.그렇게curve는 기능을 처리하기 위한 도구입니다.

그림을 두 개의 열(두 개의 그림이 서로 나란히 있음)로 분할하려면 다음과 같이 할 수 있습니다.

par(mfrow=c(1,2))

plot(x)

plot(y) 

참조 링크

@redmode에서 설명한 바와 같이, 다음을 사용하여 동일한 그래픽 장치에 두 개의 선을 플롯할 수 있습니다.ggplot이 답변에서 데이터는 '넓은' 형식이었습니다., 단을 사용할는 사를 합니다.ggplot일반적으로 데이터를 '긴' 형식으로 데이터 프레임에 보관하는 것이 가장 편리합니다. 다음, 그다그다를 '그룹화 변수다른 ' 변수'로 합니다.aes 인수,색상과 변수에 가 나타납니다.tics 선인 종 류 또 는 색 상 과 같 은 따 에 달 라 며 지 라 가 례 나 타 범 납 해 니 다 당 수 수 변 선 화 은 룹 성 속 그 의 ▁the ▁will 타 , , t , 납 ety 니 나 ics tics ▁arguments ▁line 다 가 ▁proper 례 ▁colour

이 경우, 우리는 다음을 사용할 수 있습니다.colour심미학 - 선의 색상을 데이터 세트의 다양한 변수 수준(여기서는 y1 대 y2)과 일치시킵니다.그러나 먼저 데이터를 광범위한 형식에서 긴 형식으로 녹여야 합니다. 예를 들어 '녹음'이라는 함수를 사용합니다.reshape2꾸러미데이터를 재구성하는 다른 방법은 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=...)추가할 플롯을 선택합니다.

점을 오버플로에 사용할 수 있습니다.

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

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

인 매트랩plot(x1,y1,x2,y2)를 사용하여 R로 번역할 수 있습니다.ggplot2예를 들어 다음과 같습니다.

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축 범위를 갖는 Tingting Zhao의 이중그림에서 영감을 받았습니다.

표시할 값을 배열로 유지하는 대신 행렬에 저장합니다.기본적으로 전체 행렬은 하나의 데이터 세트로 처리됩니다.그러나 행렬에 행이 있는 것처럼 동일한 수의 수식어(예: 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")

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

당신은 사용할 수 있습니다.ggplotly()여기서 ggplot2 예제 중 하나를 대화형 그림으로 전환하는 플롯 패키지의 함수이지만, 이러한 종류의 플롯은 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')

그러면 다음 그림이 생성됩니다.

여기에 이미지 설명 입력

용사를 합니다.plotly)에서 추출한 )plotly 및 y축 - 된 것 같습니다1차 y축 - y축 - 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))

작업 데모의 스크린샷:

여기에 이미지 설명 입력

우리는 또한 격자 라이브러리를 사용할 수 있습니다.

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

여기에 이미지 설명 입력

사용하다curve수학적 기능을 위한.그리고 add=를 사용합니다.TRUE: 동일한 그림과 축을 사용합니다.

curve( log2 , to=5     , col="black", ylab="log's(.)")
curve( log  , add=TRUE , col="red" )
curve( log10, add=TRUE , col="blue" )
abline( h=0 )

여기에 이미지 설명 입력

언급URL : https://stackoverflow.com/questions/2564258/plot-two-graphs-in-a-same-plot

반응형