티스토리 뷰

막대그래프에 색을 지정할때, 하나만 할 수 있거나 아니면 특정 변수를 매핑해서 변화를 줄수는 있으나, 그라데이션 효과를 주려하면 마땅한 옵션을 찾을 수가 없다.(못찾은 것일 수도 있다..) 약간 임의로 데이터를 쪼개서 잘 지정만 한다면 아래와 같이 y 값이 높을수록 더 진한 빨강으로 매핑하는 등의 효과를 줄 수 있다. 핵심은 데이터의 가공처리방법이다.

 

이렇게 만들기 전에, 쉬운 예제를 하나 만들어서 데이터를 이해해야 한다. a/b/c 구분별로 1 을 3개씩 가지고, 나머지 z 는 색상의 변화를 위해서 cumsum 처리한 x 필드별로 누적합산필드이다. 

tb_0 = tibble(x = c("A", "B", "C", "A", "B", "C", "A", "B", "C"),
       y = c(1,1,1,1,1,1,1,1,1),
       z = c(1,1,1,2,2,2,3,3,3))
       
# A tibble: 9 × 3
  x         y     z
  <chr> <dbl> <dbl>
1 A         1     1
2 B         1     1
3 C         1     1
4 A         1     2
5 B         1     2
6 C         1     2
7 A         1     3
8 B         1     3
9 C         1     3

 

이 데이터를 아래와 같이 지정하면, 높이가 1씩 쌓이는 누적막대그래프가 생성된다. 근데 z 열로 색을 지정하기 때문에 누적된 값에 매칭되서 색상이 변화된다. 이 데이터를 잘게 쪼개면 그라데이션 효과가 나오게 되는 것이다. 

ggplot(tb_0, aes(x = x, y = y, fill = z)) +
  geom_col(width = 0.7) +
  scale_fill_gradient(low = "yellow", high = "red", na.value = NA) + 
  theme_minimal()

반응형

자 데이터를 잘게 쪼개는 로직을 만든다. for / if 문으로 만들어도 되겠지만, dplyr 패키지를 활용해서 하나 만들어본다. 처음에는 7.1, 4.2, 9 이런 3개의 숫자를 1 로 잘게 쪼개면, 아래의 결과가 나온다.

tb_n = 1
  
tb = tibble(x = c("A", "B", "C"), y = c(7.1,4.2,9)) %>% 
  mutate(b = y %/% tb_n) %>%
  mutate(b1 = y - b * tb_n) %>%
  mutate(d = map2(tb_n, b, rep)) %>% 
  mutate(e = map2(d,b1,append)) %>% 
  unnest_longer(e) %>% 
  select(x, e) %>% 
  group_by(x) %>% 
  mutate(f = cumsum(e)) %>% 
  ungroup()
  
  # A tibble: 23 × 3
   x         e     f
   <chr> <dbl> <dbl>
 1 A     1       1  
 2 A     1       2  
 3 A     1       3  
 4 A     1       4  
 5 A     1       5  
 6 A     1       6  
 7 A     1       7  
 8 A     0.100   7.1
 9 B     1       1  
10 B     1       2  
# … with 13 more rows

ggplot(tb, aes(x = x, y = e, fill = f)) +
  geom_col(width = 0.7) +
  scale_fill_gradient(low = "yellow", high = "red", na.value = NA) + 
  theme_minimal()

 

 

이걸 더 세밀히 데이터를 조작하고, 색을 좀 다르게 지정해서 하나 만든 결과이다. 그래프를 공부하다보면 다른 것보다도 색을 잘 지정하는게 정말 어렵다는 걸 느낀다.

tb_n = 0.01

tb = tibble(x = c("A", "B", "C"), y = c(7.1,4.2,9)) %>% 
  mutate(b = y %/% tb_n) %>%
  mutate(b1 = y - b * tb_n) %>%
  mutate(d = map2(tb_n, b, rep)) %>% 
  mutate(e = map2(d,b1,append)) %>% 
  unnest_longer(e) %>% 
  select(x, e) %>% 
  group_by(x) %>% 
  mutate(f = cumsum(e)) %>% 
  ungroup()

ggplot(tb, aes(x = x, y = e, fill = f)) +
  geom_col(width = 0.7) +
  scale_y_continuous(expand = expansion(c(0,0.05))) +
  scale_fill_gradient(low = "#A0D995", high = "#4CACBC", na.value = NA) + 
  theme_void(base_family = "AppleSDGothicNeo-ExtraBold") +
  theme(plot.margin = margin(1,1,1,1,"cm"),
        plot.background = element_rect(fill = "#F1F0EA", color = "#F1F0EA"), ##FBF1E6 F1F0EA
        axis.line.x = element_line(size = .5, colour = "gray30"),
        axis.text.x = element_text(margin = margin(5,0,0,0,"mm")),
        legend.title = element_blank()
        )
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
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
글 보관함