Существует ли способ отображать точки для отдельных данных на ящичковом графике только в том случае, если они выше/ниже определенного диапазона?

Вопрос или проблема

Я хотел бы создать коробчатую диаграмму для моих данных, где сама диаграмма представляет IQR, а усики представляют значения от 5-го до 95-го процентов. Я хочу использовать geom_dotplot, чтобы показать только отдельные данные, которые находятся выше или ниже усиков (т.е. ниже 5-го процента или выше 95-го процента). Есть ли способ сделать это с использованием ggplot в R?

что у меня сейчас

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

Вы можете установить значения усиков и оснований на любые, которые вам нравятся, используя stat = "identity" внутри geom_boxplot. Просто используйте quantile, чтобы заранее вычислить нужные значения. Отфильтруйте набор данных, чтобы создать второй маленький фрейм данных для точек.

Вы не предоставили воспроизводимый пример, поэтому я предполагаю, что ваш фрейм данных имеет столбцы с именами “x” и “y”. Вот воспроизводимый набор данных для демонстрации:

set.seed(1)
df <- data.frame(x = c("A", "B"), y = rnorm(100, 4.5, 2))

Теперь мы можем сделать:

library(tidyverse)

box <- df %>%
  group_by(x) %>%
  summarise(mn = quantile(y, 0.05), 
            low = quantile(y, 0.25),
            mid = median(y),
            up = quantile(y, 0.75),
            mx = quantile(y, 0.95))

points <- df %>%
  group_by(x) %>%
  mutate(lo = quantile(y, 0.05), hi = quantile(y, 0.95)) %>%
  filter(y < lo | y > hi)
  
ggplot(box, aes(x, fill = x)) +
  geom_boxplot(aes(ymin = mn, lower = low, middle = mid, upper = up, ymax = mx),
               stat = "identity", width = 0.5) +
  geom_point(aes(y = y), data = points) +
  scale_fill_manual(values = c("gray90", "gray75"), guide = "none") +
  theme_classic(20)

введите описание изображения здесь

Ответ или решение

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

Шаг 1: Подготовка данных

Для начала давайте создадим пример набора данных. В данном случае мы создадим фрейм данных с двумя столбцами: x (группы) и y (значения).

set.seed(1)
df <- data.frame(x = c("A", "B"), y = rnorm(100, 4.5, 2))

Шаг 2: Вычисление квартилей и создание отдельного фрейма для точек

Сначала необходимо определить значения, которые вам нужны для боксплота. Для этого мы будем вычислять 5%, 25%, 50%, 75%, и 95% квартиль. Мы также создадим отдельный датасет для точек, которые находятся вне установленных усов (т.е. ниже 5% и выше 95%).

library(dplyr)

# Подсчет квартилей
box <- df %>%
  group_by(x) %>%
  summarise(
    mn = quantile(y, 0.05), 
    low = quantile(y, 0.25),
    mid = median(y),
    up = quantile(y, 0.75),
    mx = quantile(y, 0.95)
  )

# Фильтрация точек, находящихся вне усов
points <- df %>%
  group_by(x) %>%
  mutate(lo = quantile(y, 0.05), hi = quantile(y, 0.95)) %>%
  filter(y < lo | y > hi)

Шаг 3: Визуализация с помощью ggplot2

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

library(ggplot2)

ggplot(box, aes(x, fill = x)) +
  geom_boxplot(aes(ymin = mn, lower = low, middle = mid, upper = up, ymax = mx),
               stat = "identity", width = 0.5) +
  geom_point(data = points, aes(y = y), color = "red") +  # Отображаем точки вне усов
  scale_fill_manual(values = c("gray90", "gray75"), guide = "none") +
  theme_classic(base_size = 20)

Объяснение кода:

  1. geom_boxplot(): Этот слой создает сам боксплот, используя заранее рассчитанные значения квартилей и персентилей.
  2. geom_point(): Этот слой добавляет точки из созданного фрейма points, который содержит только те значения, которые находятся вне установленных границ.
  3. scale_fill_manual(): Устанавливаем цвета для боксплота, чтобы сделать его визуально привлекательным.
  4. theme_classic(): Использование классической темы для улучшения визуальной четкости графика.

Заключение

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

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

Капча загружается...