R

R barplot, 산점도

Positive_Monster 2022. 1. 25. 21:24
더보기

▣ 주요 키워드

  1. barplot
  2. 산점도

●색상 가져오기

library(RColorBrewer) #색상들을 가져올 수 있는 패키지
display.brewer.all() #모든 색상표
display.brewer.pal(10,'RdBu') #빨강파랑의 종류로 10가지

●그래픽에 그래프를 몇 개 출력할지 정하는 옵션/ 그래픽에 나와있는 모든 이미지 제거

par(mfrow=c(1,1)) # 그래프를 하나만 출력
par(mfrow=c(2,3)) # 그래프를 2 x 3만큼 출력(6개)

graphics.off() # 현재 나와있는 그래프 제거

 

par(mfrow=c(2,3))

[문제157] exam.csv file에는 학생들의 시험점수가 있습니다. 학생들의 SQL 점수를 막대그래프로 출력해주세요.
exam <- read.csv('c:/data/exam.csv',header = T) # exam csv파일 읽어와서 exam변수에 저장
exam
barplot(exam[exam$subject == 'SQL','grade'], #exam데이터프레임에 subject컬럼에 SQL인 값의 grade컬럼을 선택
        names.arg = exam[exam$subject == 'SQL','name'], #exam데이터프레임에 subject컬럼에 SQL인 값의 name컬럼의 값들이 x축의 각 이름으로 들어감 
        las=2, # 2 : names.arg의 값들을 세로로 눕혀진 형태로 출력해줌, 1 : 가로형태로 출력
        ylim=c(0,100), # y축의 범위를 눈금으로 표시
        main='SQL점수', # 그래프 제목
        cex.names=0.7, # names.arg(x축의 값들)의 글씨 크기
        border=NA, # na : 그래프의 막대의 테두리를 없애기 
        col=rainbow(length(exam[exam$subject == 'SQL','name']))) #막대의 색상을 무지개색으로 exam[exam$subject == 'SQL','name'] 길이만큼 색상종류
        

[문제158] exam.csv file에는 학생들의 시험점수가 있습니다. 학생들의 R 점수를 막대그래프로 출력해주세요

barplot(exam[exam$subject == 'R','grade'],
        names.arg = exam[exam$subject == 'R','name'],
        las=2,
        ylim=c(0,100),
        main='R점수',
        cex.names=0.7,
        border=NA,
        col=rainbow(length(exam[exam$subject == 'PYTHON','name'])))
        
[문제159] exam.csv file에는 학생들의 시험점수가 있습니다. 학생들의 PYTHON 점수를 막대그래프로 출력해주세요.
barplot(exam[exam$subject == 'PYTHON','grade'],
        names.arg = exam[exam$subject == 'PYTHON','name'],
        las=2,
        ylim=c(0,100),
        main='PYTHON점수',
        cex.names=0.7,
        border=NA,
        col=rainbow(length(exam[exam$subject == 'PYTHON','name'])))

[문제160] exam.csv file에는 학생들의 시험점수가 있습니다. 학생들의 과목 총 점수를 막대그래프로 출력하세요.

exam_total <- aggregate(grade~name,exam,sum) # 이름별로 성적의 총 점수를 구함
barplot(exam_total$grade, #총점수 데이터의 값들
        names.arg = exam_total$name, #학생 이름들
        las=2,ylim=c(0,300),main='총점수',
        cex.names=0.7,border=NA,
        col=brewer.pal(NROW(exam),'RdBu')) #RdBu : 빨강에서 파랑

[문제161] 학생들의 이름을 기준으로 과목점수를 스택형 막대그래프로 생성하세요.
t <- tapply(exam$grade,list(exam$subject,exam$name),sum) # subject별, name별로 과목점수(표처럼)출력, #bp라는 변수에 저장하는 이유는 barlabels의 위치를 표현하기 위해서이다.
bp <- barplot(t, # (t데이터를 먼저 확인해보기) 3 x 9의 행렬로 들어감(스택형 막대로 출력)
        names.arg = colnames(t), # 열의 이름들을 x축의 각 이름들로 출력
        las=2, 
        ylim=c(0,300),
        main='과목총점수',
        cex.names=0.7,
        border=NA,
        col=rainbow(3))
legend('topright',legend = rownames(t),title = '과목',pch=15,  # 범례만들기 topright : 오른쪽 위에, legend= 어떤 값들인지, title= 제목, pch=legend의 앞에 나오는 점의 종류,col은 pch의 색, cex는 크기
       col = rainbow(3),cex=0.5)
abline(h=seq(100,300,50),col='red',lty=2) #h=seq(100,300,50) : 눈금 100에서 300까지 50씩 선을 그어줌, col 색, lty는 선의 종류 2는 점선


install.packages("plotrix")
library(plotrix)
plotrix::barlabels(bp,t,bg=rainbow(3),border=NA,cex=0.5) # bp만 실행해보면 숫자 값이 나오는데 막대그래프의 위치를 나타내는 값들이다. 스택형의 각 막대마다 label값들이 위치할 수 있게 t변수를 옵션으로 넣고,bg는 label의 색, border은 label의 테두리,cex는 글자크기 


[문제162] 학생들의 이름을 기준으로 과목점수를 그룹형 막대그래프로 생성하세요.
t
bp <- barplot(t, 
        names.arg = colnames(t),
        las=2,
        ylim=c(0,100),
        main='과목총점수',
        cex.names=0.7,
        border=NA,
        col=rainbow(3),beside=TRUE) # beside = T 옵션은 스택막대그래프를 옆으로 붙이는 그룹 막대그래프
legend('topright',legend = rownames(t),title = '과목',pch=15,
       col = rainbow(3),cex = 0.5)

plotrix::barlabels(bp,200,t,bg=rainbow(3),border=NA,cex=0.5)

 

[문제163] 구별 진료과목별 병원현황을 그룹형 막대그래프로 시각화 해주세요.
data <- read.csv('c:/data/kosis.csv',header=T) # kosis공공데이터 읽어와서 data변수에 넣기
names(data) <- data[1,] # 컬럼이름이 사용하지 않을 날짜 데이터가 들어가 있기에 첫행에 있는 진료과목들을 컬럼이름으로 저장
data
head(data[-1,c(-1,-3)])
data <- data[-1,c(-1,-3)] # 사용하지 않을 열과 행들 삭제
data <- data[-1,]
head(data)
names(data)[1] <- "구" # 이름이 복잡한 첫번째 컬럼이름 '구'로 변경
head(data)

t(data) # 다 문자형으로 바뀜 # 트랜스포즈 함수를 이용하여 열위치랑 행 위치랑 체인지
new <- data.frame(t(data)) #데이터프레임 형식으로 new변수에 저장
str(new)
names(new) <- new[1,] #데이터프레임으로 변경할 때 컬럼이름이 새롭게 생기기 때문에 1행에 있는 구들을 컬럼이름으로 저장
str(new)
new <- new[-1,] # 1행은 컬럼이름에 저장되었기때문에 중복되므로 제거
head(new)
str(new) #수치형만 그래프를 그릴 수 있기에 이 new에 있는 문자형 값은 그래프를 그릴 수 없다.

for(i in 1:25){ # 문자로된 수치들을 다시 integer형식으로 하지만 for문으로 반복해야하는 불편함이 있다. 따라서 밑에 lapply함수를 사용하면 편하게 바꿀 수 있따.
  new[,i] <- as.integer(new[,i])
}
str(new)

new[,1:25] <-lapply(new[,1:25],as.integer) # 위의 for문 대신에 integer형으로 한꺼번에 바꾸어줄 수 있음
str(new)
new
barplot(as.matrix(new[1:9,1:11]),beside=T) #데이터프레임은 안되고 vector나 matrix만 그래프로 표현할 수 있기 때문에 matrix로 변경

[문제164] 구별 진료과목에 해당하는 병원수를 막대형 그래프로 만드세요.
단 막대높이 10개당 1개로 만드세요.
#1개의 barplot당 1개의 구가 진료과목별로 나오는데 반복문을 사용해서 26개의 구를 다 보일 수 있게 하는 문제

names(data) <- data[1,]
data
head(data[-1,c(-1,-3)])
data <- data[-1,c(-1,-3)]
data <- data[-1,]
head(data)
names(data)[1] <- "구"
head(data)

t(data) # 다 문자형으로 바뀜
new <- data.frame(t(data))
str(new)
names(new) <- new[1,]
str(new)
new <- new[-1,]
head(new)
str(new) #수치형만 그래프를 그릴 수 있기에 이 new에 있는 문자형 값은 그래프를 그릴 수 없다.

new[,1:25] <-lapply(new[,1:25],as.integer)

gu <- names(new)
par(mfrow=c(2,5))
for(i in 2:10){
  barplot(new[1:9,i]*0.1,
          axes=F, xlab="",
          names.arg = rownames(new)[1:9], # new 데이터프레임의 행이름(진료과목)을 x축 각 이름으로 출력
          cex.names=0.8,
          col = rainbow(9),
          border = "white",
          main = paste(gu[i],"병원현황"),
          las=2,ylim=c(0,10))
  axis(2,ylim=seq(0,50,10))
  abline(h=seq(0,50,5),lty=2)
  
}

[문제165] 2015~2019년도별 1군 전염병 발생 현황에 대해 시각화 해주세요.
data <- read.csv('c:/data/감염병_군별_발생현황.csv',header=T) # 파일읽어오기
data <- data[data$법정감염병군별.1. =="제1군",] # 법정감염병군별.1.이 '제1군'이랑 같은 값들만 data에 저장
data <- data[-1,-1] #필요없는 행,컬럼 제거
names(data) <- c("전염병","2015","2016","2017","2018","2019") #data 데이터프레임의 컬럼이름 변경
data
str(data)

data[,2:6] <- lapply(data[,2:6],as.integer) # 그래프 그리기위해서 수치형으로 변경
str(data)
#par(mfrow=c(1,1)) 
barplot(as.matrix(data[,-1]),beside=T,las=2, # 그룹형 막대그래프
        main='제1군 년도별 감염병발생현황')
#------------------------------------------------- 꾸미기
bp <- barplot(as.matrix(data[data$전염병 != 'A형간염',-1]),
        beside=T, col=rainbow(5),las=2,ylim=c(0,250))
legend("topright",title="질병",legend=data$전염병[1:5],
       cex=0.5,pch=15,col=rainbow(5),box.lty=0)
library(plotrix)
as.matrix(data[data$전염병 != 'A형간염',-1])
plotrix::barlabels(bp,100,as.matrix(data[data$전염병 != 'A형간염',-1]),
                   bg=NA,border=NA,cex=0.5)

★산점도(scatter plot)

- 주어진 데이터를 점으로 표시해 흩뿌리듯이 시각화한 그래프

- 데이터의 실제값들이 표시되므로 분포를 한눈에 살펴보는데 유용

- x-y plotting

rstudio에서 제공해주는 data
data()를 수행하면 제공해주는 data들이 어떤 것들이 있는지 알 수 있다.
제공해주는 women 데이터 이용하여 산점도를 그리기
plot(women$height)
plot(x=women$height,y=women$weight,
     xlab="키", ylab="몸무게",
     main="여성의 키와 몸무게", sub="미국 70년대 기준",
     type='b', lty = 2, lwd = 5, pch=23, cex = 2,
     col= 'darkblue'
     )

type : p(점), l(선), b(점,선), c(b의 선), o(점위의 선), h(수직선), s(계단형), n(나타나지 않음)
lty : 선의 유형( 0~6)
lwd : 선의 굵기(기본값 1)
pch : 점의 종류

 

#------------------------------------데이터 수정
data <- read.csv('c:/data/감염병_군별_발생현황.csv',header=T)
data <- data[data$법정감염병군별.1. =="제1군",]
data <- data[-1,-1]
names(data) <- c("전염병","2015","2016","2017","2018","2019")
data
str(data) # 그래프를 그릴 수 있는 수치형인지 확인 
data[,2:6] <- lapply(data[,2:6],as.integer) # integer형으로 저장
str(data) # 확인
par(mfrow=c(1,1))
#data[data$전염병 != 'A형간염',-1] # 혼자만 데이터가 엄청 큼
t(data)
new <- data.frame(t(data))
str(new)
names(new) <- new[1,]
new <- new[-1,]
new
str(new)
new[,1:6] <- lapply(new[,1:6],as.integer)
str(new)
#-------------------------------------그래프 그리기
- 여러개의 선을 그리고 싶을 때 plot으로 한번에 다 그릴 수 없고 선 하나를 그리고 lines로 추가하는 방식이다
plot(new$콜레라,xlab="",ylab="",ylim=c(0,300),
     axes=F,type='o', col="violet")
lines(new$장티푸스,type='o', col="blue")
lines(new$파라티푸스,type='o', col="red")
lines(new$세균성이질,type='o', col="black")
lines(new$장출혈성대장균감염증,type='o', col="green")
axis(1,at=1:5,label=rownames(new),las=2) # 옵션1은 x축 눈금, at은 x축 눈금 개수(라벨이랑 개수가 같아야함), label은 x축 눈금에 들어갈 값(컬럼또는행)을 넣어주는 옵션
axis(2) # 옵션2는 y축 눈금
abline(h=seq(0,300,50),v=seq(1,10,1),lty=3,lwd=0.2) # h는 수평선, v는 수직선, lty는 타입, lwd는 굵기
legend("topright",legend=names(new)[1:5],cex=0.5,lty=2,lwd=1, 
       col=c('violet','blue','red','black','green'))

'R' 카테고리의 다른 글

R - wordcloud, grep, 정규표현식,stringr  (0) 2022.02.06
R - reshape2,cut,히스토그램,상자그림  (0) 2022.01.26
R dplyr, sqldf함수  (0) 2022.01.21
R dplyr, rank 함수  (0) 2022.01.20
R subset,ddply 함수  (0) 2022.01.19