'R ggplot2로 bin 범위가 다른 히스토그램 그리기'에 해당되는 글 1건

  1. 2019.02.17 [R] ggplot2로 bin 범위가 다른 히스토그램 그리기 (histogram with different bin width using R ggplot2) (4)

일반적으로 R ggplot2로 히스토그램을 그릴 때 동일한 폭의 bin 넓이(bin width)를 설정해줍니다. 


이번 포스팅에서는 R ggplot2로 bin의 넓이를 다르게 설정한 히스토그램 그리는 방법을 소개하겠습니다. (histogram with different bin width using R ggplot2)


간단한 예제 데이터프레임을 만들어서 예를 들어보았습니다. 요점은 사용자가 정의한 binwidth에 해당하는 group 변수를 하나 만들구요, geom_histogram() 함수로 히스토그램을 그릴 때 group 별로 subset을 하고 breaks argument로 사용자가 정의한 binwidth 구간을 설정해주는 것입니다. 



#----------------

# histogram with variable size of bin width and different colors per bins using ggplot2

#----------------


# sample data frame

mydf <- data.frame(var = c(1100, 10000, 100000, 190000, 110000, 220000, 550000, 701000, 790000))


# numeric notation for large numbers

options(scipen = 30)


library("ggplot2")


# fill color with different colors per bins

mydf$group <- ifelse(mydf$var < 10000, 1, 

                          ifelse(mydf$var < 100000, 2, 

                                 ifelse(mydf$var < 200000, 3, 

                                        ifelse(mydf$var < 500000, 4, 5))))


# breaks of bin

bins <- c(1000, 10000, 100000, 200000, 500000, 800000)


# draw histogram with variable size of bin width and different colors per bins

ggplot(mydf, aes(x= var)) +

  geom_histogram(data=subset(mydf, group==1), breaks = c(1000, 10000), fill="black") +

  geom_histogram(data=subset(mydf, group==2), breaks = c(10000, 100000), fill="yellow") +

  geom_histogram(data=subset(mydf, group==3), breaks = c(100000, 200000), fill="green") +

  geom_histogram(data=subset(mydf, group==4), breaks = c(200000, 500000), fill="blue") +

  geom_histogram(data=subset(mydf, group==5), breaks = c(500000, 800000), fill="red") +

  scale_x_continuous(breaks = bins, limits = c(1000, 800000)) +

  xlab("variable 1") + 

  ylab("count") +

  ggtitle("Histogram with different size of bin width and colors") + 

  theme(plot.title = element_text(hjust = 0.5, size = 14))


 



많은 도움이 되었기를 바랍니다. 


이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾹 눌러주세요. :-)



Posted by R Friend Rfriend

댓글을 달아 주세요

  1. 2021.02.02 04:10  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • R Friend Rfriend 2021.02.04 01:03 신고  댓글주소  수정/삭제

      안녕하세요 Hyoungjoo 님,
      Bioinformatics 전공하시나 보네요? 반갑습니다.

      먼저 답변이 늦어서 죄송합니다. 보통은 질문이 올라오면 퇴근 후 저녁에 바로 답글을 달곤 하는데요, 어제랑 오늘은 집 이사때문에 새벽까지 짐 정리하고 낮에는 여기저기 차타고 왔다갔다 하고 짐 정리하느라 너무 바쁘고 정신이 하나도 없어서 답변이 늦어졌습니다.

      peptide_num 의 새로운 구간 bin 을 만들고 --> bin 그룹별로 frequency 집계를 한 후에 --> Bar plot 을 그리시면 되겠네요.

      아래 코드 참고하세요. (링크 주셨던 엑셀을 읽어오는 절차로 했습니다. R 코드를 댓글란에 붙이면 indentation이 모두 없어져버리므로 RStudio 편집란에 새로 입력해서 identation 맞추시면 됩니다. )

      ## ----------------------------------
      ## Bar plot after groupby aggregation
      ## ----------------------------------

      ## reading data from excel
      library(readxl)

      protein <- read_excel("/Users/ihongdon/Downloads/example.xlsx", # path
      sheet = "example", # sheet name to read from
      range = "A1:B700", # cell range to read from
      col_names = TRUE, # TRUE to use the first row as column names
      col_types = "guess", # guess the types of columns
      na = "NA") # Character vector of strings to use for missing values

      str(protein)
      # tibble [699 x 2] (S3: tbl_df/tbl/data.frame)
      # $ protein : chr [1:699] "apolipoprotein B-100 [OS=Homo sapiens]" "Serum albumin [OS=Homo sapiens]" "Complement C3 [OS=Homo sapiens]" "Complement C4-B [OS=Homo sapiens]" ...
      # $ num_peptides: num [1:699] 220 119 166 107 104 76 82 69 51 58 ...


      head(protein)
      # # A tibble: 6 x 2
      # protein num_peptides
      # <chr> <dbl>
      # 1 apolipoprotein B-100 [OS=Homo sapiens] 220
      # 2 Serum albumin [OS=Homo sapiens] 119
      # 3 Complement C3 [OS=Homo sapiens] 166
      # 4 Complement C4-B [OS=Homo sapiens] 107
      # 5 Complement C4-A [OS=Homo sapiens] 104
      # 6 Ceruloplasmin [OS=Homo sapiens] 76


      ## GroupBy aggregation by bin
      library(dplyr)

      protein_bin_freq <- protein %>%
      mutate(num_peptides_bin = ifelse(num_peptides > 7, 8, num_peptides)) %>%
      group_by(num_peptides_bin) %>%
      summarise(peptides_bin_freq = n())


      ## plotting Bar plot
      library(ggplot2)
      ggplot(data=protein_bin_freq, aes(x=num_peptides_bin, y=peptides_bin_freq)) +
      geom_bar(stat="identity", position="identity", colour='gray', width=0.5) +
      theme_bw() + # white background
      ggtitle("Frequency by number of proteins")

  2. 2021.02.08 00:11  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • R Friend Rfriend 2021.02.08 11:01 신고  댓글주소  수정/삭제

      대학원 때 Bioinformatics 수업 한학기 들었었는데요, 무척 전망도 좋고 보람도 있는 분야라는 생각이 들었습니다.

      문제가 잘 해결되면 좋겠네요.