5. [] barplot with error bar []
2019. 1. 15. 23:18
R mark down으로 작성
bar plot with error bar
bar plot
par(mfrow = c(1,1))
barplot(c(1, 2, 3, 4)) # y값만 입력한 경우
barplot(c(1, 2, 3, 4), names.arg = c("A", "B", "C", "D")) # y값과 x축이름을 지정한 경우
데이터 가져와서, 각 칼럼들의 기준별 통계구하기
attach(iris)
head(iris)
Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | Species <fctr> | |
---|---|---|---|---|---|
1 | 5.1 | 3.5 | 1.4 | 0.2 | setosa |
2 | 4.9 | 3.0 | 1.4 | 0.2 | setosa |
3 | 4.7 | 3.2 | 1.3 | 0.2 | setosa |
4 | 4.6 | 3.1 | 1.5 | 0.2 | setosa |
5 | 5.0 | 3.6 | 1.4 | 0.2 | setosa |
6 | 5.4 | 3.9 | 1.7 | 0.4 | setosa |
str(iris)
## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
# bar의 높이(y값)으로 쓰일 각 칼럼의 <종별> 평균 계산하기
# aggregate( 통계구할 칼럼, 기준칼럼(list(col1, col2), 통계함수)
# -> 종을 기준으로 4개의 칼럼의 평균값 구하기
iris.mean <- aggregate(iris[, 1:4], iris["Species"], mean)
iris.mean
Species <fctr> | Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> |
---|---|---|---|---|
setosa | 5.006 | 3.428 | 1.462 | 0.246 |
versicolor | 5.936 | 2.770 | 4.260 | 1.326 |
virginica | 6.588 | 2.974 | 5.552 | 2.026 |
# bar의 error bar로 쓰일 각 칼럼 <종별> 표준편차 구하기
iris.sd <- aggregate(iris[,1:4], iris["Species"], sd)
iris.sd
Species <fctr> | Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> |
---|---|---|---|---|
setosa | 0.3524897 | 0.3790644 | 0.1736640 | 0.1053856 |
versicolor | 0.5161711 | 0.3137983 | 0.4699110 | 0.1977527 |
virginica | 0.6358796 | 0.3224966 | 0.5518947 | 0.2746501 |
표준편차와 평균df를 가지고, error bar의 위쪽, 아래쪽 좌표 계산해놓기
# df + aggregate로 구한 표준편차 df는 첫칼럼이 기준(종별)이다.
iris.sd
Species <fctr> | Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> |
---|---|---|---|---|
setosa | 0.3524897 | 0.3790644 | 0.1736640 | 0.1053856 |
versicolor | 0.5161711 | 0.3137983 | 0.4699110 | 0.1977527 |
virginica | 0.6358796 | 0.3224966 | 0.5518947 | 0.2746501 |
# 기준칼럼 말고, 수치가 있는 [,2:5]칼럼만 가져와서
# error bar의 위쪽값과 아래쪽값을 구하자.
iris.sd.upper <- iris.mean[, 2:5] + iris.sd[, 2:5]
iris.sd.lower <- iris.mean[, 2:5] - iris.sd[, 2:5]
iris.sd.upper
Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | |
---|---|---|---|---|
5.358490 | 3.807064 | 1.635664 | 0.3513856 | |
6.452171 | 3.083798 | 4.729911 | 1.5237527 | |
7.223880 | 3.296497 | 6.103895 | 2.3006501 |
iris.mean[, 2:5]
Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | |
---|---|---|---|---|
5.006 | 3.428 | 1.462 | 0.246 | |
5.936 | 2.770 | 4.260 | 1.326 | |
6.588 | 2.974 | 5.552 | 2.026 |
iris.sd.lower
Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | |
---|---|---|---|---|
4.653510 | 3.048936 | 1.288336 | 0.1406144 | |
5.419829 | 2.456202 | 3.790089 | 1.1282473 | |
5.952120 | 2.651503 | 5.000105 | 1.7513499 |
평균을 좌표로 만들어서 barplot을 먼저 그려놓서 객체에 넣어두기(화살표의 기준점)
barplot( as.matrix(iris.mean[,2:5]),
col=c("red", "blue", "purple"))
# beside = TRUE 를 넣어주면, 좌표로 그린 df의 row별로
# barplot이 옆으로 그려지고,
# beside = FALSE는 stacked로 그려진다.
barplot( as.matrix(iris.mean[,2:5]),
beside = TRUE,
col=c("red", "blue", "purple"))
b <-barplot( as.matrix(iris.mean[,2:5]),
beside = TRUE,
col=c("red", "blue", "purple"),
ylim=c(0,8))
barplot을 그린 객체를 arrow()의 첫번째인자-화살표가 나가는 기준 으로 넣어서, barplot+arrow 동시에 그리기
# arrows는 이미 그려진곳에 그리는 것 같다. 안 그려놓으면 knit시 오류난다.
barplot( as.matrix(iris.mean[,2:5]),
beside = TRUE,
col=c("red", "blue", "purple"),
ylim=c(0,8))
arrows(b, as.matrix(iris.sd.upper), #기준, 화살표 끝의 좌표
b, as.matrix(iris.sd.lower), #기준, 화살표 끝의 좌표
angle = 90, # 몸통에서 나가는 화살표촉의 각도
length = 0.05, # 화살표 촉의 길이
code = 3) # 화살표의 갯수 : 1시작점에 화살표 2끝점에 화살표 3 양쪽에 화살표