기본 콘텐츠로 건너뛰기

[matplotlib]quiver()함수

R 그래프 내장함수

R그래프를 위한 내장함수

각각의 데이터는 어떤 의미를 갖지 못하는 경우가 많지만 여러개의 데이터 즉, 시간에 따른 데이터들의 집합은 그 집단의 형태대로 많은 의미를 내포하고 있다. 이러한 의미를 합리적 근거에 따라 설명하려는 노력이 확률과 통계이다. 요즈음은 데이터 과학이라는 용어로 이러한 작업들을 대표하고 있다. 이러한 작업들에 들어가지 전에 반드시 해야 되는 전처리 작업이 있다. 그것은 그 데이터가 가지고 있는 전체적 인 윤곽을 파악하는 일이다. 이러한 일 중에 빈번히 사용하는 것이 시각적으로 그 일단의 의미를 나타내는 것이 다. 이러한 수단으로 R의 그래픽 기능은 매우 유용하며 분석자 자신이 나타내려고 하는 여러 정보를 도표로 유연하 게 나타낼 수 있다. 이 그래픽 수단은 위에서 언급한 데이터의 본격적인 분석 전에 이루어지기 전에 도입과 같은 기능을 위해서도 유용하지만 어떤 분석의 결과를 시각적으로 나타낼 때 역시 매우 유용한 수단이며 그 자체가 데이터 분석의 큰 부분이라 할 수 있겠다. R에서는 기본적으로 많은 plotting 함수를 내장하고 있다. 그 보다 후에 개발되어 나온 ggplot 라이브러리는 R내장 함수들 보다는 직관적으로 이용할 수 있다는 점에서 보다 편리하다. R의 그래프 관련 기능은 그래프 작도에 사용하는 함수들과 그래프를 출력하는 장치로 구분할 수 있다 그래프 작도 함수는 하나의 완성된 그래프를 그리는 고준위 함수와 완성된 그래프에 다른 그래프를 추가하거나 문자등을 삽입하기 위한 저준위 함수로 구분할 수 있다. 작도디바이스의 컴퓨터 화면에 바로 출력하거나 bmp, jepg, pdf, pictex, png, postscript(), win(), metafile() 등의 형식으로 이미지를 저장 할 수 있다.
바로 컴퓨터 화면에 출력하는 디바이스는 윈도우에서 Windows, 맥에서는 quartz()이다. 또한 저장을 위해서는 저장하려는 형식의 함수를 사용한다. 예를들어 png(“저장 파일의 경로”)를 지정한 후 그래프를 그리면 화면에 나타나지 않고 지정된 파일에 저장된다. 그래프를 그린후 그 디바이스를 닫아야 한다. 즉, dev.off()를 첨가한다. 즉, 다음과 같은 절차로 저장된다. 다음 코드는 옵션 eval=F로 지정했으므로 정크 코드가 실행되지 않는다.
png(file="example.png")#R이 작업하는 워킹디렉토리로 저장 디렉토리가 지정된다.
plot(x, y)
dev.off()
위와 같이 사용할 수 있는 디바이스의 종류는 다음과 같이 알아볼 수 있다.
help('device')
그래프를 그리는 단계는 다음과 같다.
1) 플롯을 위한 데이터나 수식을 준비
2) 고준위함수로 기준이 되는 그래프를 작성
3) 저준위 함수로 그래프나 텍스트를 추가
4) 저장
다음은 고준위 함수의 종류이다.
그래프
함수
산포도
plot(벡터)
히스토그램
hist(벡터)
상수염그림
boxplot(벡터)
막대그래프
barplot(각 목록의 빈도가 들어간 벡터)
원그래프
pie(각 목록의 빈도가 들어간 벡터)
분할표그림
mosaicplot(행렬)
스타차트
stars(행렬)
산포도행렬
pairs(행렬)
1차원 함수
그래프 curve(함수, 하한, 상한)
2차원 함수
그래프 persp(x, y, z)

위와 같은 그래프는 par(), layout() 함수로 출력 조건을 조정할 수 있다. 예를들어 한면에 6개의 그래프를 출력할 경우 다음과 같이 코드를 작성한다.
par(mfrow=c(2,3))#2행 3열로 각 그래프를 행 위주로 위치시킨다.   
par(mfcol=c(2,3))#2행 3열로 각 그래프를 열 위주로 위치시킨다.
layout(matrix(2:3))
이 문서의 정크 코드의 형식과 출력 형식, 모든 그래프의 크기를 일정하게 하기 위해 다음과 같이 설정한다.
library(knitr)
opts_chunk$set(prompt=T, comment=NA)
opts_template$set(myFig=list(fig.mar=c(4,3,1,1),fig.height=3, fig.width=4))
위에서 나타낸 layout() 함수를 사용하여 각 그래프의 위치를 지정할 수 있다.
다음을 보자.
> x<-rnorm(100)
> matrix(c(2, 3, 0, 1), ncol=2)
   [,1] [,2]
[1,]    2    0
[2,]    3    1
> layout(matrix(c(2, 3, 0, 1), ncol=2))
> plot(x)
> hist(x)
> plot(x, type='l')
layout() 함수의 인수중에 respect를 사용하여 그래프 하단의 길이를 기준으로 높이를 자동으로 정할 수 있다. 위의 코드에서 layout의 변수에 변화를 주어 결과를 비교해보자.
> x<-rnorm(100)
> matrix(c(2, 3, 2, 1),  ncol=2)
   [,1] [,2]
[1,]    2    2
[2,]    3    1
> layout(matrix(c(2, 3, 0, 1), ncol=2),heights=c(1.5, 1), respect=T)
> plot(x)
> hist(x)
> plot(x, type='l')

그래프 작성
그래프를 그리기 위한 데이터를 호출하자. 다음은 기록되어 csv 파일로 저장된 파일로 kospi 일일주가 자료로 2016, 1, 1일 이후의 값들을 사용한다. 또한 호출한 자료의 cp를 기반으로 cut() 함수를 적용하여 factor 인자를 산출하였다.
> k<-read.csv("c:/workspace/stockData/target/kospi.csv", header=T, stringsAsFactors=F)
> k1<-k[k[,1]>="2017-01-01",]
> k1$idx<-cut(k1[,"cp"], breaks=10, label=1:10)
> head(k1)
         date      op      hp      lp      cp    vol idx
1722 2017-01-03 2034.31 2044.07 2028.47 2043.97 268100   1
1723 2017-01-04 2046.29 2046.29 2040.61 2045.64 371500   1
1724 2017-01-05 2045.52 2046.50 2039.49 2041.95 541300   1
1725 2017-01-06 2048.11 2051.84 2045.66 2049.12 455400   1
1726 2017-01-09 2053.18 2053.18 2046.47 2048.78 398300   1
1727 2017-01-10 2043.30 2046.78 2039.50 2045.12 512700   1
plot() : x, y 축을 인자로 지정해야 하는데, y축만 지정할 경우 x축의 범위는 자동으로 지정된다 .
> plot(k1$cp)
다음은 수학함수를 지정하여 그래프를 그린다.
> layout(2:1)
> curve(sin, -pi, 2*pi)
> Gauss.density<-function(x){1/sqrt(2*pi)*exp(-x^2/2)}
> curve(Gauss.density, -3, 3)
> abline(h=0, col='red')
> abline(v=0, col='red')
plot()함수등으로 조절할 많은 매개변수들을 가진다. 각 변수의 인자들을 사용하여 제목(라벨), 축의 종류, 도식에 나타낼 점의 형식, 선의 형식, 색이나 기호 등 각각의 종류등이 있다. 다음은 그들을 표로 나타낸 것이다.
라벨
내용
main
제목 문자
sub
부제목 문자
xlab, ylab
각각 x,y의 좌표명
ann
논리형으로 축의 라벨 표시여부(T/F)
tmag
문자의 확대율

내용
log =‘x’, =‘y’,=‘’ 각각 x축, y축 양축 모두 로그축
xlim, ylim
각 축의 범위를 나타냄 c(하한, 상한)
axes
논리형으로 축생성을 억제 xaes=F, yaes=F

내용
p
점(기본)
l
b
점과 선
c
’b’에서 점을 그리지 않는 플롯
o
점 과 선 플롯을 중첩
h
수평선
v
수직선
s
왼쪽값을 기준으로 계단모양으로 연결
S
오른쪽값을 기준으로 계단모양으로 연결
n
축만 그리고 플롯하지 않음

lty
내용
0, blank
투명선
1, solid
실선
2, dashed
대시선
3, dotted
도트선
4, dotdash
도트와 대시선
5, longdash
긴 대시선
6, twodash
2개의 대시선


라벨
내용
col
번호 또는 이름으로 색 지정, 1부터, 검정, 빨강, 초록, 파랑, 연파랑, 보라, 노랑, 회색
pch
플롯의 점 모양을 지정(R help참조)
cex
문자의 확대율 지정
lwd
선의 폭, 1부터 증가 할수록 폭증가
bg
배경색
ann
F 지정으로 축과 전체 제목을 붙이지 않음
las
0,1,2,3의 값으로 축의 라벨의 위치 조정

아래 코드 중 “pch=ifelse(d1[,2]>mean(d1[,2]), 10, 1”는 평균보다 큰 값, 그렇지 못한 값을 구분하여 표시되는 점의 모양을 달리 하기 위한 것이다.
> cp.m<-lm(cp~op, data=k1)
> d1<-data.frame("op"=k1[,"op"], "cp"=k1[,"cp"], "fitted"=fitted(cp.m))
> plot(d1[,1], d1[,2], ylim=range(d1), pch=ifelse(d1[,2]>mean(d1[,2]), 10, 1), main="op & cp", xlab="op", ylab="cp")
> abline(cp.m, col=2, lwd=2)
위에서는 고수준 함수의 인자들에 대해 살펴보았다면 다음은 원래 그래프에 추가하기 위한 그래프 또는 legend등 에 사용되는 인자를 알아본다. 즉, 저수준함수에 사용하는 인자를 알아본다.
추가할
대상 함수
points()
직선
lines(), segments(), abline()
격자
grid()
화살표
arrows()
직사각형
rect()
문자
text(), mtext(), title()
테두리와 축
box(), axis()
범례
legend()
다각형
polygon()
위에서 작성한 종가에 대한 그래프에 저가에 대한 그래프를 저수준 함수를 사용하여 첨가하여 보자.
> plot(1:nrow(k1), k1[,'cp'], ylab='price', ylim=c(min(k1[,'op']), max(k1[,'cp'])))
> lines(1:nrow(k1),k1[,'op'], col=2)
> legend("topleft", lty=1:2, c("cp","op"), ncol=2)
위의 경우 축, 축이름, 스케일은 plot()에 의해 정해진 그래프에 새로운 그래프가 첨가되는 방식이다. 그러므로 두 그래프간의 스케일이 다르다면 결과에 나타나지 않을 수 있다. 이에반해 존재하는 그래프에 새로운 그래프를 첨가할 수 있는 par(new=T)를 사용하는 경우 각각 작성된 그래프가 겹쳐지는 것이므로 추가할 그래프의 축이름, 스케일을 공백으로 하여야 한다. 다음을 보자.
> par(mfrow=c(1,2))
> curve(sin, -2*pi, +2*pi, sub="검정:sin, 빨강:cos")
> par(new=T)
> curve(cos, -2*pi, +2*pi, lty=2)
> #위 결과는 두 그래프의 다른 y축 이름 겹쳐지므로 알아볼 수 없다. 이 경우 다음과 같이 y축이름을 설정한다.
>
> curve(sin, -2*pi, +2*pi, ylab='y', sub="검정:sin, 빨강:cos")
> par(new=T)
> curve(cos, -2*pi, +2*pi, lty=2, ylab=" ")
grp01.png
작성한 그래프를 제거하기 위해서는 frame() 또는 plot.new()를 사용한다.
그래프의 특정부분에 색을 첨가하고자 할 경우 polygon()를 사용한다. dnorm()는정규분포의 확률밀도 함수이다. 이 함수의 그래프에서 일정부분에 음영을 넣고자 한다.
> par(mfrow=c(1,1))
> curve(dnorm, -5, 5, type="l")
> x.spec<-seq(-1, 1, length=10)
> y.spec<-dnorm(x.spec)
> polygon(c(x.spec, rev(x.spec)), c(rep(0, 10), rev(y.spec)), col="gray")
3차원 그래프
persp(x축 데이터, y축 데이터, z축 데이터, col=색, theta=가로회전각도, phi=세로회전각도, expand=확대율)
> x<-seq(-3, 3, length=61)
> y<-x
> f<-function(x, y){
+ return(1/(2*pi)*exp(-(x^2+y^2)/2))
+ }
> z<-outer(x, y, f)
> persp(x, y, z, theta=30, phi=30, expand=0.5, col="lightblue")



댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...