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" )
당신이에 대해 자세히 읽어 경우 par
에 R
, 당신은 정말 흥미로운 그래프를 생성 할 수 있습니다. 또 다른 책은 Paul Murrel의 R Graphics입니다.
다층 플롯을 구성 할 때는 ggplot
패키지 를 고려해야 합니다. 아이디어는 기본 미학으로 그래픽 객체를 만들고 점진적으로 향상시키는 것입니다.
ggplot
style은 데이터를 압축해야합니다 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 솔루션은 대부분 괜찮습니다).y2
x
y1
y2
y2
y1
또는 두 선에 동일한 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)
, 이는 내가 보여 드리려는 것 보다 쉽지 않으며, 두 개의 곡선을 추가하려는 것이 아니라 많은 곡선을 추가하려는 경우 덜 쉽습니다.
무엇 항상 음모를 꾸미고에 대해 저를 혼동하는 것은 사이의 차이 curve
와 lines
. (이것이 두 가지 중요한 플로팅 명령의 이름이라는 것을 기억할 수 없다면 노래 만 부르 십시오.)
여기 사이의 큰 차이점 curve
및 lines
.
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
( plotly
1 차 및 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
'Programing' 카테고리의 다른 글
Android Studio에서 전체 프로젝트에서 모든 문자열을 검색하십시오. (0) | 2020.02.11 |
---|---|
다른 div 안에 div를 세로로 가운데에 맞추기 (0) | 2020.02.11 |
mysqldump로 특정 테이블 건너 뛰기 (0) | 2020.02.11 |
Visual Studio에서 일치하는 중괄호로 이동 하시겠습니까? (0) | 2020.02.11 |
Java에서 유형 목록과 유형 ArrayList (0) | 2020.02.11 |