티스토리 뷰

R

R | ggplot2로 히스토그램 그리기

Chloe A_Choe 2020. 3. 25. 16:45

 

R의 기본 함수인 hist() 외에도 ggplot2를 이용해 더 정교한 히스토그램을 그릴 수 있습니다. 

hist()를 이용한 히스토그램 그리기가 궁금하다면 click

 


> set.seed(1000)
> df <- data.frame(
+   sample=factor(rep(c("A", "B"), each=300)),
+   value=round(c(rnorm(300, mean=40, sd=5), rnorm(300, mean=60, sd=10)))
+ )

> head(df)
  sample value
1      A    38
2      A    34
3      A    40
4      A    43
5      A    36
6      A    38

우선 A, B 두 샘플의 서로 다른 평균값을 가진 데이터를 만들어줍니다.


> library(ggplot2)

# Basic histogram
> ggplot(df, aes(x=value)) + 
+   geom_histogram()

# Change the width of bins
> ggplot(df, aes(x=value)) + 
+   geom_histogram(binwidth=1)

ggplot2 라이브러리를 우선 불러온 후 value 값을 이용해 히스토그램을 그릴 수 있습니다. 여기서 binwidth값을 이용해서 오른쪽과 같은 세분화된 히스토그램을 얻을 수 있습니다.


> p <- ggplot(df, aes(x=value)) + 
+   theme_minimal()

# Change colors
> p + geom_histogram(binwidth=1,
+                  color="black", fill="gray")

# Add mean line
> p + geom_histogram(binwidth=1,
+                  color="black", fill="gray") +
+   geom_vline(aes(xintercept=mean(value)),
+              color="black", linetype="dashed", size=1)

히스토그램의 둘레 색과, 내부 색을 변경이 가능하고, 또 평균값과 같이 원하는 위치에 선을 추가할 수 도 있습니다.


 

# histogram with density plot
> p + geom_histogram(aes(y=..density..),
+                  binwidth=1,
+                  color="black", fill="gray") +
+   geom_density(alpha=0.3, fill="red")

# histogram with density plot and mean line
> p + geom_histogram(aes(y=..density..),
+                  binwidth=1,
+                  color="black", fill="gray") +
+   geom_density(alpha=0.3, fill="red") +
+   geom_vline(aes(xintercept=mean(value)),
+              color="black", linetype="dashed", size=1)

density를 함께 표기할 수 있는데, 이는 전체적인 경향을 확인하기에 좋습니다.


> p <- ggplot(df, aes(x=value, fill=sample, color=sample)) +
+   theme(legend.position="top")

# Stacked histograms
> p + geom_histogram(alpha=0.5, position='stack')

# Overlaid histograms
> p + geom_histogram(alpha=0.5, position="identity")

# Interleaved histograms
> p + geom_histogram(alpha=0.5, position="dodge")

ggplot에서 fill, color에 value값을 넣어줌으로써 A, B가 나누어진 히스토그램도 확인할 수 있습니다. 특히 position에 형태를 변경해줌으로써 원하는 그래프를 얻을 수 있습니다.


> library(plyr)

> mu <- ddply(df, "sample", summarise, grp.mean=mean(value))
> head(mu)
  sample grp.mean
1      A 40.09667
2      B 59.78000
> ggplot(df, aes(x=value, fill=sample, color=sample)) +
+   geom_histogram(aes(y=..density..), alpha=0.5, position="identity") +
+   geom_density(alpha=0.3) +
+   geom_vline(data=mu, aes(xintercept=grp.mean, color=sample),
+              linetype="dashed", size=1) +
+   theme(legend.position="top") +
+   theme_minimal()

 

두 가지 샘플에 대해서도 따로 density값과 mean 라인을 추가할 수도 있습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함