-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathRtut02_manipulate.Rmd
195 lines (124 loc) · 5.96 KB
/
Rtut02_manipulate.Rmd
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
---
title: 'Rtutorial 02 : manipulate'
author: "Mino"
date: "Monday, February 09, 2015"
output:
html_document:
css: D:/data/r/study/r_tutorial/font.css
---
## Package : Manipulate
`manipulate` 패키지는 RStudio 상에서 손쉽게 **Interactive Plot**을 그릴 수 있게 해준다
plot을 그리는 새로운 문법을 공부하는 것이 아니라 기존에 사용하던 함수에 얹어서 쓸 수 있기 때문에 편리하다.
다만 *RStudio에서만 사용가능*하기 때문에 너무 익숙해지면 RStudio환경에 종속될 우려가 있다고는 하는데
RStudio에서 대부분의 작업을 진행하는 사람들은 상관없을 것 같다.
-------------------------
## 기본적인 사용법
```
library(manipulate)
manipulate(plot(1:x),
x = slider(1, 100))
```
`manipulate` 패키지를 불러온 다음에 어떤 방식으로 동작하는지 가볍게 살펴보자
위 코드를 보면 가장 바깥에 `manipulate()`라는 함수가 있고
그 내부에는 `plot(1:x)`와 `x = slider(1, 100)`이 있다.
`plot`의 결과물에서 interactive하게 변화시킬 항목을 변수로 놓고
그 다음줄에서 해당 변수를 어떤 방식으로(여기서는 슬라이더) 변화시킬 것인지,
변화의 범위는 어떻게 되는지 (여기서는 1부터 100까지)를 지정한다
그러면 어떻게 되는지 결과물을 보자

`plot`의 왼쪽 위에 보이는 설정버튼? 을 눌러보면 그림과 같은 창이 뜬다.
`x`변수의 초기값을 지정해주지는 않았지만 일단은 `x = 1`로 잡혀 있다
마우스로 슬라이더를 이동시켜서 아래 그림처럼 움직이면 차트도 함께 변하는 모습을 볼 수 있다.

-------------------------------
`manipulate`의 **Help Pages** 를 들어가보면 알겠지만 함수는 정말 몇개 없다
또 만들 수 있는 것이라고는 `버튼`, `체크박스`, `picker(드롭다운)`, `슬라이더` 네 개 정도 뿐이다.
하지만 덕분에 복잡하게 머리를 굴릴 필요도 없고
기존에 그리던 함수에 바로 적용가능하다는 점이 최대의 강점인 것 같다.
그러면 우리가 만들어 볼 수 있는 것들을 이용해서 차트를 그려보자
-------------------------------
### Slider
```
manipulate(
plot(cars, xlim=c(0,x.max)),
x.max=slider(15,25, step = 5, initial = 20)
)
```

`steps`항목은 `slider`에서 선택가능한 항목간의 간격을 설정한다
`initial`은 `plot`이 그려질 때 변수의 초기값을 지정한다
### Picker
```
manipulate(
barplot(as.matrix(longley[,factor]),
beside = TRUE, main = factor),
factor = picker("GNP", "Unemployed", "Employed")
)
```

`picker` 함수 내부에 드랍다운으로 선택할 수 있는 항목들을 나열해주는 방식으로 사용한다
마찬가지로 `initial`옵션을 줄 수 있다.
위 `barplot`에서는 `picker`의 항목이 바뀌면 데이터와 `main(차트 제목)`이 변경된다
그리고 `manipulate()` 함수 내부에서 `barplot()`과 `factor = picker()`는 콤마(,)로 구분되어있다는 점에 주의!!

### Checkbox
```
manipulate(
boxplot(Freq ~ Class, data = Titanic, outline = outline),
outline = checkbox(FALSE, "Show outliers")
)
```

`checkbox` 항목은 어짜피 `TRUE/FALSE`이기 때문에 바로 `initial`항목을 정해주면 된다
위 차트에서는 `initial`값은 `FALSE`로 정하고 `label(체크박스 선택창에 표시될 내용)`을 `"show outliers"`로 지정했다

### Button
```
manipulate(
{
if(resetSeed)
set.seed(sample(1:1000))
hist(rnorm(n=100, mean=0, sd=3), breaks=bins)
},
bins = slider(1, 20, step=1, initial =5, label="Bins"),
resetSeed = button("Reset Seed")
)
```

`button`항목에는 들어가는 항목이 `label`밖에 없다
위 차트의 경우 `resetSeed = button("Reset Seed")`으로 버튼을 생성하면
버튼을 클릭할 때 `resetSeed = TRUE`가 되어서 seed가 랜덤한 값으로 변경 된다

일단 슬라이더도 제대로 반영이 되었다.

버튼을 클릭하면 seed가 변경되어서 히스토그램이 랜덤한 값으로 변경되는 것을 볼 수 있다
### Multiple Controls
```
manipulate(
plot(cars, xlim = c(0, x.max), type = type, ann = label),
x.max = slider(10, 25, step=5, initial = 25),
type = picker("Points" = "p", "Line" = "l", "Step" = "s"),
label = checkbox(TRUE, "Draw Labels"))
```

위에서 살펴본 다양한 함수들을 적용해 보았다
그러면 저런 기본 그래픽 함수들이 아니라 다른 패키지를 이용한 차트에도 적용할 수 있을까?
`ggplot2`패키지에 시도해보자
------------------------
### ggplot2에 적용해보기
```
# install.packages("ggplot2") # 설치가 안되어있다면 실행
library(ggplot2)
manipulate(
{plot_diamond <- ggplot(diamonds, aes_string(x= xvar, y= yvar))
plot_diamond + geom_point()},
xvar = picker("carat","cut", "color","clarity","depth","table","price","x","y","z", initial = "carat"),
yvar = picker("carat", "depth", "table", "price", "x", "y", "z", initial = "price")
)
```

기존에 `ggplot2`를 써본 사람이라면 주의해야 할 점은
원래 `aes()`함수는 문자열이 아니라 오브젝트 이름처럼 열을 대했기 때문에 `aes(x = carat, y = price)`와 같은 형태로 구성했다.
그런데 `picker`함수에서 내보내는 값은 `"caret", "price"` 처럼 `""`로 감싸진 문자열이기 때문에 그냥 넣으면 실행이 되지 않는다
따라서 기존의 `aes()` 함수가 아니라 에스테틱을 문자열로 받아올 수 있는 `aes_string()` 함수를 이용해 차트를 구성해야 한다
그것만 주의한다면 위에서 했던 방식대로 `manipulate`패키지를 적용해 볼 수 있다.