ggplot2 багц нь мөн tidyverse багцын нэг
хэсэг байдаг. Үүнийг өгөгдлийг графикаар дүрслэхэд хамгийн түгээмэл
ашигладаг.
Уг багцын талаар илүү их мэдээлэл авахыг хүсвэл дараах холбоосоор орж үзээрэй. https://ggplot2.tidyverse.org/reference/index.html Дараах холбоос мөн ижил мэдээлэл авахад хэрэглээрэй. http://www.cookbook-r.com/Graphs/
Эхлээд tidyverse ба өгөгдлийг уншуулах ёстой.
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.0 ✔ readr 2.1.4
✔ forcats 1.0.0 ✔ stringr 1.5.0
✔ ggplot2 3.4.1 ✔ tibble 3.2.0
✔ lubridate 1.9.2 ✔ tidyr 1.3.0
✔ purrr 1.0.1
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
load("uliral.rda")
Хэрэв өмнөх дасгалууд шууд энэ дасгал руу шилжиж байгаа бол
environment гэсэн самбар дээр ашиглаж байсан өгөгдлүүд
харагдаж байх болно.
Хамгийн түрүүнд нэг хэмжээст дүрслэлээс эхлэн статистик графикүүдтэй танилцах болно. Дараах жишээ авч үзье:
ggplot(uliral, aes(x=Gender)) + geom_bar()
ggplot(uliral, aes(x=Age)) + geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Командын хамгийн эхний аргумент бол өгөгдөл буюу датаг дуудна. Энэ
аргумент заавал өгөгдлийн бааз буюу дата бейс байхыг анхаарна уу.
uliral гэсэн нэртэй өгөгдлийг баазыг (вектор болон матриц
биш) ашиглана. Дараагийн хэсэг нь aes() (бүтнээрээ бол
aesthetic) байх ба дүрслэлд ямар хувьсагчийг ашиглахыг энэ
хэсгээр тодорхойлдог. Өөрөөр хэлбэл x тэнхлэг (хөндлөн) ба
y тэнхлэг ашигласан хавтгай дээр статистик дүрслэлийг байгуулах
ёстой. Үүн дээр нэмээд дүрслэлийн өнгө будаг, шугамын өргөн нарийн ба
хэлбэр хэмжээг гэх мэт бусад зүйлсийг тохируулж өгөх ёстой болдог. Эхний
удаад зөвхөн ганцхан x хөндлөн тэнхлэг дээрх дүрслэлийг зурж
үзье.
Дээрх командын 2-дугаар чухал хэсэг бол ямар төрлийн график ашиглах ёстойг зааж өгдөг geometry тохиргоог зааж өгнө. Жишээлбэл ачаалсан өгөгдлийн баазын хувьсагчдаар гистограм байгуулах эсвэл цэгэн болон шугаман графикуудыг байгуулах ёстой гэдгийг зааж өгдөг чухал хэсэг байдаг. Жишээ болгож баганан диаграм Bar chart байгуулж үзье.
Дараах жишээг дагаж, 3дах элементийг нэмж өгсөн. Энэ нь х тэнхлэг нь тайлбарыг оруулж өгөх команд болдог:
ggplot(uliral, aes(x=City)) + geom_bar() + xlab("Аймагууд") + ylab("Давтамж")
Дээрх графикийн х
тэнхлэгийн эмнэлгийн нэрүүд өөр хоорондоо давхцсан харагдаж байна. Уг
асуудлыг графикийн тэнхлэгийг дараах командаар эргүүлж шийдэж болно.
ggplot(uliral, aes(x=City)) + geom_bar() + xlab("Hospital City") + coord_flip()
Эсвэл арай өөр арга бол:
ggplot(uliral, aes(x=City)) +
geom_bar() +
xlab("Hospital City") +
theme(axis.text.x = element_text(angle=30, hjust=1))
theme
гэх команд нь дүрслэлийн харагдах хэклбэрийг өөрчлөхөд ашигладаг. Уг
командын талаарх илүү мэдээлэл help буюу програмын тусламжаас харахыг
хүсвэл ?theme консол дээр бичсээр хялбархан харж болно.
Харин тасралтгүй тоон хувьсагчдын түгээмэл ашигладаг дүрслэл бол гистограм байдаг:
ggplot(uliral, aes(x=Age)) + geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Нэг баганын өргөн
эсвэл тоо хэмжээг өөрөө тохируулж болно:
ggplot(uliral, aes(x=Age)) + geom_histogram(bins=10)
Мөн ижил хувьсагч дээр өөр төрлийн геометрийг ашиглаж болно. Тархалтын нягтын дүрслэл:
ggplot(uliral, aes(x=Age)) + geom_density()
Education хувьсагчийг графикаар дүрсэл.
TreatDaysхувьсагчийг графикаар дүрсэл.
ggplot(uliral, aes(x=Education)) + geom_bar()
ggplot(uliral, aes(x=TreatDays)) + geom_histogram()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Үүнээс өмнө өгөгдлийн баазаас Ulaanbaatar-г сонгьё. Энэ нь өгөгдлийн хэмжээг багасгаж илүү хурдтай тооцоолол хийх, хэт олон цэг харагдахаас зайлсхийх боломжийг олгох юм.
uliral %>% filter(City == "Ulaanbaatar") -> uliral
Дүрслэлийн төрлийг сонгоход тухайн дүрслэлд ашиглагдах хувьсагчийн төрөл хамгийн чухал үүрэгтэй. 2 тоон хувьсагчдын хамтад нь дүрслэхэд цэгэн буюу scatter диаграм ихэнхдээ ашигладаг.
ggplot(uliral,aes(x=TreatDays, y=Cost)) + geom_point()
Энэ цэгэн диаграм дээр эмнэлгийн зардал өндөр байгаа хүмүүс нилээд хазайлттай гажуудсан дүрслэл гарсан байна. Үүнийг илүүтэй тодруулж харах хэрэгтэй.
Зарим маш бага утгаадад нөгөө хувьсагчийн их утга харгалзаж байна. Энэ тохиолдолд хувьсагчийг хувиргаж жишээлбэл логарифм хувиргалт хэрэглэвэл илүүтэй засагдах магадлалтай байдаг.
ggplot(uliral,aes(TreatDays, Cost)) + geom_point() + scale_y_log10()
Олон өвчтөнгүүдийг мэдээлэл нь 0 утгатай байна. Иймд логарифм хувиргалтын болгоомжтой хэрэглэх ёстой. log(0) = - Хязгааргүй утганд хүрдэг. Энэ дүрслэлд анхааруулга мессеж өгөхөд хүргэдэг.
Мөн графикт жигдрүүлэх муруй нэмж өгвөл:
ggplot(uliral,aes(TreatDays, Cost)) +
geom_point() +
scale_y_log10() +
stat_smooth()
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
Энэхүү муруйг зурахдаа робаст (robust) дотоод дундаж тооцох аргыг ашигладаг. Саарал өнгөөр будагдсан хэсэг нь 95%-ийн итгэх интервалыг заадаг. Энэхүү зураг нь зардал ба эмнэлэгт хэвтсэн хоногийн тоо хувьсагчдын хамаарлыг харуулсан.
Өөр нэг жишээ болох 2 тоон хувьсагчдыг авч үзье:
p = ggplot(uliral,aes(Age, TreatDays))
p + geom_point()
Дүрслэлийг
p гэсэн обьектэд хадгалаад цэгүүдээр зураглалыг байгуулав.
Энэхүү цэгэн диаграм нь харах байдал нилээд төвөгтэй байгаа тул ялган
ойлгоход хүндрэлтэй байна. Иймд шйидэх нэг арга нь jitter
бөгөөд бага зэргийн санамсаргүй цочрол=бужигнаан /perturbations/ байдлыг
бий болгодог.
p + geom_jitter(width=0.2,alpha=0.25,size=0.5)
width=0.2 нь цэгүүд нь зөвхөн хэвтээ чиглэлд 0.2 зайд
санамсаргүй цочролыг үүсгэдэг. Мөн alpha transparency
аргументыг нэмж өгсөн. Энэ нь зарим цэгүүдийг хэсэгчлэн тодруулж өгдөг
бөгөөд ялгахад илүүтэй хялбар болдог. Мөн size=0.5 нь
цэгийн хэмжээг багасгаж өгсөн.
Дүрслэлийг p обьектод хадгалсанаар өвөрмөц сайжруулалт
хийхэд дахин дахин скрипт кодыг бичих шаардлагагүй болж байна.
Age ба Cost гэсэн хувьсагчдыг графикаар
дүрсэл. Дүрслэлийг хэрхэн сайжруулах ойлгомжтой болгох тал дээр
анхаараарай. Хоёр хувьсагчдын хамаарал юу байв?
ggplot(uliral,aes(Age, Cost)) + geom_point()
ggplot(uliral,aes(Age, Cost)) +
geom_point() +
scale_y_log10() +
stat_smooth()
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
Education (категорийн) ба Cost (тоон)
хувьсагчдг хамтад нь цэгэн графикаар дүрсэлж үзье.
p = ggplot(uliral, aes(x=Education, y=Cost))
p + geom_point()
Өмнөх графиктай адилхан олон тооны цэгүүд нэг дор дүрслэгджээ. Иймд ижил төрлийн засварлалтыг туршиж үзвэл:
p + geom_jitter(width=0.1,alpha=0.25, size=0.5)
Илүүтэй түгээмэл ашигладаг boxplot дүрслэлийг ашиглая. Энэ арга нь 5 төрлийн (хамгийн бага утга, дээд ба доод квартил, медиан,хамгийн их утга) тойм статистикийг ашигладаг. Нэмэлт мэдээлэл ойлголт хэрэгтэй бол дараах линкээр орж танилцаж болно. boxplots.
p + geom_boxplot()
Хайрцган диаграм
(Boxplot) нь категори тус бүрд тархалтыг харьцуулахад ашигладаг. Энэ
тохиолдолд, зардал хувьсагч нь маш хазайлттай тул логарифм-хувиргалт
туслах болно.
p + geom_boxplot() + scale_y_log10()
Зардал хувьсагч нь
боловсролын түвшин бүрт харилцан адилгүй утгуудыг авч байгааг бид харж
байна. Хайрцагнуудын урт нь бараг ижил байгааг анзаарч болно.
violin дүрслэл бол хайрцган диаграмыг сайжруулсан хувилбар юм. 5 статистик үзүүлэлтээс гадна тархалтыг дүгнэх боломжтой байдаг:
p + geom_violin()+ scale_y_log10()
Энэ зурагнаас бид хувьсагчийн тархалтыг харж болно.
Энэ зураглалд 0 утгатай хувьсагчдыг хассан. Хичнээн 0 утга байгааг дараах байдлаар үзэж болно:
uliral %>% mutate(costzero = (Cost == 0)) %>%
group_by(Education) %>%
summarise(n=n(),zc=sum(costzero), fraction=zc/n) -> edcost
edcost
# A tibble: 6 × 4
Education n zc fraction
<chr> <int> <int> <dbl>
1 higher 1640 196 0.120
2 noneducated 12355 1086 0.0879
3 primary 383 21 0.0548
4 professional 690 54 0.0783
5 secondary 2332 142 0.0609
6 <NA> 51 31 0.608
Боловсролын түвшин бүр харгалзах утгуудыг харж байна. 0 зардалтай гэсэн утгууд хэд хичнээн, хэдэн хувийг эзэлж байгааг энэхүү хүснэгт харуулж байна.
NA утгыг хасаад баганан диаграм байгуулая. Мөн Давтамжийг нь ихээс нь бага руу шилжих байдлаар дүрсэлбэл:
edcost %>%
filter(!is.na(Education)) %>%
ggplot(aes(reorder(Education,-fraction),fraction)) +
geom_col() +
xlab("Education Level") + ylab("Fraction with zero cost")
TreatDays ба Education хувьсагчдаар хэд
хэдэн төрлийн зураглал байгуул.
In the previous section, we showed how Cost varied
with Age. Өмнөх хэсэгт бид Cost ба
Age хэрхэн хамаарч байгааг харуулсан. Цэгэн диаграмын оронд
энэхүү хамаарлыг хайрцган диаграмыг ашигла. Дүрслэлийн командыг дараах
байдлаар хийгээрэй:
aes(Age, Cost, group=Age)
Энэ дүрслэлийн давуу тал нь юу бэ?
p = ggplot(uliral, aes(x=Education, y=TreatDays))
p + geom_boxplot()
p + geom_violin()
p + geom_point()
ggplot(uliral, aes(x=Age, y=Cost, group = Age)) + geom_boxplot() + scale_y_log10()
Категорийн хувьсагчидыг графикаар дүрслэхэд хэд хэдэн аргууд байдаг.
Бид энэ удаад fill color гэсэн тохиргоог ашиглаад 2дох
хувьсагчийг давтамжийг графикаар дүрсэлбэл:
ggplot(uliral, aes(Education, fill=Gender)) + geom_bar()
Багануудыг хажууд нь дүрсэлбэл:
ggplot(uliral, aes(Education, fill=Gender)) + geom_bar(position = "dodge2")
Дүрслэлийн харахад арай амар хялбар болгодог.
Өвчтөний эмнэлгээс гарсан , эмнэлэгт хэвтсэн огноог ашиглаад тус тусад нь долоо хоногийн өдрөөр илэрхийлсэн шинэ хувьсагч үүсгэе. Уг үүсгэсэн хувьсагчдаа эргээд өгөгдлийн баазад нэмэх:
library(lubridate)
uliral %>% mutate(awday = wday(Admitted, label=TRUE),
dwday = wday(Departure, label=TRUE)) -> uliral
uliral %>% group_by(awday) %>% summarise(n())
# A tibble: 7 × 2
awday `n()`
<ord> <int>
1 Sun 1442
2 Mon 3570
3 Tue 2543
4 Wed 2860
5 Thu 2739
6 Fri 2856
7 Sat 1441
Эмнэлэгт хэвтсэн ба гарсан өдрүүдийн хамаарлыг харуулсан дүрслэл үүсгэе.
ggplot(uliral, aes(x=awday, fill=dwday)) + geom_bar()
2-с олон хувьсагчдыг нэг графикаар дүрслэх боломжтой.
Age, TreatDays ба Gender гэсэн 2
тоон, 1 категорийн хувьсагчдыг авч үзье. Эдгээр 3 хувьсагчдыг нэг дор
нэг график дээр дүрсэлж үзье:
ggplot(uliral, aes(x=Age,y=TreatDays,color=Gender)) + geom_jitter(alpha=0.25,size=0.5)
ggplot(uliral, aes(x=Age,y=TreatDays,color=Gender)) + geom_point()
Энэ командад TreatDays нь у тэнхлэгт, Age
нь х тэнхлэгт, Gender нь өнгө гэсэн хэсгүүдэд оролцоно.
Олон жижиг цэгүүдийг харахад төвөгтэй бол цэгүүдийн хэлбэрийг
shape нэмэлт аргументаар өөрчилж болно.
uliral %>%
filter(Hospital == 2026) %>%
ggplot(aes(x=Age,y=TreatDays,color=Gender,shape=Gender)) +
geom_jitter(size=2)
Энэ график дүрслэлд цэгүүдийг ялгахад хялбар болгох үүднээс нэг эмнэлэг ашиглах шүүлтүүр хийсэн. Маш олон цэгийг дүрслэх шаардалагатай үед 2 бүлэгт трендийг харуулахад төвөгтэй болдог. Графикт жигдрүүлэх (smooth) муруйг ашиглавал хамаарлыг харуулахад хялбар болдог.
uliral %>%
filter(Hospital == 2026) %>%
ggplot(aes(x=Age,y=TreatDays,color=Gender,shape=Gender)) +
geom_jitter(size=2) +
geom_smooth()
`geom_smooth()` using method = 'loess' and formula = 'y ~ x'
Gender гэсэн эрэгтэй, эмэгтэйгээр нь графикийг тус тусад
нь салгаж дүрслэхдээ facetting гэсэн аргументийг ашигладаг.
ggplot(uliral, aes(x=Age,y=TreatDays)) +
geom_jitter(alpha=0.25,size=0.5) +
facet_grid(~ Gender)
Жигдрүүлэх муруйг нэмж өгвөл:
ggplot(uliral, aes(x=Age,y=TreatDays)) +
geom_jitter(alpha=0.25,size=0.5) +
facet_grid(~ Gender) +
geom_smooth()
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
facetting нь харьцуулах бүлгийн тоо бага үед ашиглах нь илүү тохиромжтой. Өмнөх нэг жишээн дээр:
ggplot(uliral, aes(Education)) + geom_bar() + facet_grid(~ Gender)
Хэрэв Харьцуулж буй категорийн хувьсагч нь олон категоритой үед facet_grid командын оронд facet_wrap-г ашиглавал илүү тохиромжтой:
ggplot(uliral, aes(Gender)) + geom_bar() + facet_wrap(~ Education)
Age ба Cost хувьсагчдыг долоо хоногийн
өдрүүдээр харьцуулсан график байгуула.
Age ба awday хувьсагчдаар насны тархалт
хэрхэн өөрчлөгдөж байгааг харуулсан график байгуул.
ggplot(uliral, aes(Age,Cost))+
geom_jitter(alpha=0.25,size=0.5)+
facet_wrap(~ awday) +
scale_y_log10()+
geom_smooth()
`geom_smooth()` using method = 'gam' and formula = 'y ~ s(x, bs = "cs")'
ggplot(uliral, aes(x=Age)) + geom_density() + facet_wrap(~awday)