-
Notifications
You must be signed in to change notification settings - Fork 0
/
theme_gt.qmd
679 lines (541 loc) · 25.5 KB
/
theme_gt.qmd
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
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
---
editor_options:
chunk_output_type: console
editor:
markdown:
wrap: 72
---
```{r}
#| include: false
source("_common.R")
```
# 표 테마
이전 장에서 우리는 적절한 글꼴, 색상, 테마를 사용한 그래프가 데이터 시각화에서 얼마나 중요한지 살펴봤다. 이번 장에서는 문서를 구성하는 또 다른 중요한 요소인 '표(table)',
특히 'gt' (grammar of tables) 테마를 중심으로 살펴볼 것이다.
표는 복잡한 데이터를 정리하고 분석하는 데 없어서는 안 될 도구다.
'gt'는 표 구성과 디자인에 대한 체계적인 접근 방법을 제공함으로써
표를 통해 효과적으로 정보를 전달할 수 있을 뿐만 아니라
시각적으로 미려한 표를 만들 수 있다는 점에서 매우 유용하다.
\index{표}\index{gt 패키지}\index{표 테마} \index{표 문법}
문서에 표를 넣으면 정보를 효과적으로 요약하고 가독성을 크게 높일 수 있다.
표를 만들 때 사용할 수 있는 도구로는 마크다운(Markdown), `gt` 패키지,
{{< latex >}}이 있는데, 각각 독특한 장점이 있다.
마크다운은 사용하기 쉽고 복잡한 설치나 추가 패키지 없이 기본적인 표를 신속하게 만들 수 있다.
반면 {{< latex >}}은 논문이나 학술 자료에 적합하도록 고급 품질의 표를 만들 수 있는 전문적인 도구다. 그래프 문법이 정립된 이후 가장 최근에 소개된 `gt`는
마크다운의 간편함과 {{< latex >}}과 같은 전문적인 표를 만들 수 있는 기능을 모두 갖추고 있다.
![표제작 세가지 방식](images/table_three.jpg){#fig-three-tables}
웹과 PDF 출력, 테마 지정 등에서 `gt` 패키지가 뛰어나고 `gt` 패키지는
그래프 문법에 기초하여 고급 표제작도 수월하게 작성가능하고, 특히,
데이터 중심 표를 작성할 때 필요한 다양한 기능을 제공하기 때문에 탄탄한
표 문법에 기반한 `gt` 패키지가 여러가지 장점이 많다.
## `gt` 표 작성하기
`gt` 패키지는 R Tidyverse 생태계에 속한 표 제작 목적으로 특별히 제작된
패키지로 그래프 문법에 기반한 `ggplot2` 패키지에 친숙하신 저자는 쉽게
표도 `gt` 패키지를 사용해서 다양한 표 제작이 가능하다. 다음 예시에서는
`palmerpenguins` 데이터 패키지 `penguins` 데이터셋을 활용하여 "남극 펭귄
서식섬과 종 빈도표"를 제작한다.
1. 라이브러리 가져오기: `tidyverse`, `palmerpenguins`, `gt`,
`gtExtras`, `magick`.
2. `penguins` 데이터를 사용하여 종(species)과 서식섬(island)에 따른
빈도를 집계하고 표제작에 맞춰 피벗 테이블을 생성한다.
3. `gt()` 함수를 이용하여 `gt` 표를 초기화하고, `rowname_col` 인자로
"species"를 지정하여 행 이름을 설정한다.
4. `tab_header()` 함수로 표 제목과 부제목을 지정한다.
5. `grand_summary_rows()` 함수를 사용하여 각 서식섬(Biscoe, Dream,
Torgersen) 합계를 계산한다.
6. `cols_align("center")`을 통해 텍스트를 가운데 정렬한다.
7. `opt_row_striping()` 함수로 행에 스트라이핑을 추가하여 가독성을
높인다.
8. `tab_source_note()` 함수로 표 출처를 표기한다.
`penguins_gt` 변수에 저장된 `gt` 표를 저장한다. `gt` 패키지의 다양한
기능을 활용하여 복잡한 표도 손쉽게 작성할 수 있다는 것을 다시 확인할 수
있다.
```{r}
#| label: tbl-penguin-table
#| tbl-cap: "`gt` 패키지 활용 표 제작 사례"
library(tidyverse)
library(palmerpenguins)
library(gt)
library(gtExtras)
penguins_gt <- penguins |>
count(species, island) |>
pivot_wider(names_from = island, values_from = n, values_fill = 0) |>
as_tibble() |>
gt(rowname_col = "species") |>
tab_header(
title = md("남극 펭귄 **서식섬과 종** 빈도표"),
subtitle = md("`palmerpenguins` 데이터 패키지")
) |>
grand_summary_rows(
columns = c(Biscoe, Dream, Torgersen),
fns = list(
'합계' = ~sum(.)
),
fmt = ~ fmt_number(., use_seps = FALSE, decimals = 0),
missing_text = '-'
) |>
cols_align("center") |>
opt_row_striping() |>
tab_source_note(
source_note = md("자료출처: `penguins` 데이터셋")
)
penguins_gt
```
### 기본 색상과 스타일
웹 프로그램을 제작할 때 HTML로 콘텐츠를 제작하고 CSS/SCSS 파일로
스타일을 적용하는 것처럼 유지보수성이 뛰어나고 가독성이 좋은 표를
제작하기 위해 저자가 익혀야 되는 필수적인 기본기 중 하나다.
`penguins_gt` 표는 핵심 정보가 잘 요약되어 있지만, 색상이나 다른 외양
관련 설정은 기본설정값만 따르고 있다.
`gt` 패키지 `opt_stylize()` 함수는 표 스타일링에 다양한 선택지를
제공한다. 미리 정의된 배경색, 선 색상, 선 스타일 등을 다르게 적용할 수
있어 스타일은 총 36개에 이른다. 표 테두리, 표 요약 부분과 스텁(stub)에
더 어두운 색상을 적용, 수직선 반영여부가 포함된다.
R 코드 `opt_colors` 벡터에 총 6가지 색상(파란색, 청록색, 분홍색, 녹색,
붉은색, 회색) 중 5개 색상을 지정하고, `draw_color_gt` 함수를 이용하여 이
색상들을 `penguins_gt` 표에 `opt_stylize` 함수를 호출하여 표 색상을
적용한다.
```{r}
#| eval: false
opt_colors <- c("blue", "cyan", "green", "red", "gray")
draw_color_gt <- function(gt_color = "blue") {
penguins_gt |>
opt_stylize(style = 1, color = gt_color)
}
gt_colors_list <- map(opt_colors, draw_color_gt)
for(i in 1:length(opt_colors)) {
gtsave(gt_colors_list[[i]], str_glue("images/gt_theme_{opt_colors[i]}.png"))
}
```
```{r}
#| echo: false
#| label: fig-table-colors
#| fig-cap: "색상별 `gt` 표"
#| out-width: "100%"
library(magick)
opt_colors <- c("blue", "cyan", "green", "red", "gray")
color_path_filenames <- vector(mode = "character", length = length(opt_colors))
for(i in 1:length(opt_colors)) {
color_path_filenames[i] <- str_glue("images/gt_theme_{opt_colors[i]}.png")
}
gt_color_images_list <- map(color_path_filenames, magick::image_read) |>
map(image_resize, geometry = "300x300")
gt_color_images <- image_join(gt_color_images_list)
image_append(gt_color_images, stack = FALSE)
```
### 스타일
`gt` 패키지는 `opt_stylize()` 함수를 통해서 색상뿐만 아니라 스타일도
달리해서 표를 제작할 수 있다. `gt` 패키지 1 \~ 6까지 번호 총6가지 스타일
선택이 가능하고, 기본값은 1 로 설정되어 있고, 저자가 복잡한 설정 없이
번호를 지정함으로써 표 디자인을 빠르게 변경할 수 있다. 번호로 스타일을
선택하게 되면, 데이터 분석과정에서 다양한 표 스타일을 빠르게 시험하고
가장 적절한 표를 신속히 제작하는데 도움이 된다.
```{r}
#| eval: false
opt_styles <- 1:5
draw_style_gt <- function(opt_sytle, gt_color = "blue") {
penguins_gt |>
opt_stylize(style = opt_sytle, color = gt_color)
}
gt_styles_list <- map(opt_sytles, draw_style_gt)
for(i in 1:length(opt_styles)) {
gtsave(gt_styles_list[[i]], str_glue("images/gt_theme_style_{opt_styles[i]}.png"))
}
```
```{r}
#| label: fig-table-styles
#| fig-cap: "스타일별 `gt` 표"
#| echo: false
#| out-width: "100%"
opt_sytles <- 1:5
style_path_filenames <- vector(mode = "character", length = length(opt_sytles))
for(i in 1:length(opt_sytles)) {
style_path_filenames[i] <- str_glue("images/gt_theme_style_{opt_sytles[i]}.png")
}
gt_style_images_list <- map(style_path_filenames, magick::image_read) |>
map(image_resize, geometry = "300x300")
gt_style_images <- image_join(gt_style_images_list)
image_append(gt_style_images, stack = FALSE)
```
## `gtExtra`
`gtExtras` 패키지는 `gt` 패키지를 보완하여 더 미려한 표를 생성할 수
있도록 도와주는 목적으로 개발되었다. `gt` 패키지에서 구현되지 않은
기능을 추가하거나, 반복되는 코드를 줄이기 위한 래퍼(wrapper) 함수로
작성되었다. `gt` 패키지를 확장한 다양한 기능이 있지만 테마와 관련된
사항을 집중적으로 살펴보자.
\index{gtExtras}
`ggplot2` 패키지를 활용하여 그래프 문법에 맞춰 그래프를 제작한 경험이
있다면, 자주 `theme_*()` 함수를 사용했을 것이다. 마찬가지로 `ggplot2`
그래프 테마 `theme_minimal()`, `theme_grey()`에 대응되는 테마가
`gtExtras` 패키지에 `gt_theme_538()`, `gt_theme_espn()`,
`gt_theme_nytimes()`, `gt_theme_guardian()`, `gt_theme_dot_matrix()`,
`gt_theme_dark()`, `gt_theme_excel()`, `gt_theme_pff()` 포함되어 있다.
주목할 점은 언론사와 소프트웨어에서 사용되는 스타일이 대거 포함되어 있다는
점이다.
`gt_theme_espn()` 함수는 `gt` 패키지로 생성된 표에 ESPN 테마를 적용한다.
이 함수는 `gt` 테이블 객체(`gt_tbl` 클래스)를 인자로 받으며, 선택적으로
`gt::table_options()`에 전달할 추가 인자를 받을 수 있다. 반환 값은
`gt_tbl` 클래스의 객체이다. 다음은 다른 테마 함수들에 대한 간략한 설명이다:
| 테마명 | 테마 설명 |
|-----------------------------------------|-------------------------------|
| `gt_theme_538()` | FiveThirtyEight 스타일 테마 적용 |
| `gt_theme_espn()` | ESPN 스타일 테마 적용 |
| `gt_theme_nytimes()` | New York Times 스타일 테마 적용 |
| `gt_theme_guardian()` | 가디언진(The Guardian) 스타일 테마 적용 |
| `gt_theme_dot_matrix()` | 도트 매트릭스 스타일 테마 적용 |
| `gt_theme_dark()` | 어두운 배경 테마 적용 |
| `gt_theme_excel()` | 마이크로소프트 엑셀 스타일 테마 적용 |
| `gt_theme_pff()` | PFF(Pro Football Focus, 스포츠 분석회사) 스타일 테마 적용 |
언론사와 미국 풋볼 리그 스포츠 분석에 특화된 PFF 스타일을 표에
적용해보자.
```{r}
#| eval: false
gtExtra_themes <- c(gt_theme_538, gt_theme_espn, gt_theme_nytimes, gt_theme_guardian, gt_theme_pff)
gtExtra_themes_names <- c("gt_theme_538", "gt_theme_espn", "gt_theme_nytimes",
"gt_theme_guardian","gt_theme_pff")
draw_gtExtras_theme <- function(gt_theme, gtExtra_themes_names) {
penguins_gt |>
gt_theme() |>
tab_header(
title = md("남극 펭귄 **서식섬과 종** 빈도표"),
subtitle = gtExtra_themes_names)
}
# draw_gtExtras_theme(gtExtra_themes[5][[1]])
## gtExtras 테마적용 표 -------------------
gtExtra_styles_list <- vector(mode ="list", length = length(gtExtra_themes))
for(i in 1:length(gtExtra_themes)) {
gtExtra_styles_list[[i]] <- draw_gtExtras_theme(gtExtra_themes[i][[1]], gtExtra_themes_names[i])
}
## 테마 표 png 파일 저장 -------------------
gtExtras_path_filenames <- vector(mode = "character", length = length(gtExtra_themes))
for(i in 1:length(gtExtra_themes)) {
gtExtras_path_filenames[i] <- str_glue("images/gtExtras_theme_{gtExtra_themes_names[i]}.png")
}
for(i in 1:length(gtExtra_themes)) {
gtsave(gtExtra_styles_list[[i]],
str_glue("images/gtExtras_theme_{gtExtra_themes_names[i]}.png"))
}
```
```{r}
#| label: fig-table-gtExtras
#| fig-cap: "`gtExtras` 테마 적용 표"
#| echo: false
#| out-width: "100%"
gtExtra_themes_names <- c("gt_theme_538", "gt_theme_espn", "gt_theme_nytimes",
"gt_theme_guardian", "gt_theme_pff")
gtExtras_path_filenames <- vector(mode = "character", length = length(gtExtra_themes_names))
for(i in 1:length(gtExtra_themes_names)) {
gtExtras_path_filenames[i] <- str_glue("images/gtExtras_theme_{gtExtra_themes_names[i]}.png")
}
gtExtra_style_images_list <- map(gtExtras_path_filenames, magick::image_read) |>
map(image_resize, geometry = "300x300")
gtExtra_style_images <- image_join(gtExtra_style_images_list)
image_append(gtExtra_style_images, stack = FALSE)
```
## 사용자 정의 테마
사용자 정의 테마의 필요성은 다양하며 주로 보고서나 PPT 발표에서 중요한 역할을 한다. 동일한 스타일과 구성을 가진 표를 사용하면 데이터를 쉽고 빠르게 이해할 수 있고, 일관된 스타일은 전문성을 강조하고, 독자에게 깊은 인상을 남길 수 있다.
\index{테마!사용자 정의}
`gtExtras`와 같은 패키지에서 제공되는 테마는 코드 한 줄로 빠르고 깔끔한 표를 만들 수 있어 시간을 절약할 수 있다는 큰 장점이 있지만, 특정 요구사항이나 브랜딩 지침을 완전히 맞춤화하기 쉽지 않고, 복잡한 데이터 구조나 특별한 시각화 요구사항을 충족시키는 데에도 한계가 있다.
사용자 정의 테마를 개발함으로써 `gtExtras`에서 제공하는 테마처럼 표 제작을 빠르고 편하게 지원할 수 있으면서도, 저자가 필요로 하는 브랜드나 스타일을 반영할 수 있다. 이렇게 하면 표가 더 전문적이면서도 개성있게 작성할 수 있다.
### `gtExtras` 확장
`penguins_gt`라는 기존 `gt` 표 객체에 `gt_theme_538()` 테마를 선택하고
글꼴, 색상, 정렬 등 세부적인 작업을 진행하고 그 결과를 `.png` 파일로 저장한다.
`gt` 패키지는 `tidyverse` 생태계 일원으로 파이프 연산자를 통해 세부적인 기능을
긴밀히 조합하여 단순한 코드로 제작되지만 최종 결과물로 상당히 높은 난이도를 갖는
표를 제작할 수 있다.
1. **gt_theme_538()**: FiveThirtyEight 스타일 테마 적용
2. **tab_options()**: 테이블의 글꼴, 제목 크기, 배경색 등 다양한 표 선택옵션 설정
3. **cols_align()**: 숫자형 열은 가운데 정렬하고, 문자형 열은 자동 정렬
4. **tab_style()**: "MaruBuri" 글꼴과 굵은 글씨체를 제목, 본문, 열에 적용
5. **gtsave()**: 최종적으로 작업한 표를 PNG 이미지로 저장
```{r}
#| eval: true
#| label: tbl-theme-custom-penguins
#| tbl-cap: "`gt` 사용자 정의 테마 적용 표"
penguins_theme_gt <- penguins_gt |>
gt_theme_538() |>
tab_options(
table.font.names ="NanumSquare",
heading.title.font.size = px(26),
heading.subtitle.font.size = px(16),
heading.background.color = "transparent",
column_labels.font.weight = 'bold',
table_body.hlines.width = px(0),
data_row.padding = px(6),
heading.align = 'center',
stub.background.color = "#ffffff",
stub.font.weight = "bold",
source_notes.font.size = px(10),
row.striping.include_table_body = TRUE
) |>
cols_align( align = "center", columns = where(is.numeric)) |>
cols_align( align = "auto", columns = where(is.character)) |>
## 글꼴 달리 적용
tab_style(
style = cell_text(
font = "MaruBuri",
weight = 'bold'
),
locations = cells_title(groups = 'subtitle')
) |>
tab_style(
style = cell_text(
font = "MaruBuri",
weight = 'bold'
),
locations = cells_body()
) |>
tab_style(
style = cell_text(
font = "MaruBuri",
weight = 'bold'
),
locations = cells_column_labels()
) |>
tab_style(
style = cell_text(
font = "MaruBuri",
),
locations = cells_source_notes()
)
# penguins_theme_gt |>
# gtsave(filename = "images/penguins_theme_gt.png")
```
<!-- ![`gt` 사용자 정의 테마 적용 표](images/penguins_theme_gt.png){#fig-gt-my-theme fig-align="center" width="446"} -->
### `gt_theme_hangul()` 테마
`gt_theme_538()` 함수처럼 사용자 정의 함수를
`gt_theme_hangul()` 테마명을 지정해 두면 모든 표에
통일성을 유지한 테마를 간편하게 적용시킬 수 있다.
\index{테마!한글 테마}
`gt_tbl` 데이터프레임을 입력받아 `gt_theme_538()`을 기본표 테마로 지정하고,
`tab_options()` 함수를 통해 글꼴, 제목 크기, 배경색 등을 설정하고, 나눔스퀘어(NanumSquare), 마루부리(MaruBuri) 글꼴을 사용하여 한글 표에 더 적합한 스타일을 적용하고,
`cols_align()`과 `tab_style()` 함수를 사용해서 숫자형 열(칼럼)은 가운데 정렬시키고, 문자형 열은 자동 정렬토록 하고, 특정 셀에 굵은 글씨체와 각기 다른 글꼴을 적용하여 좀더 독특하고 전문적인 느낌을 심는다. `tab_style()` 기능을 이용해 표 홀수 번째 행에만 회색 배경('grey90')을 적용하여 가독성을 높게 한다. 마지막으로 사용자 정의 테마 함수도 예를 들어 기억하기 좋게 `gt_theme_hangul()`으로 작명하여 문서에서 표가 필요한 부분에 별도 검색작업 없이 적용시킬 수 있도록 한다.
```{r}
#| label: fig-gt-theme-hangul
#| fig-cap: "사용자 정의 `gt` 테마 적용 사례"
gt_theme_hangul <- function(gt_tbl) {
# Grab number of rows of data from gt object
n_rows <- nrow(gt_tbl$`_data`)
gt_tbl |>
gt_theme_538() |>
tab_options(
table.font.names ="NanumSquare",
heading.title.font.size = px(26),
heading.subtitle.font.size = px(16),
heading.background.color = "transparent",
column_labels.font.weight = 'bold',
table_body.hlines.width = px(0),
data_row.padding = px(6),
heading.align = 'center',
stub.background.color = "#ffffff",
stub.font.weight = "bold",
source_notes.font.size = px(10),
row.striping.include_table_body = FALSE
) |>
cols_align( align = "center", columns = where(is.numeric)) |>
cols_align( align = "auto", columns = where(is.character)) |>
## 글꼴 달리 적용
tab_style(
style = cell_text(
font = "MaruBuri",
weight = 'bold'
),
locations = cells_title(groups = 'subtitle')
) |>
tab_style(
style = cell_text(
font = "MaruBuri",
weight = 'bold'
),
locations = cells_body()
) |>
tab_style(
style = cell_text(
font = "MaruBuri",
weight = 'bold'
),
locations = cells_column_labels()
) |>
tab_style(
style = cell_text(
font = "MaruBuri",
),
locations = cells_source_notes()
) |>
tab_style(
style = cell_fill(color = 'grey90'),
locations = cells_body(rows = seq(1, n_rows, 2))
)
}
penguins_gt |>
gt_theme_hangul()
```
## `.Rprofile` 설정작업
`.Rprofile` 파일에 테마 함수를 반영시키면 R 세션을 시작할 때마다 테마가 자동으로 로드되어 일일이 코드를 실행할 필요가 없어 작업 효율성을 크게 높여줌은 물론, 프로젝트 간 일관된 스타일과 브랜딩을 유지할 수 있다. 코드 작성 측면에서 테마 함수를 `.Rprofile`에 추가하여 코드 재사용성을 높이고, 테마 관련 설정을 한 곳에서 관리할 수 있게 함으로써 작업 일관성과 전문성이 높아져 시간과 노력을 크게 절약할 수 있다.
\index{.Rprofile}
```{mermaid}
%%| eval: true
%%| echo: false
%%| label: fig-gt-theme-auto
%%| fig-cap: "`gt` 표 테마 적용 작업흐름"
%%| fig-align: center
%%| fig-width: 5
graph LR;
A["테마 스크립트 <br>생성"] --> B["테마 함수<br> 작성"];
B --> C[".Rprofile <br> 파일 반영"];
C --> D["테마 자동 <br> 로딩"];
D --> E["프로젝트 <br> 테마 적용"];
```
<!-- ![`gt` 표 테마 적용 작업흐름](images/gt_theme_hangul_workflow.png) -->
작성한 테마를 매번 코드를 "복사하여 붙여넣기" 하여 사용하는 대신
`.Rprofile` 파일에 반영하여 매번 `gt` 표를 제작할 때마다
`gt_theme_hangul()` 테마를 적용하는 방법은 다음과 같다.
먼저, `usethis` 패키지 `edit_r_profile()` 함수를 호출하여 앞서
작성한 테마를 반영한다.
```{r}
#| eval: false
usethis::edit_r_profile()
```
`gt_theme_hangul()` 테마를 `gt` 표 객체에 반영한다.
스크립트에서부터 시작하여 작성한 함수를 `.Rprofile` 파일에 복사하여 붙여넣는 것으로
작업은 완료된다.
```{r}
#| eval: false
library(gt)
library(gtExtras)
gt_theme_hangul <- function(gt_tbl) {
# Grab number of rows of data from gt object
n_rows <- nrow(gt_tbl$`_data`)
gt_tbl |>
gt_theme_538() |>
tab_options(
# column_labels.background.color = '#1E61B0', # R logo 파란색
table.font.names ="NanumSquare",
heading.title.font.size = px(26),
heading.subtitle.font.size = px(16),
heading.background.color = "transparent",
column_labels.font.weight = 'bold',
table_body.hlines.width = px(0),
data_row.padding = px(6),
heading.align = 'center',
stub.background.color = "#ffffff",
stub.font.weight = "bold",
source_notes.font.size = px(10),
row.striping.include_table_body = FALSE
) |>
cols_align( align = "center", columns = where(is.numeric)) |>
cols_align( align = "auto", columns = where(is.character)) |>
## 글꼴 달리 적용
tab_style(
style = cell_text(
font = "MaruBuri",
weight = 'bold'
),
locations = cells_title(groups = 'subtitle')
) |>
tab_style(
style = cell_text(
font = "MaruBuri",
weight = 'bold'
),
locations = cells_body()
) |>
tab_style(
style = cell_text(
font = "MaruBuri",
weight = 'bold'
),
locations = cells_column_labels()
) |>
tab_style(
style = cell_text(
font = "MaruBuri",
),
locations = cells_source_notes()
) |>
tab_style(
style = cell_fill(color = 'grey90'),
locations = cells_body(rows = seq(1, n_rows, 2))
)
}
```
`.Rprofile` 파일에 `gt` 사용자 정의 테마가 지정되어 있기 때문에 새로 R
세션을 시작하면 `gt_theme_hangul()` 테마를 프로젝트 어디에서든지 사용할 수 있다.
```{r}
#| eval: false
original_penguins_gt <- penguins |>
drop_na() |>
count(species, sex) |>
pivot_wider(names_from = sex, values_from = n, values_fill = 0) |>
janitor::adorn_totals(where = "col", name = "합계") |>
rename(펭귄종 = species, 암컷 = female, 수컷 = male) |>
as_tibble() |>
gt(rowname_col = "펭귄종") |>
tab_header(
title = md("남극 펭귄 **암수와 종** 빈도표"),
subtitle = md("`palmerpenguins` 데이터 패키지")
) |>
grand_summary_rows(
columns = c(펭귄종, 암컷, 수컷),
fns = list(
'합계' = ~sum(.)
),
fmt = ~ fmt_number(., use_seps = FALSE, decimals = 0),
missing_text = '-'
) |>
cols_align("center") |>
opt_row_striping() |>
tab_source_note(
source_note = md("자료출처: `penguins` 데이터셋")
)
original_penguins_gt |>
gtsave("images/rprofile_original.png")
theme_penguins_gt <- original_penguins_gt |>
gt_theme_hangul()
theme_penguins_gt |>
gtsave("images/rprofile_hangul_theme.png")
```
:::{layout="[49.5, -1, 49.5]"}
![`gt_theme_hangul()` 테마 적용
전](images/rprofile_original.png){#fig-before-theme}
![`gt_theme_hangul()` 테마 적용
후](images/rprofile_hangul_theme.png){#fig-after-theme}
:::
## 연습문제 {.unnumbered}
### 객관식 {.unnumbered}
1. `gt` 패키지는 어떤 프로그래밍 언어의 생태계에 속해 있나요?
a) Python
b) R
c) JavaScript
d) C++
::: {.content-visible when-format="revealjs"}
정답: b) R
설명: `gt` 패키지는 R Tidyverse 생태계의 일부로, R 언어를 사용하는 데이터 과학자들을 위한 표 제작 도구입니다.
:::
2. `gtExtras` 패키지의 주요 기능은 무엇인가요?
a) 데이터 처리 속도 향상
b) 표 시각화 향상
c) 통계 분석 기능 추가
d) 자동 코드 생성
::: {.content-visible when-format="revealjs"}
정답: b) 표 시각화 향상
설명: `gtExtras` 패키지는 `gt` 패키지의 기능을 확장하고 보완하여 보다 세련되고 미려한 표 시각화를 가능하게 합니다.
:::
3. 사용자 정의 테마를 개발하는 이유는 무엇인가요?
a) 속도 최적화
b) 보안 강화
c) 개성과 전문성 반영
d) 호환성 향상
::: {.content-visible when-format="revealjs"}
정답: c) 개성과 전문성 반영
설명: 사용자 정의 테마 개발은 특정 요구사항이나 브랜딩 지침을 맞춤화하고, 복잡한 데이터 구조나 시각화 요구사항을 충족시키며, 개성과 전문성을 표에 반영하기 위해 중요합니다.
:::
### 서술형 {.unnumbered}
1. `gt` 패키지를 사용하여 표를 제작할 때 고려해야 할 디자인 요소들은 무엇인가요?
::: {.content-visible when-format="revealjs"}
정답 및 설명: `gt` 패키지를 사용할 때 고려해야 할 디자인 요소로는 표의 색상, 글꼴, 정렬, 스타일, 테마 등이 있습니다. 이러한 요소들은 데이터의 시각적 표현을 개선하고, 독자의 이해를 돕는데 중요한 역할을 합니다.
:::
2. `gtExtras` 패키지를 사용하여 표에 적용할 수 있는 다양한 테마의 예시를 들어보세요.
::: {.content-visible when-format="revealjs"}
정답 및 설명: `gtExtras` 패키지는 다양한 테마를 제공합니다. 예를 들어, `gt_theme_538`, `gt_theme_espn`, `gt_theme_nytimes`, `gt_theme_guardian`, `gt_theme_pff` 등이 있으며, 이들은 각기 다른 스타일과 색상 팔레트를 표에 적용하여 다양한 시각적 효과를 제공합니다.
:::