#R까기 예제 14를 참고하였습니다.
#명목형변수(지역)별로 다른명목변수(성별)의 비율을 막대그래프로 나타낼 때에 참고하면 좋은 예제입니다.
library("dplyr")
library("ggplot2")
library("ggthemes")
install.packages("reshape2")
library("reshape2")
DF <- read.csv("example_population_f.csv")
DF <- DF[,-1] DF <- as_tibble(DF)
#as_tibble(DF) : 예전의 tbl_df() 와 같음 , 빠르고 쉽게 데이터프레임 객체를 다루기 위해 dplyr 객체 속성을 추가하기 위한 함수. dplyr를 사용하기전에 이 함수로 변환부터 하기.
1.데이터를 불러옵니다.
불러와진 데이터는 아래와 같습니다. - 전국인구조사자료
2.'도' 별 합을 구합니다.
group <- group_by(DF, Provinces)
#DF를 provinces 별로 그룹을 지어 유지하라.
DF2 <- summarise(group,SumPopulation=sum(Population), Male = sum(Male),Female = sum(Female))
#province 별로, 인구수의 sum, 남자인구수의 sum ,여자인구스의 sum을 나타내주는 dataframe
*group_by() - 그룹을 지어 유지하라.
*group_by(df, 그룹지을 변수)
*summarise(그룹지은객체, 함수)
#tapply함수와 유사하나, summarise함수는 결과값을 dataframe형식으로 출력하여 ggplot2에 바로 적용이 가능하다.
3.남녀 변수를 factor로 바꿉니다.
DF3 <- melt(DF2, id.vars= c("Provinces", "SumPopulation"),measure.vars= c("Male","Female"))
DF3
#melt 함수로 이상해진 변수명 바꾸기
colnames(DF3)[3] <- "Sex"
colnames(DF3)[4] <- "Population"
*melt() : 여러변수를 하나의 명목형 변수로 바꿔라(reshape2패키지)
*melt(데이터프래임객체, id.vars=바꾸지 않을 변수들, measure.vars=바꿀 변수들)
ex) melt(DF, idvars= Time, measure.vars = c(Apoint,Bponit)) : Apoint, Bpoint 변수를 하나의 명목형 변수로 만듬.#명목형 변수로 취급해도 되는 변수의 level이 각각 따로 변수로 나눠져 있는 경우 이를 하나의 명목형 변수의 Levels로 취급되게 만드는 함수가 melt()이다. 이렇게 하는 이유는 그래프로 나타내기 쉽다는것이다. levels 단위로 하나의 변수로 합쳐져 있는 상태라면 그 변수를 ggplot2의 colour이나 fill인자에 넣음르로써 다양한 그래프를 그릴수있게 된다.
4.남녀 비율을 추가합니다.
DF4 <- mutate(DF3, Ratio=Population/SumPopulation )
DF4$Ratio <- round(DF4$Ratio,3)
5.그래프 그리기1.
G1 <- ggplot(DF4, aes(x=Provinces, y= Ratio, fill=Sex)) + geom_bar(stat="identity") + coord_cartesian(ylim = c(0.45,0.55)) + theme_wsj()
G2 <- geom_text(aes(y=Ratio, label=Ratio,), colour="white")
G1+G2
6.텍스트 표시를 그래프 가운데 넣기 위해 테이터에 위치값을 추가하고,
그래프를 다시 셋팅합니다. (위의 퍼센트 글자 가독성 조정)
#데이터 위치값 추가
DF4 <- mutate(DF4, position =ifelse(Sex=="Male", 0.475, 0.525))
DF4
#그래프를 다시 셋팅합니다.
G1 <- ggplot(DF4, aes(x=Provinces, y=Ratio, fill= Sex)) + geom_bar(stat="identity",position="fill") + coord_cartesian(ylim=c(0.45,0.55)) +theme_wsj() ;
G2 <- geom_text(aes(y=position, label =Ratio), colour ="white") G1+G2
*position = "" 의 옵션 3가지
fill : 전체를 1로 누적되게 표현(이 예제에서는 남녀 합이 어짜피 1이므로 생략 가능)
dodge: 피해서
identity : 겹쳐서
*geom_bar(width = "" )로 막대너비조정 가능
7. X축 라벨 겹침문제 해결하기
#방법1: 글자의 각도를 바꾸기 (45도)
G1+G2+theme(axis.text.x=element_text(angle=45, hjust=1))
#방법2 : 글자의 가로길이를 제한함으로써 글자를 아래로 배열하기
G1+G2+ aes(stringr::str_wrap(Provinces, 1), Ratio) + xlab(NULL) #글자의 길이를 1로 제한
저는 45도 각도가 좀 더 이쁜거거같습니다.
#참고 : https://rfriend.tistory.com/314 [R, Python 분석과 프로그래밍의 친구 (by R Friend)]
#참고1. 축 텍스트 및 제목 텍스트
축 텍스트 및 제목에 대한 공통 테마 속성
ggplot(mtcars, aes(x = factor(cyl), y = mpg))
+ geom_point()
+ theme(
axis.text.x = element_text(color = "grey20", size = 20, angle = 90, hjust = .5, vjust = .5, face = "plain"), axis.text.y = element_text(color = "grey20", size = 12, angle = 0, hjust = 1, vjust = 0, face = "plain"),
axis.title.x = element_text(color = "grey20", size = 12, angle = 0, hjust = .5, vjust = 0, face = "plain"), axis.title.y = element_text(color = "grey20", size = 12, angle = 90, hjust = .5, vjust = .5, face = "plain"))
#참고2. 그래프 title, subtitle ,축 별 제목 설정
ggplot(Cars93, aes(x=Weight, y=MPG.highway,colour=MPG.highway))
+ geom_point()
+scale_colour_gradient(low='lightyellow', high='red',limits=c(20,30))
+ facet_grid(Origin ~ Type)+ggtitle('ggplot 예제')
+theme(plot.title=element_text(face='bold',size=30))
+ labs( subtitle = 'The sub title', x = 'x', y = 'y', color = 'colors')
+xlim(c(0,4000))+ylim(c(20,40))
#참고 블로그
'R프로그래밍,통계학 > R까기2' 카테고리의 다른 글
클리블랜드 점 그리기(X축에 여러개의 명목형 변수가 쓰였을 때) (0) | 2020.09.06 |
---|---|
(명목형변수별로 수치를 나타낼때)_dplyr 패키지를 이용해 필요한 데이터를 만들고 그래프로 나타내기 (0) | 2020.08.02 |
ggplot2로 하는 정교한 시각화-막대그래프(geom_bar) (0) | 2020.08.01 |
ggplot2로 하는 정교한 시각화-산점도 (0) | 2020.07.29 |
시각화,탐색적자료분석에 사용하는 4가지 메인 그래프와 특성 요약 (0) | 2020.07.29 |