막대그래프 너비와 간격 조절

개요

이번 글에서는 R의 ggplot2 패키지를 사용하여 막대그래프를 그릴 때 막대 너비와 간격을 조정하는 방법을 알아보겠습니다. geom_colposition_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")
  )

Iris 품종별 꽃받침 및 꽃잎의 길이와 너비를 나타낸 그래프

막대 너비와 간격을 조정하는 두 가지 함수

geom_col 함수의 widthposition_dodge 함수의 width를 사용하면 막대그래프의 너비와 간격을 손쉽게 조정할 수 있습니다. geom_colwidth는 막대 자체의 너비를, position_dodgewidth는 막대 사이 간격을 조정하는 역할을 합니다.

구분 position_dodgewidth geom_colwidth
역할 동일한 x 위치에 있는 막대들이 얼마나 떨어져 배치될지 조정 각 막대의 너비 조정
기본값 기본값은 NULL이나, 자동으로 적절한 간격이 설정됨 기본값은 0.9
단위 x축 값에 대한 상대적인 단위 x축 값에 대한 상대적인 단위(예: 0.9는 x축 간격을 기준으로 막대 너비를 90%로 설정한다는 의미)
값이 클수록 막대들 사이의 간격이 넓어짐 값이 작을수록 막대가 얇아지고, 1 이상일 경우 막대가 x축 간격을 초과해 두꺼워짐

추가로, geom_colwidthposition_dodgewidth보다 크면 막대가 서로 겹치게 됩니다. 반대로 geom_colwidth가 더 작으면 막대 간 간격이 벌어집니다. 두 값이 같을 경우 막대들이 딱 붙어있는 형태를 가지게 됩니다.

막대 너비를 줄이고 간격 없애기

막대의 너비를 줄이면서 막대들 간의 간격을 없애고 싶다면, geom_colposition_dodgewidth 값을 동일하게 설정해야 합니다. 기본값인 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_colwidth는 따로 설정하지 않으면 기본값인 0.9가 적용됩니다. 막대들 간 간격이 겹치지 않도록 하려면 position_dodgewidth를 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_colwidth를 0.7로 설정하고, position_dodgewidth를 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")
  )

막대 너비를 줄이고 간격을 넓힌 그래프

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