Week 2. Introduction to R (III)
시각화 (Vizualization): ggplot
ggplot2
에 내장되어 있는 mpg
라는 데이터를 이용해서 시각화에 대한 간단한 내용을 살펴보도록 하겠습니다.
library(ggplot2)
library(tidyverse)
mpg df2 <-
cty
와 hwy
는 각각 도시와 고속도로 주행에 있어서의 갤런 당 마일(mpg)을 기록한 변수입니다. displ
은 리터 당 엔진의 배기량을 의미합니다. drv
는 자동차의 변속기 종류를 보여줍니다: 전륜구동(front wheel, f), 후륜구동(rear wheel, r), 또는 사륜구동(four wheel, 4)로 나타냅니다. model
은 자동차 모델명을 말합니다. 총 38개의 모델명이 있으며, 1999년부터 2008년 사이 매년마다 새로 출시된 모델들입니다. class
는 차량 유형을 보여주는 분류형 변수입니다: 2인승, SUV, 콤팩트 등. library(ggplot2)
핵심적인 그래픽 요소들
모든 ggplot2
로 그린 플롯은 3개의 주요 요소를 가집니다.
- 먼저 너무나 당연하게도 플롯의 바탕이 되는 데이터입니다.
- 둘째로 변수와 그래픽 속성 간의 관계를 나타내 주는 미학적 지도(aesthetic mappings)입니다.
- 관측치를 보여줄 수 있는 최소한 하나 이상의 층위(레이어)가 필요합니다. 이러한 층위는
geom_*
이라는 함수로 나타낼 수 있습니다.
간단한 예제
ggplot(mpg, # 우리가 그리고 싶은 데이터를 주고
aes(x = displ, y = hwy)) + # 어떤 변수들을 시각화하고 싶은지 지정합니다
geom_point() # 점으로 기하학적 객체를 표현하라는 레이어를 덧붙입니다.
어떻게 데이터와 미학적 지도가 ggplot()
함수에 제공되는 지 눈치채셨나요? 그리고 앞의 함수를 살펴보면 추가적인 레이어가 +
로 더해진 것을 확인할 수 있습니다. 그리고 미학적 지도는 항상 aes()
의 함수 형태로 특정되는 것을 알 수 있습니다.
이 플롯에 변수를 몇 개 더 집어넣어보기 위해서는 colour
, shape
, 그리고 size
와 같은 함수들을 이용할 수 있습니다. ggplot2
의 몇몇 함수들은 영국식 스펠링을 가지고 있는데, 미국식 스펠링도 허용하니까 편하게 사용하면 됩니다. 추가적인 함수들도 x
와 y
라는 미학적 지도 함수를 사용했던 것과 동일하게 적용하면 됩니다. aes()
안에 집어넣으면 되는 것이죠.
ggplot(mpg, aes(displ, hwy, color = class, shape = drv, size = cyl)) +
geom_point()
좀 더 익숙해지면 굳이 aes()
안에 x
와 y
를 지정해주지 않아도 됩니다. 왜냐면 맨 처음에 입력한 두 값은 자동으로 x
와 y
에 배정되기 때문입니다. 즉, aes(x = displ, y = hwy)
나 aes(displ, hwy)
나 동일합니다.
또한, color
, shape
, 그리고 size
와 같은 추가적인 미학 함수들은 aes()
함수 내에서 특정되어야 합니다. 즉, x
나 y
처럼 그냥 적으면 R이 알아먹지를 못합니다.
ggplot(mpg, aes(displ, hwy, color = class)) +
geom_point()
만약 특정한 시각화를 위한 변수를 고정적인 값으로 설정하고 싶다면, 다음과 같이
aes()
를 따로 빼내어서 지정해주면 됩니다.
ggplot(mpg, aes(displ, hwy)) + geom_point(aes(colour = "blue"))
## 점의 색이 파랑색이 아니라 붉은 색이고 범례에 blue라고 쓰여진 것을 확인할 수 있습니다.
ggplot(mpg, aes(displ, hwy)) + geom_point(colour = "blue")
## 이렇게 하면 범례가 없이 원하던 파랑색을 얻을 수 있습니다.
ggplot(mpg, aes(displ, hwy)) + geom_point(aes(colour = "hello"))
마지막 플롯에서 붉은 색을 다시 한 번 얻게되는 이유는 그 색이 aes()
내부에 특정한 값을 지정하여 넣었을 때의 디폴트 색이기 때문입니다. 즉, 어떨 때 사용할 수 있냐면, 레이어를 겹겹히 쌓으면서 서로 다른 값을 보여주는 점들을 하나의 플롯에 다양하게 보여주고 싶을 때, var1
, var2
이런 식으로 geom_point(aes(color = "var1"))
이런 식으로 더하면 바로 범례에 추가하면서 서로 다른 색의 다른 변수를 보여주는 플롯을 그릴 수 있을 것입니다.
분류형 변수의 서로 다른 수준 간의 차이를 보여주는 데에는 직접 플롯에 color
나 size
를 조정하는 것 말고도 facets
을 이용하는 방법도 있습니다. facet_wrap()
이나 facet_grid()
를 사용할 수 있는데, facet_wrap()
이 조금 더 유용합니다.
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
facet_wrap(~ class)
ggplot
플롯에 더할 수 있는 다양한 유형의 geom_*
함수들로는, geom_point()
, geom_bar()
(또는 geom_col()
), geom_path()
(또는 geom_line()
), 부드러운 맞춤 선을 그려주는 geom_smooth()
, 그리고 geom_boxplot()
등이 있습니다.
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
geom_smooth() # 자동으로 국소가중선형회귀(Locally Weighted Scatterplot Smoother, LOWESS) 곡선을 추정해서 그려줍니다.
선형 모델을 그리는 데에도 사용할 수 있습니다.
ggplot(mpg, aes(displ, hwy)) +
lm_plot <- geom_point(color = "#bd574e") +
geom_smooth(method = 'lm', color = "#ffad87") +
theme_bw()
# 위의 컬러코드에 대해서는 다음을 참고하세요: colorhunt.co lm_plot
이게 익숙해지면 제곱항과 같이 자신의 함수를 다양하게 구성해서 ggplot
함수에 투입, 플롯으로 나타낼 수 있습니다.
## 함수를 직접 투입해보겠습니다.
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
geom_smooth(method = "lm", formula = y ~ I(x^2)) +
ggthemes::theme_gdocs() ## ggthemes 패키지는 다양한 테마를 제공합니다.
MASS
패키지 등을 이용하여 이탈치(outliers)의 영향을 받지 않는 로버스트 선형모델을 사용하여 플롯으로 보여줄 수 있습니다.
library(MASS)
ggplot(mpg, aes(displ, hwy)) +
rlm_plot <- geom_point() +
geom_smooth(method = "rlm") +
ggthemes::theme_pander()
rlm_plot
일반선형회귀모델의 결과와 로버스트 선형회귀모델의 결과를 나란히 보여주어 비교하기 편하게 할 수 있습니다. patchwork
패키지는 ggplot
의 플롯들을 하나로 결합시켜주는 유용한 패키지입니다.
# install.packages('devtools')
# devtools::install_github("thomasp85/patchwork")
library(patchwork)
+ rlm_plot + plot_layout(ncol = 1) lm_plot
지터(Jitter) 플롯과 박스플롯
다시 데이터로 돌아와서, 만약에 우리가 자동차 구동방식에 따른 연료의 가성비에 관심이 있다고 해보겠습니다. 산포도를 그려볼 수 있겠죠?
ggplot(mpg, aes(drv, hwy)) +
geom_point() + theme_bw()
뭐랄까, 그다지 정보를 파악하는 데 유용해보이지는 않습니다. 왜냐하면 저 점들이 하나의 관측치가 아니라 같은 값들을 가진 관측치들이 “겹쳐있기” 때문입니다. 관측치들의 집중도를 살펴보기 위해서는 투명도를 조정해주면 됩니다.
ggplot(mpg, aes(drv, hwy)) +
geom_point(alpha = .25) + theme_bw()
혹은 hex
를 이용해 농도로 관측치들의 집중도를 나타내줄 수 있습니다.
ggplot(mpg, aes(drv, hwy)) +
geom_hex() + theme_bw()
하지만 보다 일반적으로 사용되는 방법은 지터 플롯을 이용하는 것입니다. 지터 플롯은 무작위 노이즈를 값에 더해서 점들이 미묘하게 다른 값을 가지게 해 산포도를 알아보기 쉽게 “옆으로” 퍼트리는 것이라고 볼 수 있습니다.
ggplot(mpg, aes(drv, hwy)) +
geom_jitter() + theme_bw()
자동차 구동방식에 따라 나타내고자 하였기 때문에 알아보기 쉽게 색을 더해보도록 하겠습니다.
ggplot(mpg, aes(drv, hwy, color = drv)) +
geom_jitter() + theme_bw()
이와 유사한 정보를 주는 다른 종류의 플롯으로는 박스플롯과 바이올린 플롯이 있습니다. 참고로 박스플롯의 안에 그려진 선은 평균이 아니라 중앙값(median)입니다.
ggplot(mpg, aes(drv, hwy)) + geom_boxplot() + theme_bw()
box <- ggplot(mpg, aes(drv, hwy)) + geom_violin() + theme_bw()
violin <-+ violin + plot_layout(ncol = 2) box
히스토그램과 폴리곤 플롯도 어렵지 않게 ggplot
으로 그릴 수 있습니다. 박스플롯이 서로 다른 두 변수 간의 관계를 보여주는 데 유용하다면, 히스토그램과 빈도폴리곤은 하나의 연속형 변수의 분포를 보여줄 때 사용합니다.
ggplot(mpg, aes(hwy)) + geom_histogram() + theme_bw()
hist <- ggplot(mpg, aes(hwy)) + geom_freqpoly() + theme_bw()
poly <- ggplot(mpg, aes(hwy)) + geom_density() + theme_bw()
dens <-+ poly + dens + plot_layout(ncol = 1) hist
만약 원한다면 구간(binning)을 특정해줄 수도 있습니다.
ggplot(mpg, aes(hwy)) + geom_freqpoly(binwidth = 2.5) + theme_bw()
ggplot(mpg, aes(hwy)) + geom_freqpoly(binwidth = 1) + theme_bw()
연속형 변수를 대상으로 histogram
등을 사용한다면, 이번에는 이산형 변수의 분포를 알아볼 때 유용한 막대플롯을 살펴보겠겠습니다. 당연히 geom_bar()
함수를 사용합니다.
ggplot(mpg, aes(manufacturer)) +
geom_bar() +
scale_x_discrete(guide = guide_axis(n.dodge=3))+
theme_bw()
막대 플롯과 같은 경우, 우리가 가진 데이터를 요약해서 보여주지만, 요약된 자료 그 자체를 가지고 바로 막대플롯으로도 만들 수 있습니다. 예를 들어, 아래와 같은 데이터가 있다고 해보겠습니다.
data.frame(
drugs <-drug = c("a", "b", "c"),
effect = c(4.2, 9.7, 6.1)
)
만약 이 경우, 우리는 ggplot
에게 “이미 이 데이터는 요약된 정보를 가진 데이터야” 라는 것을 알려주기 위해 stat = "identity"
라는 특성을 제공합니다.
ggplot(drugs, aes(drug, effect)) +
geom_bar(stat = 'identity') + theme_bw()
막대 플롯을 그리는 데에는 geom_col()
도 이용할 수 있습니다/
ggplot(drugs, aes(drug, effect)) + geom_col() + theme_bw()
라인 플롯은 관측치—점들을 왼쪽에서 오른쪽으로 이어주는 플롯이고, 반대로 경로 플롯(path plot)은 데이터셋에 나타나는 순서대로 이어주는 플롯입니다. 즉, 라인 플롯은 x
의 값대로 정렬된 형태의 경로 플롯이라고 이해하실 수 있습니다.
tibble(
temp_data <-x = sample(1:100, 25, replace = F),
y = rnorm(25, 10, 2)
)
## 라인 플롯입니다.
%>%
temp_data ggplot(aes(x = x, y = y)) + geom_line() + theme_bw()
## 경로 플롯입니다.
%>%
temp_data ggplot(aes(x = x, y = y)) + geom_path() + theme_bw()
## x 값을 정렬한 경로 플롯입니다.
%>%
temp_data arrange(x) %>%
ggplot(aes(x = x, y = y)) + geom_path() + theme_bw()
축 수정(Modifying Axes)
축의 제목을 수정하기 위해서는 각각의 축에 대해 xlab()
, ylab()
을 사용하거나 혹은 labs()
를 이용해 한 번에 수정하는 방법이 있습니다.
ggplot(mpg, aes(cty, hwy)) +
geom_point(alpha = 1 / 3) +
xlab("city driving (mpg)") +
ylab("highway driving (mpg)") +
theme_bw()
# 축 제목을 모두 없애보겠습니다/
ggplot(mpg, aes(cty, hwy)) +
geom_point(alpha = 1 / 3) +
xlab(NULL) +
ylab(NULL) +
theme_bw()
# labs()를 이용해서 한 번에 간편하게 할 수도 있습니다.
ggplot(mpg, aes(cty, hwy)) +
geom_point(alpha = 1 / 3) +
labs(x = "city driving (mpg)", y = "highway driving (mpg)") +
theme_bw()
각 축의 값의 범주를 조정할 수도 있습니다. 이때 필요한 함수들은 xlim()
, ylim()
, 그리고 lims()
입니다.
ggplot(mpg, aes(drv, hwy)) +
geom_jitter(width = 0.25) + theme_bw()
## 구동 종류를 두 가지로 줄이고, hwy도 20부터 30으로 값을 줄이겠습니다.
ggplot(mpg, aes(drv, hwy)) +
geom_jitter(width = 0.25) +
lims(x = c("f", "r"), y = c(20, 30)) +
theme_bw()
## 연속형 변수일 경우, 한쪽만 제한(상한선, 하한선)하고 싶을 때는 NA를 이용합니다. 아래는 상한만 30으로 설정한 경우입니다.
ggplot(mpg, aes(drv, hwy)) +
geom_jitter(width = 0.25, na.rm = TRUE) +
ylim(NA, 30) + theme_bw()
## 만약 플롯의 특정한 부분만 자세히 살펴보려면 coord_cartisian()이라는 함수를 이용할 수 있습니다.
ggplot(mpg, aes(drv, hwy)) +
geom_jitter(width = 0.25) +
coord_cartesian(y = c(20, 30)) + theme_bw()
여기서 한 가지 팁은 directlabels
라는 패키지입니다. 이 패키지를 이용하면 범례를 이용하지 않고도 더 깔끔한 여러 가지 색상을 이용할 수 있습니다.
# install.packages('directlabels')
ggplot(mpg, aes(displ, hwy, colour = class)) +
geom_point() + theme_bw()
ggplot(mpg, aes(displ, hwy, colour = class)) +
geom_point(show.legend = FALSE) +
directlabels::geom_dl(aes(label = class), method = "smart.grid") +
theme_bw()
플롯에 우리가 필요로 하는 정보를 기록할 수 있습니다. annotation
이라고 하는데요.
`geom_text()는 텍스트를 직접 플롯에 덧붙이거나 혹은 특정 한 점 관측치에 레이블을 새길 때 주로 사용합니다. 이탈치나 어떤 중요한 의미를 가지는 관측치에 한에서 레이블을 달아주면 플롯에 이해가 쉬워집니다.
geom_rect()
은 플롯에서 관심있는 부분을 사각형의 형태로 하이라이트 해줄 수 있습니다.geom_rect()
는xmin
,xmax
,ymin
,ymax
와 같은 미학요소들을 이용해서 사각형을 그릴 수 있습니다.geom_line()
,geom_path()
, 그리고geom_segment()
는 선을 덧그리는 데 사용됩니다.- 이 세
geom
함수들은 모두 화살표 요소를 가지고 있어서 선 끝에 화살표를 달 수 있습니다.arrow()
함수가 바로 그것입니다.angle()
,length()
,end()
,type()
등으로 다양한 길이와 모양의 화살표를 그릴 수 있습니다.
- 이 세
geom_vline()
,geom_hline()
, 그리고geom_abline()
은 일종의 기준선을 그릴 수 있게 도와줍니다.
glimpse(economics)
## Rows: 574
## Columns: 6
## $ date <date> 1967-07-01, 1967-08-01, 1967-09-01, 1967-10-01, 1967-11-0...
## $ pce <dbl> 506.7, 509.8, 515.6, 512.2, 517.4, 525.1, 530.9, 533.6, 54...
## $ pop <dbl> 198712, 198911, 199113, 199311, 199498, 199657, 199808, 19...
## $ psavert <dbl> 12.6, 12.6, 11.9, 12.9, 12.8, 11.8, 11.7, 12.3, 11.7, 12.3...
## $ uempmed <dbl> 4.5, 4.7, 4.6, 4.9, 4.7, 4.8, 5.1, 4.5, 4.1, 4.6, 4.4, 4.4...
## $ unemploy <dbl> 2944, 2945, 2958, 3143, 3066, 3018, 2878, 3001, 2877, 2709...
## 시간의 흐름에 따른 미국의 실업자 수의 변화를 나타내보겠습니다.
ggplot(economics, aes(date, unemploy)) +
geom_line() + theme_bw()
## 미국 대통령의 재임기간입니다.
presidential %>%
presidential <- dplyr::filter(start > economics$date[1])
presidential
## 이 두 가지 자료를 합해보면 다음과 같습니다.
ggplot(economics) +
geom_rect(
aes(xmin = start, xmax = end, fill = party),
ymin = -Inf, ymax = Inf, alpha = 0.2,
data = presidential
+
) geom_vline(
aes(xintercept = as.numeric(start)),
data = presidential,
colour = "grey50", alpha = 0.5
+
) geom_text(
aes(x = start, y = 2500, label = name),
data = presidential,
size = 3, vjust = 0, hjust = 0, nudge_x = 50
+
) geom_line(aes(date, unemploy)) +
scale_fill_manual(values = c("blue", "red")) +
theme_bw() + theme(legend.position = "top")
우리는 geom
을 이용해서 데이터 하나를 가지고 여러 가지 층위를 덧씌워 다양한 정보를 가진 플롯으로 재생산할 수 있습니다.
이제까지는 개별 geom
을 하나씩 적용해서 살펴보았습니다만, 이 geom
들을 하나의 ggplot
내에서 동시에 집합적으로 사용할 수 있습니다.
data(Oxboys, package = 'nlme')
as_tibble(Oxboys)
df <- df
ggplot(Oxboys, aes(age, height)) +
geom_point() +
geom_line() + theme_bw()
ggplot(Oxboys, aes(age, height, group = Subject)) +
geom_point() +
geom_line() + theme_bw()
척도, 범례
척도는 축과 범례를 만드는 도구로, 데이터를 어떠한 단위로 표현할 것인가에 사용됩니다.
ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(colour = class)) + theme_bw()
ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(colour = class)) +
scale_x_continuous(breaks = c(seq(0, 7, 0.5))) +
scale_y_continuous() +
scale_color_discrete() + theme_bw()
scale
함수를 통해서 원하는 축 제목을 바로 넣을 수도 있습니다.
ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(colour = class)) +
scale_x_continuous("A really awesome x axis ") +
scale_y_continuous("An amazingly great y axis ") + theme_bw()
geom
과는 다르게 scale
에서 +
를 사용하게 되면 이전에 사용한 scale
을 덮어쓰게 됩니다.
ggplot(mpg, aes(displ, hwy)) +
geom_point() +
scale_x_continuous("Label 1") +
scale_x_continuous("Label 2") + theme_bw()
## 서로 다른 스케일을 동시에 사용할 수도 있습니다.
ggplot(mpg, aes(displ, hwy)) +
geom_point(aes(colour = class)) +
scale_x_sqrt() +
scale_colour_brewer() + theme_bw()
scale
은 _
를 이용해서 세부 함수들이 구성되어 있습니다. 크게 세 부분으로 나뉘는데, 1. scale
2. scale
을 적용할 미학 요소의 이름 (예, colour
, shape
또는 x
) 3. scale
의 이름 (예, continuous
, discrete
, brewer
).
data.frame(x = 1:2, y = 1, z = "a")
df <- ggplot(df, aes(x, y)) + geom_point()
p <-+ scale_x_continuous("X axis") p
+ scale_x_continuous(quote(a + mathematical ^ expression)) p
한편, ggplot
에서는 직접적으로 범례를 건드리지는 않습니다. 대신에 데이터를 수정해서 애초에 범례가 원하는 대로 깔끔하게 나오도록 하는 것이 일반적입니다.
우리는 scales
패키지를 이용해서 축에 레이블을 다양한 척도로 매길 수 있습니다.
scales::comma_format()
큰 숫자에 자동으로 콤마를 넣어줍니다.scales::unit_format(unit, scale)
은 원래의scale
에 단위를 넣어줍니다/scales::dollar_format(prefix, suffix)
은 현재의 값을 소수점 둘째 자리로 반올림해서 달러로 표현해줍니다.scales::wrap format()
은 길이가 긴 레이블을 몇 개의 줄로 줄바꿈해줍니다.- axes + scale_y_continuous(labels = scales::percent_format())
- axes + scale_y_continuous(labels = scales::dollar_format(prefix = “$”))
테마
마지막으로 테마 함수는 데이터가 아닌 플롯의 요소들을 관리하는 데 사용됩니다. 플롯의 배경색, 범례 위치, 제목 크기, 글꼴 등을 변경하는 데 사용됩니다.
ggplot(mpg, aes(cty, hwy, color = factor(cyl))) + geom_jitter() +
geom_abline(colour = "grey50", size = 2) +
labs(
x = "City mileage/gallon",
y = "Highway mileage/gallon",
colour = "Cylinders",
title = "Highway and city mileage are highly correlated"
+
) scale_colour_brewer(type = "seq", palette = "Spectral") +
theme_bw() +
theme(
plot.title = element_text(face = "bold", size = 12),
legend.background =
element_rect(fill = "white", size = 4, colour = "white"),
legend.justification = c(0, 1),
legend.position = c(0, 1),
axis.ticks = element_line(colour = "grey70", size = 0.2),
panel.grid.major = element_line(colour = "grey70", size = 0.2),
panel.grid.minor = element_blank()
)
기존에 이미
ggplot
이 제공하는 테마로는 theme_bw()
, theme_linedraw()
, theme_light()
, theme_dark()
, theme_minimal()
, theme_classic()
, 그리고 theme_void()
등이 있습니다. 이외에도 ggthemes
와 같은 패키지를 통해 추가로 다른 theme
을 찾아볼 수 있습니다.
마지막으로 theme
의 개별 요소들을 수정하기 위해서는 다음과 같은 코드를 사용합니다: plot + theme(element.name = element function())
Rstudio add-in을 이용한 ggplot
코드 작성
이 섹션은 Bryan Jenks 유튜브 및 Leesak lee의 슬기로운 통계생활 유튜브를 참조하였습니다.
esquisse
패키지의 설치
# install.packages("esquisse")
library(esquisse)
패키지를 설치하고 난 이후에, Rstudio 상단에 위치한 Addins라는 버튼을 눌러줍니다.
그리고 Add-in 중에 esquisse에 해당하는 탭에 들어가 ggplot2 builder
를 눌러줍니다.
그러면 아래와 같은 팝업창을 확인할 수 있습니다.
하지만 현재는 제 environment
에 로드된 데이터가 없기 때문에 No data selected라고 알려주는 것을 확인할 수 있습니다. 실습을 위해 ggplot2
패키지에 내장된 iris
데이터를 불러오도록 하겠습니다.
## 예제 데이터를 위한 ggplot2 로드
library(ggplot2)
iris # 붓꽃 데이터
mydata <-head(mydata)
unique(mydata$Species)
## [1] setosa versicolor virginica
## Levels: setosa versicolor virginica
dim(mydata)
## [1] 150 5
일반적인 ggplot
의 이용
%>% ggplot(aes(x = Sepal.Length,
mydata y = Sepal.Width)) +
geom_point() + theme_bw()
Add-in의 esquisse
의 이용
예제 데이터를 Environment
에 불러들인 상태에서 다시 Add-in
의 esquisse
를 들어갑니다. 그러면 아래와 같은 팝업 창을 확인할 수 있습니다.
이제 mydata
를 불러올 수 있는 것을 확인할 수 있습니다. mydata
를 선택하시면 mydata
에 속한 변수들을 확인할 수 있습니다.
사용할 변수를 특정하셔도 되고, 아니면 전부 불러들어온 다음에 필요한 변수를 이용하여 플롯팅하셔도 상관없습니다.
결과적으로 이렇게 생성한 플롯에 대해서 미리 레이아웃을 통해 체크할 수도 있고, 우측 하단에 코드도 제시해주기 때문에 어떤 코드가 어떤 결과를 만들어낸다는 것에 익숙해지기 좋습니다.