막대그래프 너비와 간격 조절
개요
이번 글에서는 R의 ggplot2 패키지를 사용하여 막대그래프를 그릴 때 막대 너비와 간격을 조정하는 방법을 알아보겠습니다. geom_col과 position_dodge 함수의 다양한 설정을 활용해 여러분의 데이터를 더 깔끔하고 직관적으로 시각화해 봅시다.
이번 시간에는 둘 이상의 속성 시각화 글에서 그린 차트를 활용하겠습니다. 기본 막대그래프를 살펴보면, 별도 설정을 해주지 않으면 geom_col로 그린 막대그래프는 아래와 같이 막대가 서로 붙어 있게 됩니다.
# 패키지 로드
library(showtext)
# 글꼴 설정
font_add("kopub", "C:/Users/.../AppData/Local/Microsoft/Windows/Fonts/KoPub Dotum Medium.ttf")
showtext_auto()
showtext_opts(dpi=300)
theme.size = 14
text.size = theme.size / .pt
# 차트 그리기
ggplot(data = data2,
aes(x = 구분, y = 값, group = 종류, fill = 종류)) +
geom_col(position=position_dodge()) +
geom_text(aes(label=scales::comma(값, accuracy = .1)),
position=position_dodge(width = 0.9),
vjust = -0.5,
family = "kopub",
size = text.size) +
scale_y_continuous(name = "길이(단위: cm)",
expand = expansion(mult = c(0, 0.3))) +
theme_bw(base_family = "kopub", base_size = theme.size) +
theme(
axis.title.x = element_blank(),
legend.title = element_blank(),
legend.key.height = unit(theme.size, "pt"),
legend.key.spacing.y = unit(3, "pt")
)

막대 너비와 간격을 조정하는 두 가지 함수
geom_col 함수의 width와 position_dodge 함수의 width를 사용하면 막대그래프의 너비와 간격을 손쉽게 조정할 수 있습니다. geom_col의 width는 막대 자체의 너비를, position_dodge의 width는 막대 사이 간격을 조정하는 역할을 합니다.
| 구분 | position_dodge의 width | geom_col의 width |
|---|---|---|
| 역할 | 동일한 x 위치에 있는 막대들이 얼마나 떨어져 배치될지 조정 | 각 막대의 너비 조정 |
| 기본값 | 기본값은 NULL이나, 자동으로 적절한 간격이 설정됨 | 기본값은 0.9 |
| 단위 | x축 값에 대한 상대적인 단위 | x축 값에 대한 상대적인 단위(예: 0.9는 x축 간격을 기준으로 막대 너비를 90%로 설정한다는 의미) |
| 값 | 값이 클수록 막대들 사이의 간격이 넓어짐 | 값이 작을수록 막대가 얇아지고, 1 이상일 경우 막대가 x축 간격을 초과해 두꺼워짐 |
추가로, geom_col의 width가 position_dodge의 width보다 크면 막대가 서로 겹치게 됩니다. 반대로 geom_col의 width가 더 작으면 막대 간 간격이 벌어집니다. 두 값이 같을 경우 막대들이 딱 붙어있는 형태를 가지게 됩니다.
막대 너비를 줄이고 간격 없애기
막대의 너비를 줄이면서 막대들 간의 간격을 없애고 싶다면, geom_col과 position_dodge의 width 값을 동일하게 설정해야 합니다. 기본값인 0.9보다 작은 값을 사용하면 막대의 너비를 줄일 수 있습니다. 이번에는 두 값을 모두 0.5로 설정해 보겠습니다. 이렇게 하면 막대가 더 얇아지면서 서로 간격 없이 정렬됩니다.
ggplot(data = data2,
aes(x = 구분, y = 값, group = 종류, fill = 종류)) +
geom_col(position=position_dodge(width=0.5), width = 0.5) +
geom_text(aes(label=scales::comma(값, accuracy = .1)),
position=position_dodge(width=0.5),
vjust = -0.5,
family = "kopub",
size = text.size) +
scale_y_continuous(name = "길이(단위: cm)",
expand = expansion(mult = c(0, 0.3))) +
theme_bw(base_family = "kopub", base_size = theme.size) +
theme(
axis.title.x = element_blank(),
legend.title = element_blank(),
legend.key.height = unit(theme.size, "pt"),
legend.key.spacing.y = unit(3, "pt")
)

막대 너비는 유지하고 간격 넓히기
이번에는 막대의 너비는 그대로 두고 막대들 사이의 간격을 넓혀보겠습니다. geom_col의 width는 따로 설정하지 않으면 기본값인 0.9가 적용됩니다. 막대들 간 간격이 겹치지 않도록 하려면 position_dodge의 width를 0.9보다 큰 값으로 지정하면 됩니다. 예를 들어, 이번에는 1로 설정해보겠습니다. 아래 그래프를 보면 막대들 간의 간격이 넓어진 것을 확인할 수 있습니다. 하지만 막대 자체의 너비가 여전히 두껍기 때문에 여백이 부족해 약간 답답해 보이는 점이 아쉬울 수 있습니다.
ggplot(data = data2,
aes(x = 구분, y = 값, group = 종류, fill = 종류)) +
geom_col(position=position_dodge(width=1)) +
geom_text(aes(label=scales::comma(값, accuracy = .1)),
position=position_dodge(width=1),
vjust = -0.5,
family = "kopub",
size = text.size) +
scale_y_continuous(name = "길이(단위: cm)",
expand = expansion(mult = c(0, 0.3))) +
theme_bw(base_family = "kopub", base_size = theme.size) +
theme(
axis.title.x = element_blank(),
legend.title = element_blank(),
legend.key.height = unit(theme.size, "pt"),
legend.key.spacing.y = unit(3, "pt")
)

막대 너비 줄이고 간격 넓히기
마지막으로, 기본값에서 조금 변화를 줘서 막대의 너비를 줄이고 막대 사이 간격을 넓혀보겠습니다. 이렇게 하면 그래프에 적당한 여백이 생겨 더 깔끔하게 보이죠. 예를 들어, geom_col의 width를 0.7로 설정하고, position_dodge의 width를 0.8로 지정하면 됩니다. 아래 그래프를 보면, 막대 그룹 사이 간격이 그룹 내부의 막대 간격보다 더 넓게 조정되어 시각적으로 균형 잡힌 느낌을 주는 것을 확인할 수 있습니다.
ggplot(data = data2,
aes(x = 구분, y = 값, group = 종류, fill = 종류)) +
geom_col(position=position_dodge(width=0.8), width=0.7) +
geom_text(aes(label=scales::comma(값, accuracy = .1)),
position=position_dodge(width=0.8),
vjust = -0.5,
family = "kopub",
size = text.size) +
scale_y_continuous(name = "길이(단위: cm)",
expand = expansion(mult = c(0, 0.3))) +
theme_bw(base_family = "kopub", base_size = theme.size) +
theme(
axis.title.x = element_blank(),
legend.title = element_blank(),
legend.key.height = unit(theme.size, "pt"),
legend.key.spacing.y = unit(3, "pt")
)

막대그래프는 데이터를 전달할 때 가장 자주 쓰이는 시각화 도구 중 하나입니다. 그래프의 가독성을 높이고 메시지를 더 분명하게 전달하려면 막대의 너비와 간격을 적절히 조정하는 게 중요합니다. 다양한 설정을 시도하며 조정해 보세요!