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

Выброс — это то наблюдение, которое очень далеко от остальных данных. Точка данных называется выбросом, если она больше Q3 + 1,5 Q_3⋅I 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)

Обратите внимание, что boxplot скрывает базовое распределение данных. Чтобы решить эту проблему, вы можете добавить точки в boxplot в R с stripchart помощью функции (искаженные точки данных позволят избежать перекрытия выбросов) следующим образом:
stripchart(x, method = "jitter", pch = 19, add = TRUE, col = "blue")

Начиная с версии 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)))

Вы можете складывать столбцы фрейма данных с 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))

Если вы хотите заказать boxplot с другой метрикой, просто измените medianна ту, которую вы предпочитаете.
Настройка Boxplot
Boxplot можно полностью настроить для получения хорошего результата. В следующем блоке кода мы покажем широкий пример того, как настроить прямоугольную диаграмму R и как добавить сетку. Обратите внимание, что для настройки boxplot используется даже больше аргументов, чем в следующем примере, например boxlty, , boxlwd, medltyили 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))

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

Блокплот в 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))

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