Ящик с усами или boxplot в R studio

Что такое блокплощадка в программировании на R? Блок-график в R, также известный как блок-график и график усов, представляет собой графическое представление, которое позволяет суммировать основные характеристики данных (положение, дисперсия, асимметрия, …) и определить наличие выбросов. В этом уроке мы рассмотрим, как создать базовый прямоугольник R.

Как интерпретировать блок-график в R?

Блок boxplot начинается в первом квартиле (25%) и заканчивается в третьем (75%). Следовательно, блок представляет 50% центральных данных с линией внутри, которая представляет медиану. На каждой стороне блока нарисован сегмент с самыми дальними данными без учета выбросов boxplot, которые в случае их существования будут представлены кружками.

Выброс – это то наблюдение, которое очень далеко от остальных данных. Точка данных называется выбросом, если она больше Q3 + 1,5 Q_3I Qr (правый выброс) или меньшеQ1\cdot IQR – 1,5 I Qr (левый выброс), т.Е.Q1Q_1 – первый квартиль, Q3 -третий\cdot IQRQ_1Q_3 квартиль и IQRI Qrмежквартильный диапазон (Q3 – Q_3Q1Q_1), который представляет ширину блока для горизонтальных блок-графиков.

Функция boxplot в R

График прямоугольника и усов в базе R может быть построен с помощью boxplot функции. Вы можете построить этот тип графика из разных входных данных, таких как векторы или фреймы данных, как мы рассмотрим в следующих подразделах. В случае построения блок-графиков для нескольких групп на одном графике вы также можете указать формулу в качестве входных данных. Кроме того, вы можете настроить результирующий boxplot с несколькими аргументами.

Блокплот из вектора

Если вам интересно, как создать блок-график в R из vector, вам просто нужно передать вектор boxplot функции. По умолчанию boxplot будет вертикальным, но вы можете изменить ориентацию, задав horizontal аргументTRUE.

Примерные данныеx <- c(8, 5, 14, -9, 19, 12, 3, 9, 7, 4,
       4, 6, 8, 12, -8, 2, 0, -1, 5, 3)
boxplot(x, horizontal = TRUE)
Простой блокплот в R

Обратите внимание, что boxplot скрывает базовое распределение данных. Чтобы решить эту проблему, вы можете добавить точки в boxplot в R с stripchart помощью функции (искаженные точки данных позволят избежать перекрытия выбросов) следующим образом:

stripchart(x, method = "jitter", pch = 19, add = TRUE, col = "blue")
Добавление точек к блокплот в R с помощью функции stripchart

Начиная с версии R 4.0.0, блокплот по умолчанию серый, а не белый.

Блок-график с доверительным интервалом для медианы

Вы можете представить 95% доверительные интервалы для медианы в блок-графике R, установив notch аргумент TRUE равным .

boxplot(x, notch = TRUE)
Блокплот с надрезом

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

Блокплот по группам в R

Если в вашем наборе данных есть категориальная переменная, содержащая группы, вы можете создать boxplot из формулы. В этом примере мы собираемся использовать базовый chickwts набор данных R.

head(chickwts)
Вывод   weight    feed
1   179    horsebean
2   160    horsebean
3   136    horsebean
4   227    horsebean
5   217    horsebean
6   168    horsebean

Теперь вы можете создать график коробок с указанием веса в зависимости от типа корма. Обратите внимание, что при работе с наборами данных вы можете вызывать имена переменных, если вы укажете имя фрейма данных в dataаргументе.

boxplot(chickwts$weight ~ chickwts$feed)
boxplot(weight ~ feed, data = chickwts) # Equivalent
Блок-график по группам

Кроме того, в этом примере вы можете добавить точки к каждому boxplot, набрав:

stripchart(chickwts$weight ~ chickwts$feed, vertical = TRUE, method = "jitter",
           pch = 19, add = TRUE, col = 1:length(levels(chickwts$feed)))
Несколько блокплотов с точками данных

Несколько блокплотов

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

head(trees)
Вывод  Girth Height Volume
1   8.3     70   10.3
2   8.6     65   10.3
3   8.8     63   10.2
4  10.5     72   16.4
5  10.7     81   18.8
6  10.8     83   19.7

Обратите внимание на разницу в отношении chickwts набора данных. Тем не менее, вы можете преобразовать этот набор данных в тот же формат, chickwts что и набор данных с stack помощью функции.

stacked_df <- stack(trees)
head(stacked_df)
Вывод   values  ind
1    8.3  Girth
2    8.6  Girth
3    8.8  Girth
4   10.5  Girth
5   10.7  Girth
6   10.8  Girth

Теперь вы можете построить блокплот с использованием исходного или сложенного фрейма данных, как мы делали в предыдущем разделе. Обратите внимание, что вы можете изменить цвет boxplot по группам с помощью вектора цветов в качестве параметров colаргумента. Таким образом, каждый блокплот будет иметь свой цвет.

# Boxplot from the R trees dataset
boxplot(trees, col = rainbow(ncol(trees)))

# Equivalent to:
boxplot(stacked_df$values ~ stacked_df$ind,
        col = rainbow(ncol(trees)))
Создание нескольких блокплотов в R

Вы можете складывать столбцы фрейма данных с stack помощью функции.

В случае, если вам нужно построить другой boxplot для каждого столбца вашего R dataframe, вы можете использовать lapply функцию и выполнять итерации по каждому столбцу. В этом случае мы разделим графики par на одну строку и столько столбцов, сколько есть в наборе данных, но вы можете строить отдельные графики. Обратите внимание, что invisible функция избегает отображения выходного текста lapply функции.

par(mfrow = c(1, ncol(trees)))
invisible(lapply(1:ncol(trees), function(i) boxplot(trees[, i])))
Блокплот для каждого столбца

Изменить порядок блокплот в R

По умолчанию блок-графики будут отображаться в порядке следования факторов в данных. Тем не менее, вы можете изменить порядок или отсортировать boxplot в R, изменив порядок данных по любой метрике, такой как медиана или среднее значение, с reorder помощью функции.

par(mfrow = c(1, 2))

# Lower to higher
medians <- reorder(chickwts$feed, chickwts$weight, median)
# medians <- with(chickwts, reorder(feed, weight, median)) # Equivalent

boxplot(chickwts$weight ~ medians, las = 2, xlab = "", ylab = "")

# Higher to lower
medians <- reorder(chickwts$feed, -chickwts$weight, median)
# medians <- with(chickwts, reorder(feed, -weight, median)) # Equivalent

boxplot(chickwts$weight ~ medians, las = 2, xlab = "", ylab = "")

par(mfrow = c(1, 1))
Переупорядочивание блок-графиков в R

Если вы хотите заказать boxplot с другой метрикой, просто измените medianна ту, которую вы предпочитаете.

Настройка Boxplot

Boxplot можно полностью настроить для получения хорошего результата. В следующем блоке кода мы покажем широкий пример того, как настроить прямоугольную диаграмму R и как добавить сетку. Обратите внимание, что для настройки boxplot используется даже больше аргументов, чем в следующем примере, например boxlty, , boxlwdmedltyили staplelwd. Просмотрите полный список параметров графического блока в parsаргументе help(bxp)или ?bxp.

plot.new()

set.seed(1)

# Light gray background
rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4],
     col = "#ebebeb")

# Add white grid
grid(nx = NULL, ny = NULL, col = "white", lty = 1,
     lwd = par("lwd"), equilogs = TRUE)

# Boxplot
par(new = TRUE)
boxplot(rnorm(500), # Data
        horizontal = FALSE, # Horizontal or vertical plot
        lwd = 2, # Lines width
        col = rgb(1, 0, 0, alpha = 0.4), # Color
        xlab = "X label",  # X-axis label
        ylab = "Y label",  # Y-axis label
        main = "Customized boxplot in base R", # Title
        notch = TRUE, # Add notch if TRUE
        border = "black",  # Boxplot border color
        outpch = 25,       # Outliers symbol
        outbg = "green",   # Outliers color
        whiskcol = "blue", # Whisker color
        whisklty = 2,      # Whisker line type
        lty = 1) # Line type (box and median)

# Add a legend
legend("topright", legend = "Boxplot", # Position and title
    fill = rgb(1, 0, 0, alpha = 0.4),  # Color
    inset = c(0.03, 0.05), # Modify margins
    bg = "white") # Legend background color
Полная настройка блокплот

Добавьте среднюю точку к блок-графику в R

По умолчанию при создании boxplot отображается медиана. Тем не менее, вы также можете захотеть отобразить среднее значение или другую характеристику данных. Для этой цели вы можете использовать segments функцию, если хотите отобразить линию в качестве медианы, или points функцию, чтобы просто добавить точки. Обратите внимание, что код немного отличается, если вы создаете вертикальный блокплот или горизонтальный блокплот.

В следующем блоке кода мы покажем вам, как добавить средние точки и сегменты к обоим типам коробочных графиков при работе с одним коробочным графиком.

par(mfrow = c(1, 2))

#-----------------
# Vertical boxplot
#-----------------

boxplot(x)

# Add mean line
segments(x0 = 0.8, y0 = mean(x),
         x1 = 1.2, y1 = mean(x),
         col = "red", lwd = 2)
# abline(h = mean(x), col = 2, lwd = 2) # Entire line

# Add mean point
points(mean(x), col = 3, pch = 19)


#-------------------
# Horizontal boxplot
#-------------------

boxplot(x, horizontal = TRUE)

# Add mean line
segments(x0 = mean(x), y0 = 0.8,
         x1 = mean(x), y1 = 1.2,
         col = "red", lwd = 2)
# abline(v = mean(x), col = 2, lwd = 2) # Entire line

# Add mean point
points(mean(x), 1, col = 3, pch = 19)

par(mfrow = c(1, 1))
Добавление средней точки и линии к блоку и усовому графику

Обратите внимание, что в этом случае среднее и медиана почти равны, поскольку распределение симметрично. Вы можете изменить mean функцию предыдущего кода для другой функции, чтобы отобразить другие меры.

Вы также можете добавить среднюю точку в блок-график по группам. В этом случае вы можете использовать lapply функцию, чтобы избежать for циклов. Для вычисления mean для каждой группы вы можете использовать apply функцию по столбцам или colMeans функцию. Вы можете следовать блоку кода, чтобы добавить линии и точки для горизонтальных и вертикальных диаграмм с рамками и усов.

par(mfrow = c(1, 2))

my_df <- trees

#--------------------------
# Vertical boxplot by group
#--------------------------

boxplot(my_df, col = rgb(0, 1, 1, alpha = 0.25))

# Add mean lines
invisible(lapply(1:ncol(my_df),
                function(i) segments(x0 = i - 0.4,
                                     y0 = mean(my_df[, i]),
                                     x1 = i + 0.4,
                                     y1 = mean(my_df[, i]),
                                     col = "red", lwd = 2)))

# Add mean points
means <- apply(my_df, 2, mean)
means <- colMeans(my_df) # Equivalent (more efficient)

points(means, col = "red", pch = 19)


#----------------------------
# Horizontal boxplot by group
#----------------------------

boxplot(my_df, col = rgb(0, 1, 1, alpha = 0.25),
        horizontal = TRUE)

# Add mean lines
invisible(lapply(1:ncol(my_df),
                function(i) segments(x0 = mean(my_df[, i]),
                                     y0 = i - 0.4,
                                     x1 = mean(my_df[, i]),
                                     y1 = i + 0.4,
                                     col = "red", lwd = 2)))

# Add mean points
means <- apply(my_df, 2, mean)
means <- colMeans(my_df) # Equivalent (more efficient)

points(means, 1:ncol(my_df), col = "red", pch = 19)

par(mfrow = c(1, 1))
Узнайте, как добавлять средние точки и линии к прямоугольным и усовым диаграммам по группам

Возвращать значения из boxplot

Если вы присвоите boxplot переменной, вы можете вернуть список с разными компонентами. Создайте блокплот с trees набором данных и сохраните его в переменной:

res <- boxplot(trees)
res
Вывод$`stats`
      [, 1] [, 2] [, 3]
[1, ]  8.30   63  10.2
[2, ] 11.05   72  19.4
[3, ] 12.90   76  24.2
[4, ] 15.25   80  37.3
[5, ] 20.60   87  58.3

$n
[1] 31 31 31

$conf
        [, 1]    [, 2]    [, 3]
[1, ] 11.70814 73.72979 19.1204
[2, ] 14.09186 78.27021 29.2796

$out
[1] 77

$group
[1] 3

$names
[1] "Girth" "Height" "Volume"

Выходные данные будут содержать шесть элементов, описанных ниже:

  • статистика: каждый столбец представляет нижний ус, первый квартиль, медиану, третий квартиль и верхний ус каждой группы.
  • n: количество наблюдений для каждой группы.
  • conf: каждый столбец представляет нижние и верхние крайние значения доверительного интервала медианы.
  • out: общее количество выбросов.
  • группа: общее количество групп.
  • имена: имена каждой группы.

Стоит упомянуть, что вы можете создать boxplot из переменной, которую вы только что создали (res) с bxpпомощью функции.

bxp(res)

Коробочный график и гистограмма

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

par(mfrow = c(1, 1))

# Multimodal data
n <- 20000
ii <- rbinom(n, 1, 0.5)
dat <- rnorm(n, mean = 110, sd = 11) * ii +
       rnorm(n, mean = 70, sd = 5) * (1 - ii)

# Histogram
hist(dat, probability = TRUE, ylab = "", col = "grey",
     axes = FALSE, main = "")

# Axis
axis(1)

# Density
lines(density(dat), col = "red", lwd = 2)

# Add boxplot
par(new = TRUE)
boxplot(dat, horizontal = TRUE, axes = FALSE,
        lwd = 2, col = rgb(0, 1, 1, alpha = 0.15))
Добавление блок-диаграммы поверх гистограммы в R

Boxplot не может обнаружить мультимодальность в данных.

В качестве альтернативы этой проблеме вы можете использовать скрипичные графики или beanplots.

Блокплот в R ggplot2

Блокплот, который мы создали в предыдущих разделах, также можно построить с ggplot2 помощью библиотеки. Для получения дополнительной информации ознакомьтесь с полным руководством по ggplot2 boxplots.

Блокплот в ggplot2 из вектора

Входные ggplot данные библиотеки должны быть фреймом данных, поэтому вам нужно преобразовать вектор в data.frame класс. Затем вы можете использовать geom_boxplot функцию для создания и настройки блока, а также stat_boxplot функцию для добавления полос ошибок.

# install.packages("ggplot2")
library(ggplot2)

# Transform our 'x' vector
x <- data.frame(x)

# Boxplot with vector
ggplot(data = x, aes(x = "", y = x)) +
       stat_boxplot(geom = "errorbar",      # Error bars
                    width = 0.2) +
       geom_boxplot(fill = "#4271AE",       # Box color
                    outlier.colour = "red", # Outliers color
                    alpha = 0.9) +          # Box color transparency
       ggtitle("Boxplot with vector") + # Plot title
       xlab("") +   # X-axis label
       coord_flip() # Horizontal boxplot
Создайте блокплот в R с помощью stat_boxplot и geom_boxplot

Блокплот в ggplot2 из фрейма данных

Наконец, для создания блокплот ggplot2с фреймом данных, таким как treesdataset, вам нужно будет сложить данные с stackпомощью функции:

# Boxplot from dataframe
ggplot(data = stack(trees), aes(x = ind, y = values)) +
       stat_boxplot(geom = "errorbar", # Boxplot with error bars
                    width = 0.2) +
       geom_boxplot(fill = "#4271AE", colour = "#1F3552", # Colors
                    alpha = 0.9, outlier.colour = "red") +
       scale_y_continuous(name = "Weight") +  # Continuous variable label
       scale_x_discrete(name = "Feed") +      # Group label
       ggtitle("Boxplot from data frame ggplot2") + # Plot title
       theme(axis.line = element_line(colour = "black", # Theme customization
                                      size = 0.25))
блокплот из фрейма данных в ggplot2

2 ответа

  1. Спасибо, очень интересная и новая для меня информация по ящикам с усами ! Жду новые публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *