본문 바로가기
  • "You can't manage what you can't measure" Peter Drucker
데이터 분석 (with Rstudio)

[Rstudio] 막대 그래프 (bar plot, column plot) with ggplot

by Vitaminymc 2023. 10. 16.
반응형

막대 그래프(Bar plot, Bar chart)

막대 그래프는 데이터의 카테고리별 빈도수 또는 값을 막대로 나타낸 그래프이다.

막대 그래프는 주로 범주형 데이터(카테고리, 클래스, 그룹 등)를 시각화할 때 사용되며,

각 막대는 범주(카테고리)에 따라 높이(값)로 표현되며, 막대의 높이는 해당 범주의 빈도수, 수량, 또는 특정 값을 나타낸다.

 

R 기본함수 : barplot 함수를 사용한 막대 그래프

library(palmerpenguins)

data("penguins")  #Dataset 불러오기

str(penguins)  #Dataset 구성 확인
> str(penguins)  #Dataset 구성 확인
tibble [344 × 8] (S3: tbl_df/tbl/data.frame)
 $ species          : Factor w/ 3 levels "Adelie","Chinstrap",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ island           : Factor w/ 3 levels "Biscoe","Dream",..: 3 3 3 3 3 3 3 3 3 3 ...
 $ bill_length_mm   : num [1:344] 39.1 39.5 40.3 NA 36.7 39.3 38.9 39.2 34.1 42 ...
 $ bill_depth_mm    : num [1:344] 18.7 17.4 18 NA 19.3 20.6 17.8 19.6 18.1 20.2 ...
 $ flipper_length_mm: int [1:344] 181 186 195 NA 193 190 181 195 193 190 ...
 $ body_mass_g      : int [1:344] 3750 3800 3250 NA 3450 3650 3625 4675 3475 4250 ...
 $ sex              : Factor w/ 2 levels "female","male": 2 1 1 NA 1 2 1 2 NA NA ...
 $ year             : int [1:344] 2007 2007 2007 2007 2007 2007 2007 2007 2007 2007 ...

barplot #1

barplot(table(penguins$species),
        main = "Species Count", ylab = "Count", xlab = "Species", col = "darkblue")

barplot

 

barplot #2 : horiz = F

barplot(table(penguins$species), horiz = F,
        main = "Species Count (horiz = F)",  ylab = "Count", xlab = "Species", col = "blue")

barplot

 

barplot #3 : horiz = T

barplot(table(penguins$species), horiz = T,
        main = "Species Count (horiz = T)", ylab = "Species", xlab = "Count", col = "darkgreen")

barplot

 

barplot #4 : Group (species)별 다른 색상으로 표시

table(penguins$species)
   Adelie Chinstrap    Gentoo 
      152            68           124 
# 종별 색상 지정
colors <- c("darkblue", "darkgreen", "darkred")

# 막대 그래프 그리기
barplot(table(penguins$species),
        main = "Species Count", xlab = "Species", ylab = "Count", col = colors)

barplot


300x250

ggplot + geom_barplot

geom_bar()에는 기본으로 count 기능이 적용되어 있어,

데이터를 그룹화하여 빈도수 또는 카테고리별로 표시한다. 

 

막대 그래프의 막대 배치 옵션 (position = "옵션명")

stack (기본값) : 막대를 위로 쌓아서 표시
dodge : 막대를 옆으로 배열하여 겹치지 않게 표시 
fill : 막대를 100%로 채워서 표시 각 범주의 막대를 100%로 표시

 

geom_barplot #1

ggplot(penguins, aes(x=species)) + geom_bar(fill="darkblue") +
	labs(title = "Species Count", x = "Species", y = "Count")

geom_barplot

 

geom_barplot #2 : Group (species)별 다른 색상으로 표시 (자동 지정)

x = species, fill = species

ggplot(penguins, aes(x=species)) + geom_bar(aes(fill=species)) +
  labs(title = "Species Count", x = "Species", y = "Count")

geom_barplot

 

geom_barplot #3 : Group (species)별 다른 색상으로 표시 (색상 지정)

scale_fill_manual(values = colors)

# 종별 색상 지정
colors <- c("darkblue", "darkgreen", "darkred")

# 막대 그래프 그리기
ggplot(penguins, aes(x=species)) + geom_bar(aes(fill=species)) +
  scale_fill_manual(values = colors) +
  labs(title = "Species Count", x = "Species", y = "Count")

geom_barplot

 

geom_barplot #4 : 두 Group (species, sex) 표시 [누적 막대그래프]

ggplot(penguins, aes(x=species)) + geom_bar(aes(fill=sex)) +
  labs(title = "Species Count", x = "Species", y = "Count")

geom_barplot

 

geom_barplot #5 : 두 Group (species, sex) 별도 표시  [position = "dodge"]

ggplot(penguins, aes(x=species)) + geom_bar(aes(fill=sex), position = "dodge") +
  labs(title = "Species Count", x = "Species", y = "Count")

geom_barplot

 

geom_barplot #6 : 두 Group (species, sex) 비율 표시  [position = "fill"]

ggplot(penguins, aes(x=species)) + geom_bar(aes(fill=sex), position = "fill") +
  labs(title = "Species Count", x = "Species", y = "Count")

geom_barplot

 

geom_barplot #7 : 값 지정

stat = "identity"

# 데이터 전처리: 종별 빈도수 계산
penguins_count <- penguins %>%
  group_by(species) %>%
  summarize(count = n())

penguins_count
> penguins_count
# A tibble: 3 × 2
  species   count
    <fct>      <int>
1 Adelie        152
2 Chinstrap    68
3 Gentoo      124
ggplot(penguins_count, aes(x=species, y=count, fill=species)) + geom_bar() +
  scale_fill_manual(values = colors) +
  labs(title = "Species Count", x = "Species", y = "Count") 
Error in `geom_bar()`:
! Problem while computing stat.
ℹ Error occurred in the 1st layer.
Caused by error in `setup_params()`:
! `stat_count()` must only have an x or y aesthetic.
Run `rlang::last_trace()` to see where the error occurred.
 "geom_bar"는 데이터를 직접 사용하는 것이 아니라 빈도수를 계산하는 stat_count()와 함께 사용됨에 따라,
 Error 메세지 표시 
ggplot(penguins_count, aes(x=species, y=count, fill=species)) + geom_bar(stat = "identity") +
  scale_fill_manual(values = colors) +
  labs(title = "Species Count", x = "Species", y = "Count")

geom_barplot

ggplot + geom_col

geom_col()도 ggplot2 패키지를 사용하여 막대 그래프를 그리는 함수이다.

geom_bar()와 유사하지만, geom_bar는 데이터를 직접 사용하는 것이 아니라

빈도수를 계산하는 stat_count()을 통해서, x축만 입력해도 통계적 변환 후 그래프에 표시
geom_col은 데이터를 변환하지 않고 그대로 표시

 

geom_col #1

ggplot(penguins_count, aes(x=species, y=count, fill=species)) + geom_col() +
  scale_fill_manual(values = colors) +
  labs(title = "Species Count", x = "Species", y = "Count")

geom_col

 

geom_col #2

ggplot(penguins_count, aes(x=count, y=species, fill=species)) + geom_col() +
  scale_fill_manual(values = colors) +
  labs(title = "Species Count", x = "Count", y = "Species")

geom_col

 

geom_col #3 : 두 Group (species, sex) 표시 [누적 막대그래프]

# 데이터 전처리: 종별 빈도수 계산
penguins_count <- penguins %>%
  group_by(species, sex) %>%
  summarize(count = n())

penguins_count
> penguins_count
# A tibble: 8 × 3
# Groups:   species [3]
  species       sex    count
  <fct>          <fct>  <int>
1 Adelie        female    73
2 Adelie        male       73
3 Adelie        NA           6
4 Chinstrap  female    34
5 Chinstrap  male       34
6 Gentoo     female     58
7 Gentoo     male        61
8 Gentoo     NA            5
ggplot(penguins_count, aes(x=species, y=count, fill=species)) + geom_col(aes(fill=sex)) +
  labs(title = "Species Count", x = "Species", y = "Count")

geom_col

 

geom_col #4 : 두 Group (species, sex) 별도 표시  [position = "dodge"]

ggplot(penguins_count, aes(x=species, y=count, fill=species)) + 
	geom_col(aes(fill=sex), position = "dodge") +
  	labs(title = "Species Count", x = "Species", y = "Count")

geom_col

 

 

geom_col #5 : 두 Group (species, sex) 비율 표시  [position = "fill"]

ggplot(penguins_count, aes(x=species, y=count, fill=species)) + 
	geom_col(aes(fill=sex), position = "fill") +
  	labs(title = "Species Count", x = "Species", y = "Count")

geom_col

 

 

728x90