티스토리 뷰

 

하나의 데이터도 전달하는 자의 의도에 따라 다양한 그래프로 표현이 가능합니다. 그래서 어떤 그래프 형태를 이용해야 더 효과적으로 의미를 전달할 수 있을까 항상 고민을 하게 되는것 같습니다. 간혹 인터넷에서 통계자료를 보면서 기발한 아이디어를 얻기도 하고, 때로는 저 그래프보다는 다른 형식이 더 좋았을텐데 하고 아쉬움이 들기도 합니다.

 

그럼 R의 강력한 visualizing 패키지인 ggplot을 이용해서 기본 8가지 그래프 그리기를 해보겠습니다.

 

[  ggplot  ]

1. geom_bar()

2. geom_area()

3. geom_line()

4. geom_point()

 


 

우선 이번에 사용할 라이브러리를 불러옵니다.

library(viridis) 
library(ggplot2) 
library(dplyr) 

 

 

연습 데이터를 만들었는데 주의할 부분은 course_level을 factor로 지정해서 level을 설정하는 부분입니다.

# create a dataset 
course <- c(rep("A" , 3) , rep("B" , 3) , rep("C" , 3)) 
course_level <- rep(c("Basic" , "Advanced" , "Expert") , 3) %>%  
  factor(level=c("Basic" , "Advanced" , "Expert")) 
value <- abs(rnorm(9 , 5 , 10)) 
data <- data.frame(course, course_level, value) 
> data 
  course    level      value 
1      A    Basic  1.4410656 
2      A Advanced 17.4094036 
3      A   Expert  0.8543571 
4      B    Basic  5.2130577 
5      B Advanced  8.5235640 
6      B   Expert  9.0098816 
7      C    Basic  6.7049045 
8      C Advanced 16.8246703 
9      C   Expert  6.9517427

 

※ TIP

데이터 셋을 만들 때 별도로 level을 지정하지 않으면 알파벳 순서로 level이 자동 지정됩니다. 그러면 다음과 같이 Advanced > Basic > Expert 가 되어서 원치 않는 그래프가 그려지게 됩니다.

# level 지정하지 않았을때
> course <- c(rep("A" , 3) , rep("B" , 3) , rep("C" , 3)) 
> course_level <- rep(c("Basic" , "Advanced" , "Expert") , 3) 
> value <- abs(rnorm(9 , 5 , 10)) 
> data <- data.frame(course, course_level, value)
> levels(data$course_level) 
[1] "Advanced" "Basic"    "Expert"

# level 지정 했을때
> course <- c(rep("A" , 3) , rep("B" , 3) , rep("C" , 3)) 
> course_level <- rep(c("Basic" , "Advanced" , "Expert") , 3) %>%  
  +   factor(level=c("Basic" , "Advanced" , "Expert")) 
> value <- abs(rnorm(9 , 5 , 10)) 
> data <- data.frame(course, course_level, value) 
> levels(data$course_level) 
[1] "Basic"    "Advanced" "Expert" 

1. geom_bar()

geom_bar를 이용해서는 첫번째 그래프와 같이 course 그룹별로 묶을 수 있습니다. level 수가 적을때는 좋을지 몰라도 level이 많아지면 한눈에 들어오는 그래프는 아닐것 같습니다. 거기에서 두번째 그래프와 같이 bar기둥을 위로 올려 쌓(stack)을 수도 있습니다. 이렇게 되면 각 course별로 전체 value값의 비교도 쉬워지겠지요. 한걸음 더 나아가서 세로축을 100% 비율로 맞춰 주면 각 course별 value 값에 상관없이 value 비율을 비교하기에 적합한 그래프가 그려집니다.  

 

# Grouped 
ggplot(data, aes(x=course, y=value, fill=course_level)) + 
  geom_bar(position='dodge', stat='identity') + 
  scale_fill_viridis(discrete = T) + 
  theme_minimal() 

# Stacked 
ggplot(data, aes(x=course, y=value, fill=course_level)) + 
  geom_bar(position="stack", stat="identity") + 
  scale_fill_viridis(discrete = T) + 
  theme_minimal() 

# Stacked + percent 
ggplot(data, aes(x=course, y=value, fill=course_level)) + 
  geom_bar(position="fill", stat="identity") + 
  scale_fill_viridis(discrete = T) + 
  theme_minimal() 

2. geom_area()

geom_area를 이용해서는 다음 course로 넘어감에 따라 level 변화의 추세를 볼 수 있습니다. 시간과 관련된 데이터에 적합한 방법이 될 수 있겠습니다. bar 그래프와 마찬가지로 세로축을 100% 로 맞춰 비율을 볼 수도 있습니다.

 

# Area
ggplot(data, aes(x=course, y=value, group=level, fill=course_level)) + 
  geom_area(stat="identity", position='stack') + 
  scale_fill_viridis(discrete = T) + 
  theme_minimal() 

# Area + percent 
ggplot(data, aes(x=course, y=value, group=level, fill=course_level)) + 
  geom_area(stat="identity", position='fill') + 
  scale_fill_viridis(discrete = T) + 
  theme_minimal()

3. geom_line()

4. geom_point()

geom_line과 geom_point는 각각 따로 이용할 수도 있지만 경우에 따라 함께 그려서 더 좋은 그래프를 그릴 수도 있습니다.

 

# Line 
ggplot(data, aes(x=course, y=value, group=level, color=course_level)) + 
  geom_line() + 
  scale_fill_viridis(discrete = T) + 
  theme_minimal() 

# Dot 
ggplot(data, aes(x=course, y=value, group=level, color=course_level)) + 
  geom_point() + 
  scale_fill_viridis(discrete = T) + 
  theme_minimal() 

# Line + Dot 
ggplot(data, aes(x=course, y=value, group=level, color=course_level)) + 
  geom_point() + 
  geom_line() + 
  scale_fill_viridis(discrete = T) + 
  theme_minimal()

 

 


가장 마음에 드는 그래프는 어떤 그래프인가요?

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함