전산통계학 9주차 강의 - 3dplot, Curve, graph, Legends, leyout, multipleview, Outer, persp, teachingdemos
코딩 공부/R-전산 통계학 2019. 12. 16. 23:40Graph 그리기는 다음과 같은 순서를 기억
High-Level Plot Functions ; 우선 그래프부터 그리고 난 후에
Low-Level Plot Functions ; 입력되어 있는 high lever 의 안에다가 y=x 처럼 문자를 투입시킬 수 있다
High-Level
# DATA
x <- rnorm(50); y <- rnorm(50)
group <- rbinom(50, size=1, prob=.5) 확률론내용 : n=1 <- bernoulli , 성공확률=0.5 , 이 행위를 50번 실행
group
plot(x,y)
새창으로 보고싶다면 윈도우에 한해서 win.graph() 를 치고나서 다시 plot를 치자
plot(x, y, xlab="X", ylab="Y", sub="ANG?", main="Oh! jesus", pch=22, col="orange")
타이틀을 설정하는 셈;
x축 이름, y축 이름, 그래프 이름, pch=좌표의 모양은 리퍼런스1 자료에 모양 및 번호가 나와있다
해당 자료를 찾는 것이 귀찮다면 다음 링크를 참고하며 공부하는 것도 좋습니다
https://rfriend.tistory.com/149
plot(x, y, xlab="X", ylab="Y", main="Y vs X",
pch=ifelse(group==1, 5, 19),
col=ifelse(group==1, "red", "blue"))
위와 같이 우리가 함수를 작성할 때 쓰던 명령어들도 plot 을 그릴 때, 논리와 순서만 맞다면 충분히 쉽게 작성할 수 있다
<첨언>
다음 밑의 명령어를 입력함으로써, type = "" 에 따라서 어떤 식으로 plot 이 작성되는지 알아보자
plot(x, y, xlab="X", ylab="Y", main="Y vs X", type="n")
plot(x, y, xlab="X", ylab="Y", main="Y vs X", type="l")
plot(x, y, xlab="X", ylab="Y", main="Y vs X", type="p")
Low-Level
points(x[group==1], y[group==1], pch=5, col="red")
처음에 위에서 group= 버놀리 였음을 기억하자 = 0또는 1밖에 값이 없다
points(x[group==0], y[group==0], pch=19, col="blue")
plot(x, y, xlab="X", ylab="Y", main="Y vs X", type="n")
points(cbind(x,y)[group==1,], pch=5, col="red")
위에서와 차이는 x,y를 따로 한건데 밑에서는 행렬로 만들고 한번에 한 것 ; 그냥 위의 명령어로 적어서 혼동을 줄이는 것이 좋아보임
points(cbind(x,y)[group==0,], pch=19, col="blue")
plot(sort(x), sort(y), type="p", lty=4, lwd=3, col="blue")
type에서는 p=점들 \b=빈 공백들은 짥은선분\ l=선분 으로 표시되고, lty 와 lwd 는 각각 선분모양, 선분굵기를 말한다
plot(x, y, type="n")
lines(sort(x), sort(y), type="b") 점타입의 선을 그어라
lines(cbind(sort(x),sort(y)), type="l", lty=1, col="blue") 역시 선을 그어라
Histogram
hist(x, main="Histogram of X", col="peru")
hist(x, freq=FALSE, col="red", main="Histogram with Normal Curve")
위의 명령어를 입력해보고, 어떤 그림인지 알아보자
Basic boxplot
boxplot(x, main="Boxplot of X", border="dark sea green", lwd=2)
boxplot(x, main="Boxplot of X", border="dark sea green", lwd=2, horizontal = T)
여기서 horizental 은 무슨 명령어일까?
boxplot(x~group, main="Boxplot of X by Group", names=c("Group 0", "Group 1"), border=c("red", "blue"), lwd=2)
Curve (2차함수 그래프 표현)
curve(3*x^5-5*x^3+2*x, from=-1.25, to=1.25, lwd=2, col="purple")
curve(dgamma(x, shape=2, scale=1), from=0, to=7, lwd=2, col="red")
curve(dnorm, from=-5, to=5, lwd=2, col="red")
curve(dnorm(x, mean=2), lwd=2, col="BLUE", add=TRUE)
add=TRUE 가 있으면 그림을 추가해서 그리는거다 = 누적 그리기
<첨언>
아래의 명령어를 입력함으로써, 더 자세한 그래프를 그릴 수 있을 것이다
lines(c(0, 0), c(0, dnorm(0)), lty=2, col="red")
lines(c(2, 2), c(0, dnorm(2, mean=2)), lty=2, col="blue")
3D Plot
library(TeachingDemos)
반드시 티칭데모스라는 패키지를 설치하고 사용해야한다
outer
x <- y <- seq(-1, 1, len=25)
z <- outer(x, y, FUN=function(x,y) -x*y*exp(-x^2-y^2))
z라는 변수를 x,y 로 이루어진 함수의 결과값으로 투입시켜주는 명령어임을 살펴볼 수 있다
persp (3d plot 과제에서 많이 다뤄야 할 친구)
persp(x,y,z, shade=0.8, col="green3") "3-D Surface Plot"
points(trans3d(1,1,.1, view), cex=2, col="red", pch=19) "Point at (x=1, y=1, z=.01)"
text(trans3d(1,1,.1, view), "(1,1,0.1)", pos=1, font=2) "Add text"
lines(trans3d(x, y=-.5, z[7,], view), lwd=2, col="red") "Line of z vs x, when y=-.5"
<문제>
다음 명령어를 입력해보고, ""가 있고 없고의 차이를 스스로 파악해보라
plot(1:10, type="n", xlab="X", ylab="Y")
text(5.5, 9, "expression(y==alpha[1]*x+alpha[2]*x^2)", cex=1.5)
text(5.5, 8, expression(y==alpha[1]*x+alpha[2]*x^2), cex=1.5)
<첨언>
그러면 독자들은 '구' 를 만들 수 있겠습니까?
multiple view
par(mfcol=c(2,1))
plot(rnorm(100), main="Figure 1", pch=19, col="red")
plot(rnorm(100), main="Figure 2", pch=5, col="blue")
<첨언>
그렇다면 좌,우로 plot 2개를 나타내고 싶다면 어떻게 명령어를 변경해야 할까?
leyout
layout(matrix(c(1,1,2,3), 2, 2, byrow = TRUE), heights=c(.5,1))
layout.show(3) # View layout
layout(matrix(c(1,1,2,2), 2, 2, byrow = TRUE), heights=c(1,1))
layout.show(2)
Text in plot
plot(1:10, type="n", xlab="X", ylab="Y")
text(5.5,9, "expression(y==alpha[1]*x+alpha[2]*x^2)", cex=1.5)
text(5.5,8, expression(y==alpha[1]*x+alpha[2]*x^2), cex=1.5)
plot(1:10, type="n", xlab="X", ylab="Y")
text(5.5,8, expression(y==beta[1]*x[1]+gamma[2]*x[2]+alpha[3]*x[3]^4), cex=1.5)
theta = 3
text(5.5,6, "theta=3; bquote(hat(theta)==.(theta))", cex=1.5)
text(5.5,5, bquote(hat(theta)==.(theta)), cex=1.5) ; "bquote = 셋타에 넣은 값이 그대로 전달되게끔 하는 명령어"
위의 사진을 참고해보면 ""의 유무 에 따라서 수학적인 수식으로 나올지, 그대로 나올지가 결정된다
Legends
windows(width=9, height=6) # Fix window size
par(mfrow=c(1,2), oma=c(3,0,2,0)) # Add an outer margin to the figure
set.seed(789)
x1 <- rnorm(10); x2 <- rnorm(10, mean=2)
y1 <- rnorm(10); y2 <- rnorm(10, mean=2)
# Plot 1
plot(range(x1,x2), range(y1,y2), main="Figure 1", type="n", xlab="X", ylab="Y")
points(x1, y1, col="red", pch=19) # Group 1
points(x2, y2, col="blue", pch=0) # Group 2
legend("topleft", c("Group 1","Group 2"), pch=c(19,0), col=c("red", "blue"), horiz=TRUE, bty="n")
legend("topleft", c("Group 1","Group 2"), pch=c(19,0), col=c("red", "blue"), horiz=F, bty="n")
legend("topleft", c("Group 1","Group 2"), pch=c(0,19), col=c("Blue", "Red"), horiz=F, bty="n")
legend(locator(1), c("Group 1","Group 2"), pch=c(19,0), col=c("red", "blue"), title="Legend")
마우스로 원하는 위치에 레전드 출력가능
# Plot 2
plot(range(x1,x2), range(y1,y2), main="Figure 2", type="n", xlab="X", ylab="Y")
lines(sort(x1), sort(y1), col="Red", type="l", pch=1) # Group 1
points(sort(x1), sort(y1), col="white", pch=19)
points(sort(x1), sort(y1), col="black", pch=1)
lines(sort(x2), sort(y2), col="blue", type="o", pch=0) # Group 2
a<- max(x1) ; b <- max(y1)
c <- min(x2) ; d <- min(y2)
points(c(a,c), c(b,d), col="white", pch=c(19,15), cex=1.2) ; "cex = 점의 사이즈"
lines(c(a,c),c(b,d), col="forestgreen", type="l")
lines(sort(x1), sort(y1), col="Red", type="l") # Group 1
lines(sort(x2), sort(y2), col="blue", type="l") # Group 2
legend(-2, 2.5, c("Group 1", "Group 2"), pch=c(19,0), col=c("red", "blue"), horiz=TRUE, bty="n", lty=1)
last
par(mar=c(5,5,5,5))
plot(1:10, axes=FALSE, ann=FALSE)
axis(2)
axis(3, at=seq(1,10,by=.5), labels=format(seq(1,10,by=.5), nsmall=3))
axis(4, at=1:10, las=2)
tck <- axis(1, labels=FALSE)
text(tck, par("usr")[3]-.5, labels=paste("Label", tck), srt=45, adj=1, xpd=TRUE)
box()
mtext(paste("Side", 1:4), side=1:4, line=3.5, font=2) # Add axis labels