2016-11-15 22 views
1

Я хотел бы нарисовать какой-то вид бокса, который показывает медиану моих данных. В отличие от обычного Box-Plot, я хотел бы расширить поле до минимального и максимального значения моих данных вместо квартилей. Пример:Настроить R Box-Plot

x <- c(1,3,5,7,9) 

Регулярное Boxplot х будет иметь следующие статистики:

  • 1: нижний Вискер
  • 3: нижний конец коробки
  • 5: средний
  • 7 : верхний конец ящика
  • 9: верхний укер

Я хотел бы получить:

  • 1: нижний конец коробки
  • 5: медиана
  • 9: верхний конец коробки

Любой, кто может мне помочь?

ответ

4

В ggplot вы можете явно контролировать эти отсечки, установив их при вызове.

ggplot() + 
    geom_boxplot(
    aes(x = 1 
     , lower = min(x) 
     , middle = median(x) 
     , upper = max(x) 
     , ymin = min(x) 
     , ymax = max(x)) 
    , stat = "identity" 
) 

enter image description here

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

iris %>% 
    group_by(Species) %>% 
    summarise(min = min(Petal.Length) 
      , max = max(Petal.Length) 
      , median = median(Petal.Length) 
      ) %>% 
    ggplot() + 
    geom_boxplot(
    aes(x = Species 
     , lower = min 
     , middle = median 
     , upper = max 
     , ymin = min 
     , ymax = max) 
    , stat = "identity" 
) 

enter image description here

Если вы хотите добавить «легенду» вы, возможно, придется сделать немного больше регулировки. Однако с cowplot относительно просто создать график, помеченный так, как вам хотелось бы, а затем использовать его в качестве легенды. Ниже я создаю тот же самый блокнот, что и выше (но сохраняю его в переменной) и создаю новый график, который будет служить легендой (при необходимости измените).

basePlot <- 
    iris %>% 
    group_by(Species) %>% 
    summarise(min = min(Petal.Length) 
      , max = max(Petal.Length) 
      , median = median(Petal.Length) 
) %>% 
    ggplot() + 
    geom_boxplot(
    aes(x = Species 
     , lower = min 
     , middle = median 
     , upper = max 
     , ymin = min 
     , ymax = max) 
    , stat = "identity" 
) 


legendPlot <- 
    data.frame(lower = 1, middle = 2, upper = 3) %>% 
    ggplot(
    aes(x = 1 
     , lower = lower 
     , middle = middle 
     , upper = upper 
     , ymin = lower 
     , ymax = middle 
    ) 
) + 
    # ggtitle("Legend") + 
    geom_boxplot(stat = "identity") + 
    scale_y_continuous(
    name = "" 
    , breaks = 1:3 
    , labels = c("Minimum", "Median", "Maximum") 
) + 
    scale_x_continuous("Legend", position = "top") + 
    theme(axis.text.x = element_blank() 
     , axis.title.x = element_text(face = "bold")) 

Тогда нагрузка cowplot (обратите внимание, что я переустановить тему, потому что cowplot автозагрузок свою собственную тему и я не заботиться о нем) и создать макет, используя plot_grid. Обратите внимание, что здесь я создаю два отдельных столбца, чтобы сделать легенду меньшей и вертикально центрированной. Вы можете поиграть с rel_widths и rel_heights, если хотите отрегулировать детали. (scale вариант тоже, но мне не понравилось, как он работал с rel_widths.)

library(cowplot) 
theme_set(theme_minimal()) 


plot_grid(
    basePlot 
    , plot_grid(
    ggplot() 
    , legendPlot 
    , ggplot() 
    , ncol = 1 
) 
    , rel_widths = c(1, 0.33) 
) 

дает

enter image description here

+0

Есть ли другой способ вычисления значения заранее, чем делать это с dplyr и%>%? Кажется, не работает для меня ... – ChrM

+0

Возможно. Вероятно, это отдельный вопрос, но 'by', скорее всего, заставит вас начать. Что значит «Кажется, не работает»? –

+0

Это прекрасно работает. Есть ли способ распечатать настроенное поле в полях и добавить некоторые аннотации в мин/медиана/макс. Поскольку это настраиваемая коробка, я хотел бы добавить некоторую информационную информацию, чтобы сделать ее понятной для других людей. – ChrM