class: center, middle, inverse, title-slide .title[ # Основы графики ] .subtitle[ ## Программирование и анализ данных ] .author[ ### Тимофей Самсонов ] .institute[ ### МГУ имени Ломоносова, Географический факультет ] .date[ ### 2024-10-01 ] --- # Исходные данные __Исходные данные:__ экспорт/импорт продукции по регионам России (млн долл. США): ``` ## # A tibble: 12 × 5 ## Регион ПродЭкспорт ПродИмпорт ТЭКЭкспорт ТЭКИмпорт ## <chr> <dbl> <dbl> <dbl> <dbl> ## 1 Белгородская область 222. 614. 64.7 24.1 ## 2 Брянская область 28.5 650. 5 20.5 ## 3 Владимирская область 178. 454. 0.9 16.7 ## 4 Воронежская область 374. 182. 38.9 38 ## 5 Ивановская область 3.1 106. 0.1 0.1 ## 6 Калужская область 20.9 185. 14 57.9 ## 7 Костромская область 0.7 6.8 0 NA ## 8 Курская область 140. 219. NA 17.7 ## 9 Липецкая область 162. 301 49.8 108. ## 10 Московская область 774. 3830. 1400. 156. ## 11 Орловская область 46 117. NA 12.1 ## 12 Рязанская область 7.9 101. 33.7 23.9 ``` --- # Диаграммы рассеяния .pull-left[ Диаграмма расеяния показывает соотношение двух переменных на точечном графике .code-small[ ``` r plot(sub$МетЭкспорт, sub$МетИмпорт, col="red", xlab="Экспорт, млн. долл. США", ylab = "Импорт, млн. долл. США", main = "Экспорт/импорт металлов и изделий из них по субъектам РФ") ``` ]] .pull-right[ ![](05_Graphics_files/figure-html/select-out-1.png)<!-- --> ] --- # Диаграммы рассеяния .pull-left[ Если показатели однородны, то целесообразно установить одинаковый масштаб по осям через параметр `asp`: .code-small[ ``` r plot(sub$МетЭкспорт, sub$МетИмпорт, col="red", xlab="Экспорт, млн. долл. США", ylab = "Импорт, млн. долл. США", main = "Экспорт/импорт металлов и изделий из них по субъектам РФ", * asp = 1) ``` ] ] .pull-right[ ![](05_Graphics_files/figure-html/select-out-1.png)<!-- --> ] --- # Диаграммы рассеяния _Размер и тип значка_ можно изменить, используя параметры `pch =` и `cex =`: .left-60[ .code-small[ ``` r plot(sub$МетЭкспорт, sub$МетИмпорт, col="red", xlab="Экспорт, млн. долл. США", ylab = "Импорт, млн. долл. США", main = "Экспорт/импорт металлов и изделий из них по субъектам РФ", asp = 1, * pch = 18, cex = 4) ``` <img src="05_Graphics_files/figure-html/unnamed-chunk-2-1.png" width="60%" /> ] ] .right-40[ <img src="img/pch.jpg" width="65%" /> ] --- # Линейные графики Данные по объему сброса загрязненных сточных вод по морям России (млрд куб. м): ``` ## ℹ Using "','" as decimal and "'.'" as grouping mark. Use `read_delim()` for more control. ## # A tibble: 22 × 9 ## Год Всего Балтийское Черное Азовское Каспийское Карское Белое Прочие ## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 1993 27.2 2.5 0.4 4.3 12.1 5.3 1 1.6 ## 2 1994 24.6 2.3 0.4 3.2 11 5 0.9 1.8 ## 3 1995 24.5 2.3 0.4 3.5 10.4 5.2 0.9 1.8 ## 4 1996 22.4 2.2 0.3 3.1 9.8 4.7 0.8 1.5 ## 5 1997 23 2.2 0.3 3.8 9.8 4.4 0.8 1.7 ## 6 1998 22 2.2 0.3 3.2 9.5 4.2 0.8 1.8 ## 7 1999 20.7 2.2 0.3 2.5 9.1 4.1 0.8 1.7 ## 8 2000 20.3 2.2 0.3 2 9.2 4.2 0.9 1.5 ## 9 2001 19.8 2.1 0.3 1.9 8.9 4.2 0.9 1.5 ## 10 2002 19.8 2 0.2 2 9.2 4.1 0.8 1.5 ## # ℹ 12 more rows ``` --- # Линейные графики Тип графика определяется через параметр `type` .pull-left[ .code-small[ ``` r plot(tab$Год, tab$Каспийское, type="l") ``` <img src="05_Graphics_files/figure-html/unnamed-chunk-5-1.png" width="80%" /> ] ] .pull-right[ .code-small[ ``` r plot(tab$Год, tab$Каспийское, type="b") ``` <img src="05_Graphics_files/figure-html/unnamed-chunk-6-1.png" width="80%" /> ] ] --- # Линейные графики Толщина и тип устанавливаются через параметры `lwd` и `lty`: .pull-left[ .code-small[ ``` r plot(tab$Год, tab$Каспийское, type="l", lwd = 3, lty = 1) ``` <img src="05_Graphics_files/figure-html/unnamed-chunk-7-1.png" width="80%" /> ] ] .pull-right[ .code-small[ ``` r plot(tab$Год, tab$Каспийское, type="l", lwd = 6, lty = 3) ``` <img src="05_Graphics_files/figure-html/unnamed-chunk-8-1.png" width="80%" /> ] ] --- # Совмещение графиков .pull-left[ ``` r plot(tab$Год, tab$Азовское, pch=20, type="o", col="red3") # Добавим теперь на существующий # график новый ряд данных, # используя points() и lines(): points(tab$Год, tab$Карское, pch=20, col="forestgreen") lines(tab$Год, tab$Карское, pch=20, col="forestgreen") ``` ] .pull-right[ ![](05_Graphics_files/figure-html/combine-out-1.png)<!-- --> ] --- # Совмещение графиков Заранее вычислить диапазон по осям можно через `range` .pull-left[ .code-small[ ``` r *xrange = range(tab$Год) *yrange = range(tab$Каспийское, * tab$Карское, * tab$Азовское) # n означает, что ряд данных # рисоваться не будет *plot(xrange, yrange, * type = "n", main="Объем сброса загрязненных сточных вод", xlab="Год", ylab="млрд.куб.м", ) points(tab$Год, tab$Азовское, pch=20, col="red3") lines(tab$Год, tab$Азовское, pch=20, col="red3") points(tab$Год, tab$Карское, pch=20, col="forestgreen") lines(tab$Год, tab$Карское, pch=20, col="forestgreen") points(tab$Год, tab$Каспийское, pch=20, col="steelblue") lines(tab$Год, tab$Каспийское, pch=20, col="steelblue") ``` ] ] .pull-right[ ![](05_Graphics_files/figure-html/combine2-out-1.png)<!-- --> ] --- # Функциональные параметры Графические параметры могут быть _функцией_ данных: .pull-left[ .code-small[ ``` r plot(okr$МетЭкспорт, okr$МетИмпорт, col=rgb(1,0,0,0.5), xlab="Экспорт, млн. долл. США", ylab = "Импорт, млн. долл. США", main = "Экспорт/импорт металлов и изделий из них по ФО РФ (2013 г.)", asp = 1, pch = 20, * cex = 4 * log(2 + sub$МетИмпорт/ * sub$МетЭкспорт)) ``` ] ] .pull-right[ ![](05_Graphics_files/figure-html/funcpar-out-1.png)<!-- --> ] --- # Гистограммы .large[Гистограммы распределения строятся с помощью функции `hist()`.] .pull-left[ <br> Ширину кармана (столбца) гистограммы можно поменять через параметры `breaks` и `col`: ``` r hist(sub$ПродЭкспорт, breaks = seq(0, 3000, 200), col="olivedrab3") ``` ] .pull-right[ ![](05_Graphics_files/figure-html/hist-out-1.png)<!-- --> ] --- # Гистограммы .large[Гистограммы распределения строятся с помощью функции `hist()`.] .pull-left[ <br> Перед построением гистограммы часто выполняют логарифмирование: ``` r hist(log(sub$ПродЭкспорт), col = "olivedrab3") ``` ] .pull-right[ ![](05_Graphics_files/figure-html/histlog-out-1.png)<!-- --> ] --- # Столбчатые графики .left-40[ По умолчанию: ``` r barplot(okr$ХимЭкспорт) ``` ![](05_Graphics_files/figure-html/unnamed-chunk-9-1.png)<!-- --> ] .right-60[ Горизонтально с подписями: ``` r margins.default = par("mar") par(mar = c(5, 10, 0, 2)) barplot(okr$ХимЭкспорт, names.arg=sub('федеральный округ', '', okr$Регион), horiz = TRUE, las = 1) ``` ![](05_Graphics_files/figure-html/unnamed-chunk-10-1.png)<!-- --> ] --- # Столбчатые графики С заголовком и установленным диапазоном по оси Х: .pull-left[ ``` r par(mar = c(5, 10, 2, 2)) names = sub('федеральный округ', '', okr$Регион) barplot( okr$ХимЭкспорт, names.arg = names, main = "Экспорт продукции химической промышленности", xlab = "млн долл. США", horiz = TRUE, las = 1, xlim = c(0,12000) ) ``` ] .pull-right[ ![](05_Graphics_files/figure-html/barfull-out-1.png)<!-- --> ] --- # Круговые (секторные) диаграммы .pull-left[ Круговые диаграммы (англ. _piechart_) строятся с помощью функции `pie()`: ``` r par(mar = c(10,3,0,2)) pie(okr$ХимЭкспорт) ``` ![](05_Graphics_files/figure-html/unnamed-chunk-11-1.png)<!-- --> ] .pull-right[ Вместо номеров можно использовать подписи секторов, добавив второй параметр: ``` r pie(okr$ХимЭкспорт, names) ``` <img src="05_Graphics_files/figure-html/unnamed-chunk-12-1.png" width="80%" /> ] --- # Круговые (секторные) диаграммы Заголовок, подписи процентов и отсчет по часовой стрелке: .code-small[ ``` r title = "Доля федеральных округов в экспорте\nпродукции химической промышленности" ``` ] .pull-left[ .code-small[ ``` r library(glue) percentage = round( 100 * okr$ХимЭкспорт / sum(okr$ХимЭкспорт), 1) names2 = glue('{names} ({percentage}%)') par(mar = c(6,5,2,5)) pie(okr$ХимЭкспорт, names2, clockwise = TRUE, main = title) ``` ] ] .pull-right[ ![](05_Graphics_files/figure-html/piefull-out-1.png)<!-- --> ] --- # Цвет и прозрачность .pull-left[ Список называний цветов можно посмотреть, вызвав функцию `colors()`: ``` r colors()[1:20] ``` [1] "white" "aliceblue" "antiquewhite" "antiquewhite1" [5] "antiquewhite2" "antiquewhite3" "antiquewhite4" "aquamarine" [9] "aquamarine1" "aquamarine2" "aquamarine3" "aquamarine4" [13] "azure" "azure1" "azure2" "azure3" [17] "azure4" "beige" "bisque" "bisque1" ] .pull-right[ [Палитра](https://www.stat.auckland.ac.nz/~ihaka/downloads/R-colours-a4.pdf) предопределенных цветов: <iframe src="https://www.stat.auckland.ac.nz/~ihaka/downloads/R-colours-a4.pdf" width="100%" height="400px" data-external="1"></iframe> .small[https://www.stat.auckland.ac.nz/~ihaka/downloads/R-colours-a4.pdf] ] --- # Цвет .pull-left[ Основной цвет задается параметром `col`: ``` r par(mar = c(5, 10, 4, 2)) barplot(okr$ХимЭкспорт, names.arg = names, main = "Экспорт продукции химической промышленности", xlab = "млн долл. США", horiz = TRUE, las = 1, xlim = c(0,12000), * col = "orangered") ``` ] .pull-right[ ![](05_Graphics_files/figure-html/col1-out-1.png)<!-- --> ] --- # Цвет .pull-left[ Также можно цвет задать в заданном цветовом пространстве: ``` r barplot(okr$ХимЭкспорт, names.arg = names, main = "Экспорт продукции химической промышленности", xlab = "млн долл. США", horiz = TRUE, las = 1, xlim = c(0,12000), * col = rgb(0.4, 0, 0.6)) ``` ] .pull-right[ ![](05_Graphics_files/figure-html/col2-out-1.png)<!-- --> ] --- # Цвет .pull-left[ Каждому столбику можно задать свой цвет: ``` r colors = c( "red", "green", "blue", "orange", "yellow", "pink", "white","black" ) barplot(okr$ХимЭкспорт, names.arg = names, main = "Экспорт продукции химической промышленности", xlab = "млн долл. США", horiz = TRUE, las = 1, xlim = c(0,12000), col = colors) ``` ] .pull-right[ ![](05_Graphics_files/figure-html/col3-out-1.png)<!-- --> ] --- # Цвет .pull-left[ Или выделить особым цветом нужные. Например, 2 лидера: ``` r colors = rep("gray", 8) ord = order(okr$ХимЭкспорт, decreasing = T) colors[ord[1:2]] = "orangered" barplot(okr$ХимЭкспорт, names.arg = names, main = "Экспорт продукции химической промышленности", xlab = "млн долл. США", horiz = TRUE, las = 1, xlim = c(0,12000), col = colors) ``` ] .pull-right[ ![](05_Graphics_files/figure-html/col4-out-1.png)<!-- --> ] --- # Прозрачность .pull-left[ Полупрозрачность можно создать путем модификации существующего цвета через `adjustcolor` или определения компоненты `alpha` при создании: ``` r barplot( okr$ХимЭкспорт, names.arg = names, main = "Экспорт продукции химической промышленности", xlab = "млн долл. США", horiz = TRUE, las = 1, xlim = c(0,12000), * col = adjustcolor('violet', * alpha = 0.5), * border = rgb(0, 1, 0, 0.5) ) ``` ] .pull-right[ ![](05_Graphics_files/figure-html/transp-out-1.png)<!-- --> ] --- # Цветовые палитры ``` r *palet = colorRampPalette(c("steelblue","white","purple4")) ``` .pull-left[ ``` r barplot(okr$ХимЭкспорт, names.arg = names, main = "Экспорт продукции химической промышленности", xlab = "млн долл. США", horiz = TRUE, las = 1, xlim = c(0, 12000), * col = palet(nrow(okr))) ``` `colorRampPalette()` является __функциональной фабрикой__, т.е. функцией, создающей другую функцию. ] .pull-right[ <img src="05_Graphics_files/figure-html/pal-out-1.png" width="90%" /> ] --- # Цветовые палитры .pull-left[ В __R__ cуществует множество стандартных цветовых палитр: * `colors()` * `gray()` * `rainbow()` * `heat.colors()` * `topo.colors()` * `terrain.colors()` ``` r pie( okr$ХимЭкспорт, names2, main = "Доля федеральных округов в экспорте \n продукции химической промышленности", * col = rainbow(nrow(okr)) ) ``` ] .pull-right[ ![](05_Graphics_files/figure-html/piepal-out-1.png)<!-- --> ] --- # Цветовые палитры .pull-left[ В __R__ cуществует множество стандартных цветовых палитр: * `colors()` * `gray()` * `rainbow()` * `heat.colors()` * `topo.colors()` * `terrain.colors()` ``` r pie( okr$ХимЭкспорт, names2, main = "Доля федеральных округов в экспорте \n продукции химической промышленности", *col = sample(colors(), nrow(okr)) ) ``` ] .pull-right[ ![](05_Graphics_files/figure-html/piepal2-out-1.png)<!-- --> ] --- # Color Brewer Широко используемый ресурс для построения цветовых палитр <iframe src="https://colorbrewer2.org/" width="100%" height="400px" data-external="1"></iframe> https://colorbrewer2.org/ --- # Color Brewer .pull-left[ Палитры ColorBrewer доступны через пакет `RColorBrewer` ``` r par(mar = c(0, 2.5, 0, 2.5)) *display.brewer.all() ``` К каждой палитре можно обратиться по имени: ``` r library(RColorBrewer) colors = brewer.pal(nrow(okr), "Set1") ``` ] .pull-right[ ![](05_Graphics_files/figure-html/brew-out-1.png)<!-- --> ] --- # Color Brewer .pull-left[ .code-small[ ``` r pie(okr$ХимЭкспорт, names2, main = "Доля федеральных округов в экспорте \n продукции химической промышленности", * col = brewer.pal(nrow(okr), "Set1")) ``` ![](05_Graphics_files/figure-html/unnamed-chunk-20-1.png)<!-- --> ] ] .pull-right[ .code-small[ ``` r pie(okr$ХимЭкспорт, names2, main = "Доля федеральных округов в экспорте \n продукции химической промышленности", * col = brewer.pal(nrow(okr), "Set2")) ``` ![](05_Graphics_files/figure-html/unnamed-chunk-21-1.png)<!-- --> ] ] --- # Графические параметры Изменять __размеры элементов графика__ можно независимо друг от друга, используя следующие параметры: * `cex` — общий масштаб элементов на графике * `cex.axis` — масштаб подписей координат на оси * `cex.lab` — масштаб подписей названий осей * `cex.main` — масштаб заголовка графика * `cex.sub` — масштаб подзаголовка графика * `cex.names` — масштаб подписей факторов (для некоторых типов диаграмм) --- # Графические параметры .pull-left[ Настройка размеров: ``` r plot(tab$Год, tab$Каспийское, pch=20, type="o", ylim = c(0,12), col="red3", main="Объем сброса загрязненных сточных вод", xlab="Год", ylab="млрд.куб.м", * cex.axis = 0.8, * cex.lab = 0.7, * cex.main = 0.9, * cex = 0.8) points(tab$Год, tab$Карское, pch=20, col="forestgreen", * cex = 0.8) lines(tab$Год, tab$Карское, pch=20, col="forestgreen") points(tab$Год, tab$Азовское, pch=20, col="steelblue", * cex = 0.8) lines(tab$Год, tab$Азовское, pch=20, col="steelblue") ``` ] .pull-right[ ![](05_Graphics_files/figure-html/cex-out-1.png)<!-- --> ] --- # Графические параметры .pull-left[ Настройка размеров: ``` r plot(tab$Год, tab$Каспийское, pch=20, type="o", ylim = c(0,12), col="red3", main="Объем сброса загрязненных сточных вод", xlab="Год", ylab="млрд.куб.м", * cex.axis = 1.8, * cex.lab = 1.7, * cex.main = 1.9, * cex = 1.8) points(tab$Год, tab$Карское, pch=20, col="forestgreen", * cex = 1.8) lines(tab$Год, tab$Карское, pch=20, col="forestgreen") points(tab$Год, tab$Азовское, pch=20, col="steelblue", * cex = 1.8) lines(tab$Год, tab$Азовское, pch=20, col="steelblue") ``` ] .pull-right[ ![](05_Graphics_files/figure-html/cex2-out-1.png)<!-- --> ] --- # Графические параметры Аналогично происходит тонкая настройка __цвета__: * `col` — цвет графика * `col.axis` — цвет подписей координат * `col.lab` — цвет названий осей * `col.main` — цвет заголовка * `col.sub` — цвет подзаголовка * `fg` — цвет элементов переднего плана (оси, рамка и т.д.) * `bg` — цвет фона графика (background) --- # Графические параметры .pull-left[ Настройка цвета: ``` r plot(tab$Год, tab$Каспийское, pch=20, type="o", ylim = c(0,12), col="red3", main="Объем сброса загрязненных сточных вод", xlab="Год", ylab="млрд.куб.м", cex.axis=1.8, cex.lab=1.7, cex.main=1.9, * col.lab = "grey50", * fg = "grey20") points(tab$Год, tab$Карское, pch=20, * col="forestgreen") lines(tab$Год, tab$Карское, pch=20, * col="forestgreen") points(tab$Год, tab$Азовское, pch=20, * col="steelblue") lines(tab$Год, tab$Азовское, pch=20, * col="steelblue") ``` ] .pull-right[ ![](05_Graphics_files/figure-html/colplot-out-1.png)<!-- --> ] --- # Разметка осей, рамка .pull-left[ ``` r plot(tab$Год, tab$Каспийское, type = "l", * axes = FALSE) axis(side = 1, at = seq(min(tab$Год), max(tab$Год), 1), tck = -0.02, * labels = FALSE) axis(side = 1, at = seq(min(tab$Год), max(tab$Год), 3), tck = 0) axis(side = 2, at = seq(floor(min(tab$Каспийское)), ceiling(max(tab$Каспийское)), 1), tck = -0.02) grid() # сетка box() # рамка ``` ] .pull-right[ ![](05_Graphics_files/figure-html/manual-out-1.png)<!-- --> ] --- # Разметка осей, рамка .pull-left[ Ручное формирование: .code-small[ ``` r library(scales) *xlines = fullseq(range(tab$Год), 1) *ylines=fullseq(range(tab$Каспийское),1) plot(tab$Год, tab$Каспийское, cex.axis = 1.8, cex.lab = 1.7, cex.main = 1.9, cex = 1.8, * type = "n") abline(h = ylines, v = xlines, col = "lightgray") lines(tab$Год, tab$Каспийское, col = "red3") points(tab$Год, tab$Каспийское, pch = 20, col = "red3") abline(h = 10, col = "blue", lwd = 2) box() ``` ] ] .pull-right[ ![](05_Graphics_files/figure-html/manualaxes-out-1.png)<!-- --> ] --- # Аннотации данных (текст на графике) .pull-left[ Аннотации размещаются через `text`: ``` r text(tab$Год, tab$Каспийское, * labels = tab$Каспийское, cex = 1.2, pos = 3) ``` ] .pull-right[ ![](05_Graphics_files/figure-html/unnamed-chunk-22-1.png)<!-- --> ] --- ## Легенда .pull-left[ Легенда к графику размещается с помощью функции `legend()`: ``` r main = "Море" labels = c("Каспийское", "Карское", "Азовское") colors = c("red3", "forestgreen", "steelblue") legend( "topright", labels, cex = 1.5, title = main, * fill = colors # плашки! ) ``` ] .pull-right[ ![](05_Graphics_files/figure-html/unnamed-chunk-23-1.png)<!-- --> ] --- ## Легенда .pull-left[ Чтобы поменять плашки на точки, надо определить соответствующие параметры: ``` r pts = c(20, 20, 20) lns = c(1, 1, 1) # теперь посмотрим на легенду (она нарисуется поверх старой) legend( 'topright', labels, cex = 1.5, title = main, col = colors, * pch = pts, # точки! * lwd = lns # линии! ) ``` ] .pull-right[ ![](05_Graphics_files/figure-html/unnamed-chunk-24-1.png)<!-- --> ]