티스토리 뷰
반응형
막대그래프에 색을 지정할때, 하나만 할 수 있거나 아니면 특정 변수를 매핑해서 변화를 줄수는 있으나, 그라데이션 효과를 주려하면 마땅한 옵션을 찾을 수가 없다.(못찾은 것일 수도 있다..) 약간 임의로 데이터를 쪼개서 잘 지정만 한다면 아래와 같이 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
링크
TAG
- Spring
- SVN
- ggplot
- ubuntu
- MySQL
- ggplot2
- R
- eclipse
- 이클립스
- 자급제폰
- ipTIME
- MyBatis
- java
- Google Chart Tools
- 셀프개통
- javascript
- Oracle
- 아이맥
- docker
- 도넛차트
- 알뜰요금제
- github
- heroku
- 막대그래프
- ktm모바일
- vagrant
- python
- MongoDB
- 맥북
- 마인크래프트
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함