티스토리 뷰

반응형

Plot 선 그래프 그리기



plot(x축 데이터, y축 데이터, 옵션)


 plot에 하나의 벡터 사용 시 벡터는 y축으로 전달되고 x축은는 y의 수(벡터 크기) 만큼 지정됩니다.

plot함수의 목적은 선 그래프의 출력이지만, 함수에 들어가는 데이터에 따라서 다양한 형태의 그래프를 출력해줍니다. 



그래프 타입

par(mfrow=c(3,3))    # 그래프의 배치 조정 c(행의 개수, 열의 개수)


1. plot(x1, type = 'p')   

2. plot(x1, type = 'l')

3. plot(x1, type = 'b')    # 주로 사용

4. plot(x1, type = 'c') 

5. plot(x1, type = 'o')    # 주로 사용

6. plot(x1, type = 'h') 

7. plot(x1, type = 's') 

8. plot(x1, type = 'S') 

9. plot(x1, type = 'n') 



그래프 선 모양

par(mfrow=c(3,3)) 


1. plot(x1, type = 'o', lty=0) # lty="blank" 

2. plot(x1, type = 'o', lty=1) # lty="solid" 

3. plot(x1, type = 'o', lty=2) # lty="dashed" 

4. plot(x1, type = 'o', lty=3) # lty="dotted" 

5. plot(x1, type = 'o', lty=4) # lty="dotdash" 

6. plot(x1, type = 'o', lty=5) # lty="longdash" 

7. plot(x1, type = 'o', lty=6) # lty="twodash" 




범주, 범주 이름, 차트 제목 설정 중요@

xlim = c( , ) : x축 범주(눈금)

ylim = c( , ) : y축 범주(눈금)

xlab = ' '    : x축 범주 이름 설정

ylab = ' '    : y축 범주 이름 설정

main = ' '   : 차트 이름 설정

# 그래프 변경, 크기 조절에 사용 

> x1 <- c(1,3,7,5,10,7)

> plot(x1, type = 'o', 

+      xlim = c(1,10),   #  x축 범주

+      ylim = c(1,20),   #  y축 범주

+      xlab = 'x축',    # x축 범주 이름 설정

+      ylab = 'y축',    # y축 범주 이름 설정

+      main = 'Plot')  # 차트 제목


# 그래프 생성 후 추가도 가능합니다.

> title(main="Plot" , col.main="red",font.main=4) 

> title(xlab="x축", col.lab="black") 

> title(ylab="y축",col.lab="blue")




범주의 사용자 지정

axis(행/열, at = 범위, lab = 지정값) : (x,y)축 지정 옵션(눈금 개수, 눈금 이름) 

        # 1 : x축 / 2 : y축

> x1 <- c(1,3,7,5,10)

> plot(x1,    

       ann = F,     # 축 제목 지정 False

       axes = F,    # 축 표시 False

       ylim = c(1,10),   # y축의 범주 (y축의 범주는 초기 plot생성 시 설정해 줘야 합니다) 

       col = 'red',   # 그래프 색상

       type = 'b')   #  그래프 타입


> axis(1, at = 1:5, lab=c('A','B','C','D','E'))     # x축 범주 사용자 지정


> axis(2, ylim = c(1,10))  # 축이 변경되지는 않지만 출력을 위해 default 범주와 동일하게 설정

* 만들어지는 과정

                




하나의 도화지에 여러 Plot 그리기 중요@

분석을 위해 여러 개의 그래프를 겹쳐서 동시에 그리기는 것은 중요합니다.  

> v1 <- c(1,2,3,4,5)

> v2 <- c(2,4,6,8,10)

> v3 <- c(1,5,6,2,1)

> plot(v1, type = 'o', col = 'red', ylim = c(1,10))  # 첫 번째 그려진 그래프의 눈금으로 틀이 고정됩니다. 

> lines(v2, type = 'o', col = 'blue')

> lines(v3, type = 'o', col = 'black')

# Plot의 범위가 다 다를 경우, 가장 큰 범위의 그래프를 먼저 그리거나, 초기 limit 값을 크게 설정해주어야 합니다. 




범례 추가하기

legend(x축 위치, y축 위치, cex = 글자 크기, col = 색상, pch = 크기, lty = 구분 모양)

legend(2,240000, colnames(card)[-1],  cex = 0.8, pch = 1, col = 1:6, lty = 1)



유용 함수

plot.new()  # Rstudio figure(도화지) reset

dev.new()  # 분리된 figure(도화지) 창 생성



축 여백 지정

par(mgp=c(제목위치,지표값위치,지표선위치)) 

축의 여백 조절에 사용됩니다.(축 이름이 길 경우 주로 사용) 

> par(mgp=c(3,2,1))

> plot(x1,xlab="aaa")



그래프 전체 여백

 par(oma=c(하,좌,상,우)) 

 그래프 밖 여백 조절 (눈금과 축 이름이 길어서 여백을 벗어날 경우 주로 사용)

> par(oma=c(0,2,0,0)) 

> plot(a,xlab="aaa")




데이터 프레임 적용

> str(card)      # 데이터가 숫자 형태인 데이터 프레임이 필요

> card

   NUM 식료품   의복 외식비   책값 온라인소액결제 의료비

1    1  19400 143000   8600  29000           5600  19200

2    2  22200 120400   7000  26000           3300  13000

3    3  24600  88500   7500  22000           7500  16600

...

> plot(card)    # 데이터 프레임을 plot에 바로 적용 시 컬럼별 크로스 산점도를 출력해버립니다.


Plot에 데이터 프레임 전달 시, R은 컬럼별 선 그래프를 출력해주지 못 합니다. 하지만 파이썬은 컬럼별로 잘 분할해서 라인별로 그래프를 그려준다는 것... 

컬럼별 선 그래프를 R에서 그리고 싶다면 각 컬럼별로 뽑아서(혹은 for문을 사용) 그래프를 그려줘야합니다.


# 그래프 생성

> plot(card[,2], type = 'o', col = 1, ylim = c(0,250000),

+        axes = F, xlab = '일', ylab = '원', main = '일별 지출')

> lines(card[,3], type = 'o', col = 2)

> lines(card[,4], type = 'o', col = 3)

> lines(card[,5], type = 'o', col = 4)

> lines(card[,6], type = 'o', col = 5)

> lines(card[,7], type = 'o', col = 6)

> axis(1, at=1:30)

> axis(2, ylim = c(0,250000))


# 범례 생성

legend(2,240000, colnames(card)[-1],     # 그래프의 초기 축 위치 기반으로 범례 위치를 정해야 합니다.

                        cex = 0.8, pch = 1, col = 1:6, lty = 1) 




Q1.

# 1. subway2 파일의 데이터를 기반으로 승차가 가장 많은 top 5개의 역을 구하고

# 각 역의 시간대별 승차의 증감추세를 도표화

> subway <- read.csv('subway2.csv', stringsAsFactors = F, skip = 1)

> str(subway)

> subway

        전체 구분   X05.06   X06.07    X07.08    X08.09    X09.10   X10.11   X11.12   X12.13    X13.14    X14.15    X15.16 ...

1  서울역(1) 승차  17,465   18,434    50,313    93,398    78,705   86,342   93,585   97,707   102,608   101,710    93,849  ...

2            하차   7,829   48,553   110,250   233,852   121,983   79,628   75,577   70,984    80,388    80,263    79,592  ...

3   시 청(1) 승차   2,993    4,473     7,633    10,404    13,328   16,953   25,467   27,265    36,393    41,128    48,352  ...

4            하차   4,142   19,730    67,995   175,458    83,777   48,363   47,519   42,646    45,465    42,882    38,720  ...

...

> sub1 <- subway[subway$구분 == '승차',]     # 필요한 행만 추출


> f1 <- function(data, c1=',', c2='') {    # 사용자 정의함수를 사용하여, 천 단위 구분기호 치환

+   as.data.frame(sapply(data, str_replace_all,c1,c2))

+ }

> sub2 <- f1(sub1[,-c(1,2)])      

> sub1[,-c(1,2)] <- apply(sub2, 2, as.numeric)    # 각 컬럼을 숫자형응로 변환


> apply(sub1[,-c(1,2)], 1, sum)    # 역별 승차 총 합(벡터)

      1       3       5       7       9      11      13      15      17      19      21      23      25      27      29 

1830134  808764 1604404 1318846  850040  545802  544356  627924 1301636

> total <- sub1[order(apply(sub1[,-c(1,2)], 1, sum), decreasing = T)[1:5],]    # 승차가 가장 많은 top 5개 역 추출


# 그래프 그리기

> plot(t(total[1,-c(1,2)]/10000),       # 컬럼 형식으로 데이터를 전달해야 함 

+      type = 'o', col = 1, ylim = c(0,40),  # 10,000 단위 표기

+      ann = F, axes = F)

> lines(t(total[2,-c(1,2)]/10000), type = 'o', col = 2)

> lines(t(total[3,-c(1,2)]/10000), type = 'o', col = 3)

> lines(t(total[4,-c(1,2)]/10000), type = 'o', col = 4)

> lines(t(total[5,-c(1,2)]/10000), type = 'o', col = 5)


# 축 설정

> v1 <- substr(colnames(total)[-c(1,2)],2,3)  # x축에 사용할 시간만 추출

> axis(1, at = 1:length(v1), labels = v1)  # x축 눈금

> axis(2, ylim = c(0,40)) # y축 눈금


# 범례

legend(length(v1) - 4,     # 그래프의 초기 눈금 기반 (length()로 최초 눈금 위치를 탐색)

       40, 

       total$전체,      

       col = 1:5, 

       lty = 1)   


# 눈금이름 

> title(main = '역별 승차 인원', xlab = '시간', ylab = '승차수(단위 : 만)')



Q2.

# 1. employment.csv 파일을 읽고

> emp <- read.csv('employment.csv', stringsAsFactors = F, na.strings = '-')

> head(emp)

                    고용형태           X2007           X2007.1             X2007.2             X2007.3         X2007.4   ...

1                   고용형태 총근로일수 (일) 총근로시간 (시간) 정상근로시간 (시간) 초과근로시간 (시간) 월급여액 (천원) ...

2                 전체근로자            22.3             188.8               176.5                12.3           1,847      ...

3   전체근로자(특수형태포함)            <NA>              <NA>                <NA>                <NA>           1,858     ...

...


# 각 근로자별로 월급여액의 년도별 증감 추이를 그래프로 출력


# 월 급여액 컬럼만 추출

> library(stringr)

> df1 <- emp[,str_detect(emp[1,],'월급여액')][-1,]  


# 콤마 제거 후 숫자 타입으로 변환해주는 사용자 함수 생성 

> f1 <- function(x) {

     as.numeric(str_replace_all(x, ',', ''))

   }

> df1 <- as.data.frame(sapply(df1, f1))   # sapply는 원소 하나씩 개별적으로 함수를 적용

# apply(df1,2,f1) => apply도 잘 수행되지만 파이썬에서는 불가능하므로, 이왕이면 R에서도 sapply나 mapply를 사용


# 그래프(plot) 그리기

> plot(t(df1)[,1], type = 'o', col = 1, ylim = c(0,3500), ann = F, axes = F)

> for(i in 2:nrow(df1)){

     lines(t(df1)[,i], type = 'o', col = i)   

   }


> ax_name <- substr(colnames(df1),2,5)  # 축 이름

> axis(1, at = 1:length(ax_name), labels = ax_name)  # x축 눈금

> axis(2, ylim = c(0,3500))   # y축 눈금


# 눈금이름 

> title(main = '근로자별 월 급여액', xlab = '년도', ylab = '급여액')')


# 범례

> legend(1, 3500, emp$고용형태[-1], 

          col = 1:nrow(df1), 

          lty = 1,

          cex = 0.6)





참고: KIC 캠퍼스 머신러닝기반의 빅데이터분석 양성과정

반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday