Что такое блокплощадка в программировании на 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
с фреймом данных, таким как trees
dataset, вам нужно будет сложить данные с 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))
2 ответа
Спасибо, очень интересная и новая для меня информация по ящикам с усами ! Жду новые публикации
Очень интересно, спасибо огромное за старания!