суббота, 19 марта 2016 г.

Быстрое введение в ggplot2

Перевод. Оригинал здесь.

Это введение в ggplot2 - это отличный пакет R для визуализации данных, которое не предполагает, что вы уже знакомы с R.

Для лучшего понимания можно посмотреть хорошо оформленную версию этой статьи в репозитории Github, которая также содержит некоторые примеры наборов данных, используемые мною, в также версию этого поста в виде кода с комментариями.

Давайте сначала посмотрим, что может ggplot2.

Набор данных "ирисы Фишера" и одна простая команда...

> qplot(Sepal.Length, Petal.Length, data = iris, color = Species)

Rplot01.png

Установка

Вы можете скачать R здесь. После установки вы можете запустить R в интерактивном режиме, введя R в командной строке, или открыв стандартный GUI.

Основы R

Векторы

Векторы являются базовой структурой данных в R и создаются с помощью команды c(). Элементы вектора должны быть одинакового типа.

> numbers = c(23, 13, 5, 7, 31)
> names = c("edwin", "alice", "bob")

Индексы элементов начинаются с 1, доступ к элементам производится с помощью квадратных скобок.

> numbers[1]
[1] 23
> names[1]
[1] "edwin"

Data frame

Data frame - это подобие матрицы, но с именованными столбцами, которые могут быть разных типов (как таблицы баз данных).

> books = data.frame(title = c("harry potter", "war and peace", "lord of the rings"), author = c("rowling", "tolstoy", "tolkien"), num_pages = c("350", "875", "500"))
 
Вы можете получать доступ к столбцам данных с помощью префикса $.

> books$title
[1] harry potter      war and peace     lord of the rings
Levels: harry potter lord of the rings war and peace
> books$author[1]
[1] rowling
Levels: rowling tolkien tolstoy

Также с помощью $ вы можете создавать новые столбцы

> books$num_bought_today = c(10, 5, 8)
> books$num_bought_yesterday = c(18, 13, 20)
> books$total_num_bought = books$num_bought_today + books$num_bought_yesterday

read.table

Предположим, вам необходимо экспортировать в data frame файл TSV.

Файл tsv без заголовка

Для примера возьмем файл students.tsv (со столбцами, описывающими возраст, оценку и имя каждого студента).

13   100 alice
14   95  bob
13   82  eve
 
Вы можете импортировать этот файл в R с помощью команды read.table().

> students = read.table("students.tsv",
+ header = F, # файл не содержит заголовка ("F" - это сокращение для "FALSE"), поэтому мы должны вручную задать имена столбцов.                    
+ sep = "\t", # разделители - табуляция      
+ col.names = c("age", "score", "name") # имена столбцов)

Теперь мы можем обращаться к различным столбцам в data frame с помощью students$age, students$score и students$name.

Файл csv с заголовком

В качестве примера файла другого формата посмотрим studentsWithHeader.tsv.

age,score,name
13,100,alice
14,95,bob
13,82,eve
 
У нас те же данные, но теперь они разделены запятыми и имеют заголовок. Мы можем импортировать этот файл следующим образом:

> students = read.table("students.tsv", sep = ",",
+ header = T)  # первая строка содержит имена столбцов

Примечание: есть также функция read.csv, в которой по умолчанию sep = ",".

help

У функции read.table очень много опций. Для того, чтобы вывести их все, просто введите (read.table) (или ?read.table).

# Это работает с любыми функциями.
 help(read.table)
 ?read.table
 
ggplot2

Теперь, зная основы R, можно приступить к изучению пакета ggplot2.

Установка

Одной из сильных сторон R является отличный набор пакетов на все случаи жизни. Для установки пакета используется функция install.packages().

install.packages("ggplot2")
 
Для загрузки пакета в текущей сессии R используется функция library().

library(ggplot2)
 
Построение диаграмм рассеяния с помощью функции qplot()

Давайте посмотрим, как в ggplot2 строить диаграммы рассеяния. Мы будем использовать набор данных iris, который автоматически загружается в R.

Что содержит data frame? Для того, чтобы посмотреть несколько первых строк данных, используется функция head.

> head(iris) # по умолчанию функция head выводит первые 6 строк
 Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
> head(iris, n = 10) # мы можем явно задать, какое количество строк вывести
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa
5           5.0         3.6          1.4         0.2  setosa
6           5.4         3.9          1.7         0.4  setosa
7           4.6         3.4          1.4         0.3  setosa
8           5.0         3.4          1.5         0.2  setosa
9           4.4         2.9          1.4         0.2  setosa
10          4.9         3.1          1.5         0.1  setosa

(data frame на самом деле содержит данные по трем видам ирисов: setosa, versicolor, and virginica.)

Давайте построим график Sepal.Length vs Petal.Length, используя функцию qplot() из ggplot2.

> # строим Sepal.Length vs. Petal.Length, используя данные из набора iris
> # * Первый аргумент "Sepal.Length" соответствует оси x.
> # * Второй аргумент "Petal.Length" соответствует оси y.
> # * "data = iris" означает искать данные в  data frame "iris".
> qplot(Sepal.Length, Petal.Length, data = iris)

Rplot02.png

Чтобы увидеть на графике расположение каждого вида, мы можем раскрасить их, добавив аргумент color = Species.

> qplot(Sepal.Length, Petal.Length, data = iris, color = Species)

Rplot03.png
 
Аналогично, мы можем задать размер каждой точки в соответствии со значением, добавив аргумент size = Sepal.Width.

> qplot(Sepal.Length, Petal.Length, data = iris, color = Species, size = Petal.Width)

Rplot04.png

> # Задав значение alpha для каждой точки 0.7, мы уменьшим эффект перекрытия.
> qplot(Sepal.Length, Petal.Length, data = iris, color = Species, size = Petal.Width, alpha = I(0.7))

Rplot05.png

И наконец, давайте исправим подписи осей и добавим заголовок к графику.

> qplot(Sepal.Length, Petal.Length, data = iris, color = Species, xlab = "Sepal Length", ylab = "Petal Length", main = "Sepal vs. Petal Length in Fisher's Iris data")

Rplot06.png

Другие типы графиков

В приведенном выше примере мы просто задействовали тип графика, используемый по умолчанию при двух аргументах у функции qplot().

> # Эти две функции эквивалентны
> qplot(Sepal.Length, Petal.Length, data = iris, geom = "point")
> qplot(Sepal.Length, Petal.Length, data = iris)
 
Но мы также легко можем использовать другие типы графиков.

Гистограммы: geom = “bar”

> movies = data.frame(director = c("spielberg", "spielberg", "spielberg", "jackson", "jackson"), movie = c("jaws", "avatar", "schindler's list", "lotr", "king kong"), minutes = c(124, 163, 195, 600, 187))

> # Строим гистограмму количества фильмов каждого режиссера.
> qplot(director, data = movies, geom = "bar", ylab = "# movies")

Rplot07.png

> # Здесь высота столбца равна общей продолжительности фильмов каждого режиссера.
> qplot(director, weight = minutes, data = movies, geom = "bar", ylab = "total length (min.)")

Rplot08.png

Линейные графики: geom = “line”

> qplot(Sepal.Length, Petal.Length, data = iris, geom = "line", color = Species)

Rplot09.png
 
> # "Orange" - это еще один встроенный набор данных, который описывает рост апельсиновых деревьев.
> qplot(age, circumference, data = Orange, geom = "line", colour = Tree, main = "How does orange tree circumference vary with age?")

Rplot10.png
 
> # Мы также можем строить графики, содержащие как точки, так и линии.
> qplot(age, circumference, data = Orange, geom = c("point", "line"), colour = Tree)

Rplot11.png

Комментариев нет:

Отправить комментарий