ggpubr은 ggplot2에 기반한 R 패키지입니다. 연구자들이 쉽게 높은 질의 도표를 그리는 것을 목표로 하고 있는 시각화 패키지죠. 주요 특징은 다음과 같습니다:
ggplot2 패키지를 기반으로해서 좀 더 명확한 문법으로 보다 쉽게 사용할 수 있습니다.
R 언어를 잘 모르더라도 높은 질의 도표를 만들수 있습니다.
자동으로 p-values 나 통계적 유의성을 표시할 할 수 있습니다.
여러 도표를 한 페이지에 배열 할 수 있는 기능을 가지고 있습니다.
레이블이나 색상을 쉽게 변경할 수 있습니다.
먼저 ggpubr 로 시각화를 하는 간단한 방법을 살펴보고, 이후에 다양한 예시 도표를 보여드리겠습니다.
2 1. ggpubr 설치하기:
CRAN 을 통한 설치법은 아래와 같습니다.
install.packages("ggpubr")
3 2. ggpubr 불러오기:
library("ggpubr")
4 3. ggpubr로 도표 그리기
간단한 예시를 들어 시각화 방법을 살펴보겠습니다. 1. 대이터 불러와서 전처리하기 2. 시각화하고 설정하기
4.1 3.1. 데이터 불러오기
# 필요한 패키지 불러오기# suppressPackageStartupMessages(library(tidyverse))library("dplyr") library("ggpubr")options(warn=-1) # 경고메세지 무시하기data("ToothGrowth") # 예제 데이터 불러오기head(ToothGrowth,4) # 데이터 테이블 확인
len
supp
dose
4.2
VC
0.5
11.5
VC
0.5
7.3
VC
0.5
5.8
VC
0.5
4.2 3.2. 시각화 설정하기
options(repr.plot.width =6, repr.plot.height =4)ggline(ToothGrowth, x ="dose", y ="len", add ="mean_se", # 각각의 축설정 color ="supp", palette ="npg")+# 색상 설정하기stat_compare_means(aes(group = supp), label ="p.signif", label.y =c(16, 25, 29)) +# 통계적 유의성 표시labs(list(x ='Dose', y ='Length', fill ='Supp')) # 레이블 변경
4.3 3.3. 한페이지에 여러 도표 넣기
여러 도표를 한페이지에 넣는 기능은 ggarrange()입니다. cowplot의 plot_grid()함수에 기반하고 있죠. 그래서 사용법도 동일합니다. 아래의 예시 코드를 확인하세요.
a1 <-ggdensity(wdata, x ="weight",add ="mean", rug =TRUE, # Density plot with mean lines and marginal rugcolor ="sex", fill ="sex", # Change outline and fill colors by groups ("sex")palette =c("#00AFBB", "#E7B800")) # Use custom palettea2 <-gghistogram(wdata, x ="weight",add ="mean", rug =TRUE,color ="sex", fill ="sex",palette =c("#00AFBB", "#E7B800"))a3 <-ggdensity(wdata, x ="weight",add ="mean", rug =TRUE,fill ="lightgray")# Combine histogram and density plotsa4 <-gghistogram(wdata, x ="weight",add ="mean", rug =FALSE,fill ="sex", palette =c("#00AFBB", "#E7B800"),add_density =TRUE)# 한페이지에 넣기ggarrange(a1, a2, a3 , a4,labels =c("A", "B", "C", "D"),ncol =2, nrow =2)
# Box plots with jittered pointsp1 <-ggboxplot(df, x ="dose", y ="len",color ="dose", palette =c("#00AFBB", "#E7B800", "#FC4E07"),add ="jitter", shape ="dose")# Add p-values comparing groupsmy_comparisons <-list( c("0.5", "1"), c("1", "2"), c("0.5", "2") )p2 <- p1 +stat_compare_means(comparisons = my_comparisons)+# Add pairwise comparisons p-valuestat_compare_means(label.y =50) # Add global p-value# Violin plots with box plots insidep3 <-ggviolin(df, x ="dose", y ="len", fill ="dose",palette =c("#00AFBB", "#E7B800", "#FC4E07"),add ="boxplot", add.params =list(fill ="white"))+stat_compare_means(comparisons = my_comparisons, label ="p.signif")+# Add significance levelsstat_compare_means(label.y =50) # Add global the p-value ggarrange(p1, p2, p3,labels =c("A", "B", "C"),ncol =2, nrow =2)
6.1 4.3. 막대 그래프(Bar plots)
6.1.1 4.3.1 간단한 막대 그래프
# example Datadf <-data.frame(dose=c("D0.5", "D1", "D2"),len=c(4.2, 10, 29.5))df2 <-data.frame(supp=rep(c("VC", "OJ"), each=3),dose=rep(c("D0.5", "D1", "D2"),2),len=c(6.8, 15, 33, 4.2, 10, 29.5))df3 <- ToothGrowth# Change position: Interleaved (dodged) bar plotp1 <-ggbarplot(df2, "dose", "len",fill ="supp", color ="supp", palette ="Paired",position =position_dodge(0.8))# Change fill and outline color add labels inside barsp2 <-ggbarplot(df, "dose", "len",fill ="dose", color ="dose",palette =c("#00AFBB", "#E7B800", "#FC4E07"),label =TRUE, lab.pos ="in", lab.col ="white")# Add jitter points and errors (mean_se)p3 <-ggbarplot(df3, x ="dose", y ="len",add =c("mean_se", "jitter"))# Multiple groups with error bars and jitter pointp4 <-ggbarplot(df3, x ="dose", y ="len", color ="supp",add ="mean_se", palette =c("#00AFBB", "#E7B800"),position =position_dodge(0.8))ggarrange(p1, p2, p3, p4,labels =c("A", "B", "C", "D"),ncol =2, nrow =2)
6.1.2 4.3.2 정돈된(Ordered) 바 그래프
cyl에 따라서 그룹화하고, 전체적으로 정렬한 그래프(A)와 그룹별로 정렬한 그래프(B)의 시각화입니다.
# 샘플 데이터 불러오기data("mtcars")dfm <- mtcarsdfm$cyl <-as.factor(dfm$cyl) # Convert the cyl variable to a factordfm$name <-rownames(dfm) # Add the name columshead(dfm[, c("name", "wt", "mpg", "cyl")]) # 데이터 살펴보기
name
wt
mpg
cyl
Mazda RX4
Mazda RX4
2.620
21.0
6
Mazda RX4 Wag
Mazda RX4 Wag
2.875
21.0
6
Datsun 710
Datsun 710
2.320
22.8
4
Hornet 4 Drive
Hornet 4 Drive
3.215
21.4
6
Hornet Sportabout
Hornet Sportabout
3.440
18.7
8
Valiant
Valiant
3.460
18.1
6
a1 <-ggbarplot(dfm, x ="name", y ="mpg",fill ="cyl", # change fill color by cylcolor ="white", # Set bar border colors to whitepalette ="jco", # jco journal color palett. see ?ggparsort.val ="desc", # Sort the value in dscending ordersort.by.groups =FALSE, # Don't sort inside each groupx.text.angle =90) # Rotate vertically x axis textsa2 <-ggbarplot(dfm, x ="name", y ="mpg",fill ="cyl", # change fill color by cylcolor ="white", # Set bar border colors to whitepalette ="jco", # jco journal color palett. see ?ggparsort.val ="asc", # Sort the value in dscending ordersort.by.groups =TRUE, # Sort inside each groupx.text.angle =90) # Rotate vertically x axis textsggarrange(a1, a2,labels =c("A", "B"),ncol =1, nrow =2)
6.1.3 4.3.3. 편차(Deviation) 그래프
편차(deviation) 그래프는 각각의 값들이 평균값 대비 얼마나 차이가 나는지를 시각화 합니다. 여기서는 연비 평균값에 비교해서 각 차량의 편차가 얼마인지 계산해(Z-score) 도표를 그려보겠습니다.
# Calculate the z-score of the mpg datadfm$mpg_z <- (dfm$mpg -mean(dfm$mpg))/sd(dfm$mpg)dfm$mpg_grp <-factor(ifelse(dfm$mpg_z <0, "low", "high"), levels =c("low", "high"))# Inspect the datahead(dfm[, c("name", "wt", "mpg", "mpg_z", "mpg_grp", "cyl")])
name
wt
mpg
mpg_z
mpg_grp
cyl
Mazda RX4
Mazda RX4
2.620
21.0
0.1508848
high
6
Mazda RX4 Wag
Mazda RX4 Wag
2.875
21.0
0.1508848
high
6
Datsun 710
Datsun 710
2.320
22.8
0.4495434
high
4
Hornet 4 Drive
Hornet 4 Drive
3.215
21.4
0.2172534
high
6
Hornet Sportabout
Hornet Sportabout
3.440
18.7
-0.2307345
low
8
Valiant
Valiant
3.460
18.1
-0.3302874
low
6
# Create an ordered bar plot, colored according to the level of mpg:ggbarplot(dfm, x ="name", y ="mpg_z",fill ="mpg_grp", # change fill color by mpg_levelcolor ="white", # Set bar border colors to whitepalette ="jco", # jco journal color palett. see ?ggparsort.val ="desc", # Sort the value in descending ordersort.by.groups =FALSE, # Don't sort inside each groupx.text.angle =90, # Rotate vertically x axis textsylab ="MPG z-score",legend.title ="MPG Group",rotate =TRUE,ggtheme =theme_minimal())
7 4.4 점 그래프(Dot plot)
7.1 4.4.1 막대사탕(Lollipop) plot
막대사탕 그래프는 많은 양의 데이터를 시각화하는데 적합합니다. 아래 예시에서는 cyl 그룹에 맞춰서 색상을 구분하였습니다.
ggdotchart(dfm, x ="name", y ="mpg",color ="cyl", # Color by groupspalette =c("#00AFBB", "#E7B800", "#FC4E07"), # Custom color palettesorting ="descending", # Sort value in descending orderadd ="segments", # Add segments from y = 0 to dotsrotate =TRUE, # Rotate verticallygroup ="cyl", # Order by groupsdot.size =6, # Large dot sizelabel =round(dfm$mpg), # Add mpg values as dot labelsfont.label =list(color ="white", size =9, vjust =0.5), # Adjust label parametersggtheme =theme_pubr()) # ggplot2 theme
7.2 4.5. 도표에 설명(figure legend) 넣기
도표 밑에 설명을 넣는 방법입니다. 한줄단위로 내용을 끊어서 작성해야, 산출물에서 줄이 잘 맞게 할 수 있습니다. 아래의 예시 코드를 확인하세요.
ggparagraph(text, color =NULL, size =NULL, face =NULL, family =NULL,lineheight =NULL)# S3 method for splitTextdrawDetails(x, recording)
# Density plotdensity.p <-ggdensity(iris, x ="Sepal.Length",fill ="Species", palette ="jco")# Text plottext <-paste("Iris data set gives the measurements in cm","of the variables sepal length and width","and petal length and width, respectively,","for 50 flowers from each of 3 species of iris.","The species are Iris setosa, versicolor, and virginica.", sep =" ")text.p <-ggparagraph(text, face ="italic", size =12)# Arrange the plots on the same pageggarrange(density.p, text.p,ncol =1, nrow =2,heights =c(1, 0.3))
7.3 4.6. 선 그래프
# Data: ToothGrowth data set we'll be used.df3 <- ToothGrowth# Add error bars: mean_se# (other values include: mean_sd, mean_ci, median_iqr, ....)# Add labelsp1 <-ggline(df3, x ="dose", y ="len", add ="mean_se")# Add jitter points and errors (mean_se)p2 <-ggline(df3, x ="dose", y ="len",add =c("mean_se",'jitter'))# Multiple groups with error barsp3 <-ggline(df3, x ="dose", y ="len", color ="supp",add ="mean_se", palette =c("#00AFBB", "#FC4E07"))ggarrange(p1, p2, p3,labels =c("A", "B", "C"),ncol =2, nrow =2)
7.4 4.7. 히스토그램과 산포도(Scatter Plot with Histograms)
히스토그램과 산포도를 하나의 도표에 합쳐서 그려보도록 하겠습니다.
# Grouped dataggscatterhist( iris, x ="Sepal.Length", y ="Sepal.Width",color ="Species", size =3, alpha =0.6,palette =c("#00AFBB", "#E7B800", "#FC4E07"),margin.params =list(fill ="Species", color ="black", size =0.2))