Фасетные / отдельные прямоугольники в R, когда используется формула, а выбросы не нарисованы? (основы ggplot2 или r) - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть фрейм данных, который называется samples_type :

Status   variable        value
PAT       SPP1        1,994629e+00
PAT       SPP1        1,179033e+00
PAT       SPP1        2,901539e+00
PAT       SPP1        1,140857e+00
PAT       SPP1        1,467056e+00
PAT       SPP1        2,579037e+00

Столбец «Состояние» может принимать два значения: PAT или CON. Столбец «переменная» может принимать много значений: SPP1, CCL24, ENG56 ...

Я хотел бы составить блок-таблицы значений для каждой комбинации статуса: переменная.

На данный момент у меня есть два кода:

boxplot(value ~ Status:variable, data=samples_type,
col=c("red", "limegreen"), las=2, outline=F)

и

p0 <- ggplot(data = samples_J0_type, aes(x=variable, y=value)) +
geom_boxplot(aes(fill=Status)) +
facet_wrap( ~ variable, scales="free")

Первый код дает мне все коробки в ОДНОМ ГРАФЕ без выбросов. Я хочу разделить их как par (mfrow = c (..., ...)) . Как я могу это сделать?

Со вторым кодом я использовал ggplot2. Мне удалось разделить боксы НО , как вы можете видеть, мне не удалось удалить выбросы, и мои боксы слишком малы из-за выбросов. Как я могу удалить выбросы? Я проверял на StackOverFlow, как удалять выбросы с помощью ggplot2, я нашел ответ только для ОДНОГО БЛОКА, но не для нескольких. И я понятия не имею, как это сделать ...

РЕДАКТИРОВАТЬ: боксы каждого кода

Boxplot with the first code Boxplot with the second code

Ответы [ 2 ]

3 голосов
/ 09 апреля 2019

Общее

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

mt <- mtcars %>% select(cyl, mpg, am)
## add some outliers
mt <- rbind(mt, data.frame(cyl = c(4, 6, 8), mpg = rep(100, 3), am = 0))

База R

Вы можете разделить ваши данные в соответствии с одной из ваших переменных, соответственно установить mfrow и использовать функцию apply для генерации каждого графика отдельно:

## split your data according to one variable
dl <- split(mt, mt$am)

## set the mfrow
par(mfrow = 1:2)
## something more educated would be something like this
## needs to be adapted for border cases
## par(mfrow = c(ceiling(sqrt(length(dl))), ceiling(sqrt(length(dl)))))

## loop through all data sets
lapply(dl, function(d) boxplot(mpg ~ cyl, data = d, outline = FALSE))

Boxplot

Однако boxplot(. outliers = TRUE) на самом деле не удаляет ваши выбросы, а вместо этого расширяет ваши усы.

ggplot

По второму вопросу вы можете сначала скрыть свои выбросы с помощью

geom_boxplot(aes(fill = Status), outlier.shape = NA)

, а затем отрегулируйте диапазон y с помощью ylim в зависимости от ваших данных.

Примечание . Технически, вам не нужно использовать outlier.shape = NA, потому что если вы используете ylim, точки, находящиеся за пределами диапазона, будут в любом случае отброшены, но это делает код немного более многословным, чтобы показать, что вы хотите сделать.

Пример с набором встроенных данных

library(tidyverse)

## plot w/ outliers shown
ggplot(mt, aes(x = factor(cyl), y = mpg)) + 
   geom_boxplot() + 
   facet_wrap(~am)

## plot with outliers removed
ggplot(mt, aes(x = factor(cyl), y = mpg)) + 
   geom_boxplot(outlier.shape = NA) + 
   facet_wrap(~am) + 
   ylim(c(0, 50))

Протест

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

0 голосов
/ 09 апреля 2019

Спасибо @thothal, я выкладываю окончательный код, который работает:

dl = split(samples_type, samples_type$variable)
par(mfrow = c(ceiling(sqrt(length(dl))),ceiling(sqrt(length(dl)))))
iwalk(dl, ~ boxplot(value ~ Status , data = .x,
      outline = FALSE,col=c("red", "limegreen"), main=.y))

"iwalk" из пакета "purrr".

Чтобы запомнить, заголовок фрейма данных samples_type :

Status   variable        value
PAT       SPP1        1,994629e+00
PAT       SPP1        1,179033e+00
PAT       SPP1        2,901539e+00
PAT       SPP1        1,140857e+00
PAT       SPP1        1,467056e+00
PAT       SPP1        2,579037e+00

Столбец «Состояние» может принимать два значения: PAT или CON.Столбец «переменная» может принимать много значений: SPP1, CCL24, ENG56 ...

...