티스토리 뷰
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 캠퍼스 머신러닝기반의 빅데이터분석 양성과정
'R > Visualize' 카테고리의 다른 글
[R 시각화] 파이, 3D파이 그래프 그리기 - pie, pie3D plot (0) | 2019.01.12 |
---|---|
[R 시각화] 히스토그램 그래프 그리기 - histogram plot (0) | 2019.01.12 |
[R 시각화] 막대 그래프 그리기 - BarPlot (0) | 2019.01.10 |