-
Notifications
You must be signed in to change notification settings - Fork 0
/
04-visualizations-ggplot2.qmd
371 lines (265 loc) · 24.1 KB
/
04-visualizations-ggplot2.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
# ויז'ואליזציות {#sec-ggplot2}
ויז'ואליזציות הן כלי קריטי בהבנה ובתקשור של נתונים (וחוץ מזה, הן כיפיות 😊). בפרק זה נלמד איך להפיק ויז'ואליזציות באמצעות חבילת `ggplot2`.
חבילת `ggplot2` מבוססת על תיאוריה שנקראת דקדוק של גרפיקה [@wickham2010]. עקרונות התיאוריה מניחים את קווי היסוד הבאים לבניה של כל גרף. בקווים כלליים:
1. כל משתנה ממופה למאפיין מסוים על הגרף ("אסטטיקה"), לדוגמה, משתנה יכול להיות ממופה לציר X לציר Y, והוא יכול להיות ממופה לצבע, גודל, שקיפות, צורה, ועוד.
2. לאחר המיפוי מתווספות שכבות שנקראות גיאומטריות. ישנן גיאומטריות רבות והן קובעות כיצד יראה הגרף, לדוגמה נקודות (דיאגרמת פיזור), קווים, עמודות (bars), אריחים (tiles), קופסאות התפלגות (boxplots), ועוד.
3. לבסוף מולבשים על הגרף עוד "קישוטים" כמו כותרות, מקרא, צירים, וכל מה שנדרש בשביל לשדרג לו את הניראות ואת הנהירות.
בחבילת `ggplot2` יש עשרות רבות של גיאומטריות, והיא מאפשרת גמישות מירבית לייצר כמעט כל גרף שתצטרכו.
נדגים זאת כעת בסט הנתונים של הפינגויינים, תוך שאנחנו משתמשים בויז'ואליזציות על מנת להבין מה הקשר בין אורך לרוחב המקור.
## הבסיס
נתחיל בגרף פשוט, ונתקדם ממנו לסדרה של גרפים. ראשית נטען את החבילות הנדרשות לנו לפרק, ונגדיר את התמה -- עיצוב הגרפים -- שבו נשתמש (הסבר נוסף על תמות בהמשך פרק זה).
```{r penguins package load}
#| warning: false
#| message: false
library(palmerpenguins)
library(tidyverse)
ggplot2::theme_set(ggplot2::theme_bw())
```
```{r penguins vis 1}
penguins %>%
ggplot(aes(x = bill_length_mm,
y = bill_depth_mm)) +
geom_point()
```
ראשית מבחינת הנתונים המוצגים, לא ניתן להבחין בקשר משמעותי. במידה מסוימת נראה שעליה במשתנה bill_length_mm מעידה על ירידה במשתנה bill_depth_mm (כי ככל שמתקדמים בציר ה-x יש ירידה קלה של התצפיות בציר ה-y). זוהי מסקנה שגויה, ותיכף נבין למה, אבל לפני כן, עוד מספר הסברים:
הודעת האזהרה שמופיעה מעל הגרף מיידעת אותנו שיש שתי שורות שאינן באות לידי ביטוי בתרשים בשל ערכים חסרים (חסר נתון על אורך או עומק או שניהם).
בנוגע לתחביר:
- הפונקציה `ggplot` מגדירה תרשים.
- הארגומנט הראשון שלה הוא הדאטה עצמו (`penguins`), שנכנס באמצעות האופרטור `%>%`.
- הארגומנט השני נכנס כפונקציה `aes()` שמגדירה אסטטיקות. במקרה זה מוגדרים שני מיפויי אסטטיקות, לציר x ולציר y.
- לאחר מכן יש חיבור `+` על מנת להוסיף שכבה של גיאומטריה מסוג נקודה `geom_point`, וקיבלנו גרף.
## מיפויים נוספים
כעת ניזכר שבדאטה מיוצגים שלושה זנים של פינגויינים, וייתכן שהקשר גם מושפע מעובדה זו. נוסיף מיפוי של זן הפינגויין לצבע של הנקודות. הוספה זו תתבצע עם הארגומנט `color=species`:
```{r penguins vis 2}
base_penguins_chart <- penguins %>%
ggplot(aes(x = bill_length_mm,
y = bill_depth_mm,
color = species)) +
geom_point()
```
כעת לאחר הוספת הצבע ניתן להבחין בבירור בכך שבכל אחד מהזנים **עליה** במשתנה `bill_length_mm` מביאה לעלייה במשתנה `bill_depth_mm` (וזה בעצם הפוך למה שחשבנו כשהסתכלנו על התרשים מבלי לחלק לזנים של הפינגויינים השונים). זו תובנה מאוד משמעותית, שנקראת בשפה המקצועית "אינטראקציה". יש אינטראקציה בין אורך המקור לבין זן הפינגויין בהשפעתם על עומק המקור. ניגע באינטראקציות גם בהמשך (בפרק על רגרסיה לינארית).
נוסיף לגרף גם שלושה קווי רגרסיה לינארית, עבור כל אחת מהקבוצות:
```{r pengions vis 3 with linear regression lines}
base_penguins_chart +
stat_smooth(method = "lm", se = FALSE)
```
::: callout-note
**כדאי להכיר - "פרדוס סימפסון":** התופעה שבה הבחנו בשינוי המשמעות של הקשר בין המשתנים כאשר מוסיפים אינטראקציה או זיהוי של הקבוצה, תוארה על ידי סימפסון [@simpson1951]. אחד מהגילגולים המודרנים של הפרדוקס הזה נמצא בדאטהסט שנוצר על ידי סימולציה ונקרא Datasaurus dozen [ראו @murray2021].
ב-Datasaurus משתמשים בסימולציה כדי לייצר שנים עשר קבוצות שבפני עצמן נראות זהות בפרמטרים מסוימים (ממוצע בציר x, ממוצע בציר y, סטיית תקן, קורלציה, וכו'), אבל כשמציגים את הנקודות בדיאגרמת פיזור, באופן מובחן בין הקבוצות, מקבלים את התרשים הבא:
```{r datasaurus dozen example}
library(datasauRus)
datasaurus_dozen %>%
group_by(dataset) %>%
summarize(mean(x),
mean(y),
sd(x),
sd(y),
cor(x, y))
datasaurus_dozen %>%
ggplot(aes(x = x, y = y)) +
geom_point() +
facet_wrap(~dataset)
```
בתרשים זה השתמשנו גם בפונקציות שראינו קודם, וגם בפונקציה נוספת שנקראת `facet_wrap` שמפרקת את התרשים לתתי-תרשימים, בכל אחד נמצאים הנתונים של קבוצה אחרת (מהמשתנה `dataset`).
:::
## כותרות גרף וצירים
כעת נייפה את הגרף עם כותרות:
```{r penguins vis 3}
pebguin_chart_w_lm <- base_penguins_chart +
stat_smooth(method = "lm", se = FALSE) +
xlab("Bill length [mm]") +
ylab("Bill depth [mm]") +
ggtitle("Relationship of bill length and depth in penguins",
subtitle = "Interaction with species (with linear regression)")
pebguin_chart_w_lm
```
## הגדרת תמות
ניתן להגדיר תמות (Themes) שיתנו לגרף חזות אחרת. בחבילת `ggplot2` יש כמה תמות מוגדרות מראש שניתן להתחיל מהם וגם לעצב אותן מחדש. כדוגמה, נשתמש בתמה מסוג `linedraw` ונגדיר מחדש את מיקום המקרא ואת גודל הטקסט של הכותרות.
```{r examples of themes}
pebguin_chart_w_lm +
theme_linedraw() +
theme(legend.position = "top",
plot.title = element_text(size = 22),
axis.title = element_text(size = 15),
legend.box.background = element_rect(linetype = 1, linewidth = 1))
```
::: callout-note
רוב הרכיבים בתוך התרשים נשלטים בתוך הפונקציה`theme` באמצעות פונקציות הכוונה כגון `element_text` (מאפייני טקסט), `element_rect` (מאפייני תחום מרובע), `element_line` (מאפייני קווים), וכו'. בתיעוד הפקודה `theme` ניתן לעיין באפשרויות השונות.
:::
::: callout-tip
השתמשו בפקודה `facet_wrap` כשכבה נוספת לתרשים הקודם על מנת לפצל את הזנים השונים לתתי-תרשימים. הדגמה לשימוש בפקודה נמצאת בחלק הקודם של פרק זה (בקוד שמסביר על פרדוקס סימפסון).
:::
## גיאומטריות נוספות
נדגים מספר גיאומטריות נוספות מההיצע הרב שיש בחבילת `ggplot2`. שימו לב, בסוף הפרק מדריך שיסייע לכם להחליט באיזה תרשים כדאי להשתמש לפי סוג המשתנים או היחס בין משתנים שאתם רוצים להדגים.
### Boxplot
דיאגרמה מסוג Boxplot עוזרת לנו להבין את צורת ההתפלגות. הדיאגרמה מציגה "קופסה" שתוחמת 50% מהנתונים (החלק התחתון של הקופסה הוא רבעון ראשון, והחלק העליון של הקופסה הוא רבעון שלישי). במרכזה של הקופסה מוצג החציון קקו עבה (מחלק את התצפיות לחצי-חצי). ערכי קיצון, אם ישנם, מופיעים כנקודות. במידה ומופיעה קופסה שאינה סימטרית סביב החציון, הדבר מעיד על כך שההתפלגות אינה התפלגות נורמלית.
נציג את התפלגות המשקל של הפינגויינים בתרשים, בהפרדה לפי זן הפינגויינים, ומיד לאחריו נציג את החציון, ורבעונים של כל קבוצה.
```{r boxplot example}
penguins %>%
ggplot(aes(y = body_mass_g, x = species)) +
geom_boxplot() +
ggtitle("Penguin weight") +
xlab("Species") +
ylab("Mass [grams]")
penguins %>%
filter(!is.na(body_mass_g)) %>%
group_by(species) %>%
summarize(median_mass = median(body_mass_g),
q1_mass = quantile(body_mass_g, 0.25),
q3_mass = quantile(body_mass_g, 0.75))
```
**איך מזהים ערכי קיצון?**
ערכי קיצון היא בעיה בפני עצמה ואפשר להקדיש לה פרק, ואפילו ספר שלם. יש לערכי קיצון השלכות משמעותיות במגוון שימושים, החל ממודלים (כמו רגרסיה שנלמד עליה בספר זה) וחישובים שונים (ממוצע לדוגמה מושפע מאוד מערכי קיצון), דרך זיהוי אנומליות.
ערכי הקיצון מחושבים כ-1.5\*טווח בין רבעוני מהרבעון הראשון מטה או מהרבעון השלישי מעלה, כלומר נקודות אשר מרוחקות לפחות פי 1.5 הטווח הבין רבעוני (הטווח "הסביר") ביחס לרבעונים.
אם נמחיש זאת על קבוצת הפינגויינים מסוג Chinstrap. הרבעון הראשון מתקבל ב-3488 גרם, והרבעון השלישי מתקבל ב-3950 גרם. הטווח הבין רבעון לכן הינו 462. כלומר הטווח הבין רבעוני כפול 1.5 הינו 693.
כלומר, כל נקודה שנמצאת מחוץ לתחום של \[3950+693, 3488-693\] תיחשב כערך חריג ותסומן כנקודה.
```{r extreme values}
extreme_hinges <- c(3488-693, 3950+693)
extreme_hinges
penguins %>%
filter(species == "Chinstrap") %>%
filter(body_mass_g < extreme_hinges[1] | body_mass_g > extreme_hinges[2])
```
### צפיפות
תרשים נוסף שיכול לסייע בהבנת צורת ההתפלגות הינו תרשים שמציג את הצפיפות (תזכורת: פונקצית צפיפות הינה הפונקציה שהשטח שמתחת לה מהווה את פונקצית ההתפלגות. לגובה של פונקצית צפיפות אין משמעות בערך בפני עצמו, אלא רק בכך שסך האינטגרל מתחת לפונקצית הצפיפות שווה 1). הצפיפות יכולה להראות לנו האם ההתפלגות סימטרית, האם היא בעלת מודל אחד (פיק יחיד כמו בהתפלגות נורמלית) או בי-מודלית (שני פיקים, כמו בהרכבה של שתי התפלגויות נורמליות), וכן היא יכולה לסייע לנו להבין האם יש התפלגות אחרת שמתאימה לתיאור הנתונים. הפקודה שמייצרת גרף צפיפות היא `geom_density`.
```{r density}
penguins %>%
ggplot(aes(x = body_mass_g, color = species)) +
geom_density() +
ggtitle("Penguin weight: density functions") +
xlab("Body mass [grams]") +
ylab("Density")
```
כמה הבדלים בולטים מהתרשים:
1. ניתן לראות שהשונות (הפיזור) במשקל הגוף גדול יותר בסוג Gentoo, וגם ב-Adelie קצת יותר מב-Chinstrap.
2. ניתן לראות שב-Gentoo יש התפלגות בי-מודלית (שתי גבעות).
3. ניתן לראות ששני הזנים Adelie ו-Chinstrap בעלי התפלגות סביב אותו משקל גוף.
::: callout-tip
נסו לשער מה מקור ההתפלגות הבי-מודלית בפינגויינים מזן Gentoo. בדקו את השערתכם עם תרשימים מתאימים.
רמז - נסו לבחון האם פיצול ה-Gentoo לפי משתנה נוסף מייצג שני גרפים בעלי דמיון רב יותר להתפלגות נורמלית (סימטרית ובעלת פיק יחיד).
:::
### היסטוגרמה
היסטוגרמה הוא גרף נוסף שנועד להציג התפלגות של משתנים רציפים, על ידי שבירה של הערכים הרציפים לערכים בדידים (קבוצות טווחים), בשונה מהגרפים הקודמים.
בנייה של היסטגרמה תתבצע באמצעות הפונקציה `geom_histogram`.
```{r histogram example}
penguins %>%
ggplot(aes(x = body_mass_g, fill = species)) +
geom_histogram() +
ggtitle("Penguin weight: histogram") +
xlab("Body mass [grams]") +
ylab("Counts [# observations]")
```
ניתן לשלוט במספר העמודות (ה-bins) על ידי הגדרה של הארגומנט `bins=` בתוך הפונקציה `geom_histogram`. הערך ברירת המחדל הינו 30 בינים.
### בארים
בארים הם גרף עמודות. יש שתי גיאומטריות שמסייעות לנו בגרף עמודות: `geom_bar` ו-`geom_col`. ההבדל המרכזי ביניהן הוא ש-`geom_bar` מקבלת דאטה גולמי וסופרת, בעוד ש-`geom_col` מקבלת מוצר סופי. נמחיש זאת בדוגמה שמתארת את מספר התצפיות מכל סוג:
```{r geom bars and cols}
penguins %>%
ggplot(aes(species)) +
geom_bar() +
ggtitle("Number of penguins of eash species (geom_bar)")
penguins %>%
count(species) %>%
ggplot(aes(x = species, y = n)) +
geom_col() +
ggtitle("Number of penguins of eash species (geom_col)")
```
שתי הפקודות עם אותו הפלט בדיוק. אני באופן אישי מעדיף את השימוש ב-`geom_col` משום שיותר קל לעשות לה debug (בכך שנראה מה הדאטה שנכנס פנימה).
גרף בארים יכול להציג גם יותר ממשתנה אחד, לדוגמה אפשר להשתמש בו על מנת להציג את ההתפלגות של משתנה מסוים כפונקציה של משתנים אחר (קשר בין שני משתנים בדידים). נדגים זאת בתרשים הבא שיציג את התפלגות הדגימות של זנים שונים כפונקציה של מגדר.
```{r bar plot species vs gender}
penguins %>%
filter(!is.na(sex)) %>%
count(species, sex) %>%
ggplot(aes(x = sex, fill = species, y = n)) +
geom_col(position = position_fill()) +
ggtitle("Distribution of species for each gender") +
scale_y_continuous(labels = scales::percent) +
ylab("Proportion [%]") +
xlab("Sex")
```
ניתן לראות מהתרשים שהתפלגות הדגימה של הזנים דומה בין שני המגדרים תמהיל של כ-20% מסוג Chinstrap, 36% מסוג Gentoo, והיתר ממין Adelie.
הפונקציה `position_fill` מגדירה שיש לערום את הבארים אחד על השני כך שיסתכמו ל-100%, ישנן שתי אפשרויות נוספות: `position_dodge`, ו-`position_stack`.
::: callout-tip
נסו להחליף את הפונקציה `position_fill` בפונקציות האחרות (`position_dodge`, `position_stack`). באילו מקרים תשמשו בכל אחת מהפונקציות הללו?
:::
::: callout-tip
צרו תרשים הפוך שבו מוצגת התפלגות המין של הפנגויינים לפי הזן (להפוך את התפקידים של ציר ה-x והמילוי של העמודות).
:::
## בחירת התרשים
על מנת לייצר תרשים טוב, עליכם לענות על השאלות הבאות:
1. כמה משתנים אנחנו רוצים לתאר בתרשים (האם אנחנו רוצים לתאר התפלגות של משתנה אחד, קשר בין שני משתנים, או אולי קשר בין שלושה משתנים)?
2. מהם סוגי המשתנים שאנחנו מתארים (בדידים או רציפים)?
3. אילו גיאומטריות יכולות לשמש אותנו לתיאור זה, ואיזה משתנה ימופה לאן (לאיזו אסטטיקה)?
החלקים 1-2 נובעים מהבנה טובה של הדאטה, והצורך המחקרי/העסקי שלכם. בשביל חלק 3 תוכלו להיעזר ב-Cheatsheet שהכינו בחברת Posit (לשעבר RStudio). הוא מאפשר להבין לכל סיטואציה איזה סוג תרשים ידרש: [קישור ל-Cheatsheet](https://posit.co/wp-content/uploads/2022/10/data-visualization-1.pdf).
עברנו את התהליך הזה בדוגמאות שכבר ראינו בפרק זה, מבלי לציין זאת:
- ב-Boxplot תיארנו קשר בין שני משתנים: המסה של הפינגויין (משתנה רציף) כתלות בזן של הפינגויין (משתנה בדיד), ולשם כך השתמשנו ב-`geom_boxplot`.
- גם בצפיפות וגם בהיסטוגרמה תיארנו קשר זה של משתנה רציף למשתנה בדיד (רק צורת הצגה שונה- `geom_density` או `geom_histogram` בהתאמה).
כל אחת מהדוגמאות הנ"ל יכלו לשמש אותנו גם על מנת לתאר התפלגות של משתנה רציף יחיד, וגם על מנת לתאר קשר בין משתנה בדיד לבין משתנה רציף.
- בתרשימי הבארים השתמשנו על מנת לתאר התפלגות של משתנה בדיד יחיד (כגון זני הפינגויינים במדגם), או קשר בין התפלגויות של שני משתנים בדידים (מין הפינגויין למול זן הפינגויין).
::: callout-note
### דוגמה למתקדמים
נדגים דוגמה נוספת, הפעם כזו שמתארת קשר בין ארבעה משתנים. הקשר בין אורך המקור, עומק המקור, ומשקל של הפינגויין. מכיוון שלמדנו שישנו הבדל בין זנים שונים, אז גם נבצע אבחנה בין הזנים.
- יש לנו שלושה משתנים רציפים (אורך, עומק, ומשקל)
- יש לנו משתנה בדיד (זן)
- מהסתכלות ב-[Cheatsheet](https://posit.co/wp-content/uploads/2022/10/data-visualization-1.pdf) (פינה ימנית תחתונה בעמוד הראשון) נראה שישנן מספר גיאומטריות מתאימות `geom_contour`, `geom_countour_filled`, `geom_raster`, `geom_tile`.
המשתנה התלוי שלנו הוא המשקל, ואנחנו רוצים לחקור איך הוא מושפע ממימדי המקור. לכן נמפה את אורך ועומק המקור לצירים x ו-y, ואת המשקל לצבע. באמצעות `facet_wrap` נייצר שלושה תתי-תרשימים (אחר לכל זן פינגויין).
```{r three dimension ggplot first approach}
#| warning: false
#| message: false
penguins %>%
ggplot(aes(x = bill_length_mm, y = bill_depth_mm, fill = body_mass_g)) +
geom_raster() +
facet_wrap(~species) +
ggtitle("Bad example for geom_raster (due to low density)")
```
כפי שניתן לראות יש לנו בעיית רזולוציה, מכיוון שיש יחסית מעט תצפיות, כל פינגויין מסומן כמלבן עם המשקל שלו מסומן כצבע. התרשים לא מאוד אינפורמטיבי, ולא כל כך תורם להבנה. יש לגיאומטריה של `geom_raster` ארגומנט שנקרא `interpolate`, שאמור לעשות אינטרפולציה בין נקודות, אבל גם אם נפעיל אותו נקבל גרף מטושטש ולא ברור (הנקודות רחוקות מדי אחת מהשניה).
במקרה זה, אפשר לבנות לנו "אינטרפולציה משלנו". נתאים מודל (נשתמש במודל רגרסיה לינארית פשוטה), של אורך מקור, עומק מקור, וזן הפינגויין.
```{r three dimension ggplot grid creation for a model}
#| warning: false
#| message: false
penguins_model <- lm(body_mass_g ~ bill_length_mm + bill_depth_mm + species,
data = penguins)
penguin_ranges <- penguins %>%
group_by(species) %>%
summarize(across(c(bill_length_mm, bill_depth_mm),
list(min = ~min(., na.rm = T),
max = ~max(., na.rm = T))))
```
הטבלה הבאה מציגה את טווחי אורך המקור, עומק המקור, ומשקל, עבור כל אחד מזני הפינגויינים.
::: {style="zoom:80%; direction:ltr;"}
```{r a scaled down gt}
gt::gt(penguin_ranges)
```
:::
נשתמש בנתוני הטבלה כדי לבנות טבלה חדשה שבה נמצאים כל הערכים האפשריים, וחיזוי שלהם על בסיס מודל הרגרסיה הלוגיסטית שבנינו.
```{r three dimension ggplot with a model}
step <- 0.5
penguin_grid <-
expand_grid(length = seq(32.1, 46, step),
depth = seq(15.5, 21.5, step),
species = "Adelie") %>%
bind_rows(
expand_grid(length = seq(40.9, 58, step),
depth = seq(16.4, 20.8, step),
species = "Chinstrap"),
expand_grid(length = seq(40.9, 59.6, step),
depth = seq(13.1, 17.3, step),
species = "Gentoo")
) %>%
rename(bill_length_mm = length,
bill_depth_mm = depth)
penguin_grid$body_mass_g <- predict(penguins_model, newdata = penguin_grid)
penguin_grid %>%
ggplot(aes(x = bill_length_mm, y = bill_depth_mm, fill = body_mass_g)) +
geom_raster(interpolate = TRUE) +
scale_fill_viridis_c() +
facet_wrap(~species) +
ggtitle("Bill length, depth, and mass for various species", subtitle = "Based on a linear regression model")
```
כעת ניתן להצמיד פרשנות למודל על ידי עיון בגרף. נראה שסוג הפינגויין משפיע ביותר על המשקל: ל-Gentoo המשקל הגבוה ביותר, המתקבל כאשר האורך והעומק של המקור עולים (בפינה הימנית העליונה של התרשים הימני). פרטים של פינגויינים מזן ה-Chinstrap יכולים להיות בעלי מימדי מקור דומים, אך עדיין לא מגיעים לאותו המשקל כפי שנצפה ב-Gentoo.
בכל המקרים עלייה במימדי המקור (עומק ואורך) מצביעה על עלייה במשקל (בגלל זה לפינה העליונה הימנית בכל אחד מתתי התרשימים נצבעת בצבע יותר בהיר).
:::
## סיכום
בפרק זה למדנו להפיק תרשימים באמצעות חבילת `ggplot2`. דנו בייחודיות של החבילה בהיבט התיאוריה שמבססת אותה (the grammar of graphics), והבנו כיצד יש לתכנן תרשים (באמצעות מיפויים, גיאומטריות, והגדרות נוספות).
ראינו דוגמאות לגיאומטריות מסוימות כגון boxplot, היסטוגרמה, צפיפויות, וגרף בארים.
לבסוף ראינו כיצד ניתן לתכנן תרשים באמצעות בחינה של סוגי המשתנים והקשרים שאנחנו רוצים לזהות, וראינו דוגמה לתרשים אשר קושר בין ארבעה משתנים שונים, ומבוסס על מודל של רגרסיה לינארית.
::: end-page