원그래프를 하나 그려볼건데, 수치가 높을수록 면적이 커지는게 원그래프 이지만, 높이도 높아지는(?) 그래프를 그려볼까 한다. 말이 좀 이상하지만, 아래 완성본을 보면 대략 이해가 갈 것이다. 높이가 다르기 때문에 일반적인 원그래프 그릴때와는 다르게 geom_rect
를 사용할 것이다.
데이터 만들기
조금은 특별한 파이차트(원그래프)를 그리기위해서는 데이터가 몇가지 더 필요하다. 단순 x/y 좌표가 아니라, geom_rect
에서 원하는 파라메터 스타일에 맞춰야한다. 아래 도움말을 보면 xmin, xmax, ymin and ymax
4개의 코너의 위치가 필요하다고 하니 그에 맞춰서 데이터를 구성해야 한다.
Rectangles
Description
geom_rect() and geom_tile() do the same thing, but are parameterised differently: geom_rect() uses the locations of the four corners (xmin, xmax, ymin and ymax), while geom_tile() uses the center of the tile and its size (x, y, width, height). geom_raster() is a high performance special case for when all the tiles are the same size.
w
만 셋팅하면 데이터가 만들어지도록 데이터를 구성한다.
tb1 = tibble(w = c(5,4,3,2,1)) %>%
mutate(x2 = cumsum(w)) %>%
mutate(x1 = lag(x2, 1, default = 0), .before = x2) %>%
mutate(x_pos = (x1 + x2) / 2) %>%
mutate(y1 = 0) %>%
mutate(y2 = w) %>%
mutate(y3 = w/4 + 4)
# A tibble: 5 × 7
w x1 x2 x_pos y1 y2 y3
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 5 0 5 2.5 0 5 5.25
2 4 5 9 7 0 4 5
3 3 9 12 10.5 0 3 4.75
4 2 12 14 13 0 2 4.5
5 1 14 15 14.5 0 1 4.25
그래프 만들기
xmin, xmax, ymin, ymax
4개의 위치를 셋팅하고 난후, geom_rect
함수를 사용한다.
ggplot(tb1, aes(xmin = x1,
xmax = x2,
ymin = y1,
ymax = y2,
fill = factor(w))) +
geom_rect() +
coord_fixed()
coord_polar
를 이용해서 원그래프를 그리면, 면적도 다르면서 높이까지 다른 원그래프가 만들어진다. 근데 너무 편차가 크다보니 이쁘지도 않고 과한 느낌이라 약간의 보정이 필요할 듯 하다.
ggplot(tb1, aes(xmin = x1,
xmax = x2,
ymin = y1,
ymax = y2,
fill = factor(w))) +
geom_rect() +
coord_polar()
y3
값이 어느정도 높이값을 보정해놓은 수치이다.
ggplot(tb1, aes(xmin = x1,
xmax = x2,
ymin = y1,
ymax = y3,
fill = factor(w))) +
geom_rect() +
coord_fixed()
y3
값을 사용하니 조금 편차가 줄어들어 볼만한 차트가 되었다.
ggplot(tb1, aes(xmin = x1,
xmax = x2,
ymin = y1,
ymax = y3,
fill = factor(w))) +
geom_rect() +
coord_polar()
그래프에 수치를 텍스트로 추가해본다. 수치가 클수록 폰트의 크기도 크게 셋팅했으며, 적당한 위치를 자동계산하기 어려워서 y_pos
에 직접 셋팅했다. 이것으로 틀은 완성되었다.
tb2 = tb1 %>%
mutate(y_pos = c(3,3,3,3,3.2)) %>%
mutate(text_size = c(10,8,6,5,4)) %>%
mutate(rate = paste0(round(w / sum(w) * 100, 1), "%"))
ggplot(tb2, aes(xmin = x1,
xmax = x2,
ymin = y1,
ymax = y3,
fill = factor(w))) +
geom_rect() +
geom_text(aes(x = x_pos,
y = y_pos,
label = rate),
size = tb2$text_size) +
coord_polar() +
theme(axis.title = element_blank())
마무리는 항상 그랬듯, 폰트/색상 등을 수정하여 마무리한다.