Изменить перекрывающуюся ширину geom_boxplot, чтобы охватить весь диапазон x, используемый для расчетов - PullRequest
0 голосов
/ 07 июня 2018

Я хотел бы создать график ggplot, где блокпосты находятся на том же графике, что и точки, используемые для их расчета.

Точки представляют собой данные подсчета, и цель блокпоста состоит в том, чтобы показать, как изменяется распределение этих точек, когда для их расчета используются разные таймфреймы от настоящих.Я хотел бы получить так, чтобы у всех коробочных графиков были правые края, выровненные с последней датой, и ширина, которая расширяет левую часть боксплотов до первого рассматриваемого года.

Я включил данные в график ниже.Я попытался включить varwidth=T, но указание ширины в эстетике не распознается как переменное или статическое число и не оказывает влияния вне эстетики.

Буду признателен за любые советы, если это возможно и как этого достичь.

library(ggplot2)
library(dplyr)
library(tidyr)

CUTS <- structure(list(`Years to Consider` = c(3, 5, 9, 18, 27), 
    Year = c(2014,2012, 2008, 1999, 1990)), 
    row.names = c(NA, -5L), class = "data.frame")  

data <- structure(list(
  Year = c(1978, 1979, 1980, 1982, 1983, 1984, 1985,1986, 1987, 1988, 
           1989, 1990, 1991, 1992, 1994, 1995, 1996, 1997,1998, 1999, 
           2000, 2001, 2002, 2003, 2007, 2009, 2010, 2012, 2014,2017),
  Total = c(110, 262, 240, 711, 710, 775, 985, 929, 933,670, 1162, 
            1215, 1408, 1194, 1136, 1321, 1327, 1689, 2121, 1754, 
            2167, 2051, 2862, 2861, 1784, 2093, 1367, 1003, 685, 451), 
  Lambda = c(NA, 2.38181818181818, 0.916030534351145, 1.72119144780585, 
             0.9985935302391, 1.09154929577465, 1.27096774193548, 
             0.943147208121827, 1.0043057050592, 0.718113612004287, 
             1.73432835820896, 1.04561101549053, 1.15884773662551,
             0.848011363636364, 0.975409547623274, 1.16285211267606, 
             1.00454201362604,1.27279577995479, 1.25577264653641, 
             0.826968411126827, 1.23546180159635,0.946469773880941, 
             1.3954168698196, 0.999650593990217, 0.888626474900967,
             1.08314647117872, 0.653129479216436, 0.856576606076504, 
             0.826408583305086,0.869952065260471)), 
  class = "data.frame", row.names = c(NA,-30L))

####data for entire period
BOX_DATA <-data %>%  mutate(LAMB_YEARS=last(Year)-first(Year), FIRST_YEAR=first(Year))

###select all data with year greater than cutoffs in CUTS data frame up to last year, 
###assign variable for number of years conisdered, bind to enitre period
for(i in CUTS$Year){
  temp_box <- data %>% filter(Year>=i) %>% select(Year, Total,Lambda) %>% 
    mutate(LAMB_YEARS=2017-i, FIRST_YEAR=i)
  BOX_DATA <- rbind(BOX_DATA, temp_box)      
}
####make lamb years factor for boxplot grouping define order so largest draw on bottom
BOX_DATA$LAMB_YEARS <- factor(BOX_DATA$LAMB_YEARS, levels=c(39,27,18,9,5,3))

####make graph
ggplot(data, aes(Year, Lambda)) + 
   geom_point() + 
   geom_boxplot(data=BOX_DATA, aes(fill=LAMB_YEARS), alpha=.3)

enter image description here

1 Ответ

0 голосов
/ 07 июня 2018

Вы ищете что-то подобное?

plot

Код ниже, полученный путем вычисления значений коробчатого графика вручную и построения их с использованием geom_rect() &geom_segment(), потому что параметр ширины geom_boxplot() на самом деле не предназначен для этого.

Хотя я не уверен, что это эффективный способ визуализации данных.Если вы используете это, чтобы донести мысль до аудитории, вы, вероятно, захотите потратить некоторое время на объяснение того, как ее следует интерпретировать.

BOX_DATA2 <- BOX_DATA %>%
  filter(!is.na(Lambda)) %>%
  group_by(LAMB_YEARS) %>%
  summarise(xmin = min(Year),
            xmax = max(Year),

            y.q25 = quantile(Lambda, 0.25),
            y.q50 = quantile(Lambda, 0.5),
            y.q75 = quantile(Lambda, 0.75),

            ymin = min(Lambda[Lambda >= y.q25 - 1.5 * IQR(Lambda)]), 
            ymax = max(Lambda[Lambda <= y.q75 + 1.5 * IQR(Lambda)])) %>%
  ungroup()

ggplot() + 
  geom_point(data = data, aes(Year, Lambda)) +
  geom_rect(data = BOX_DATA2,                # create box for box plot
            aes(xmin = xmin, xmax = xmax,
                ymin = y.q25, ymax = y.q75,
                fill = LAMB_YEARS), 
            alpha = 0.3, color = "black") +
  geom_segment(data = BOX_DATA2,             # add median line
               aes(x = xmin, xend = xmax,
                   y = y.q50, yend = y.q50)) +
  geom_segment(data = BOX_DATA2,             # add whiskers
               aes(x = (xmin + xmax) / 2, xend = (xmin + xmax) / 2,
                   y = ymin, yend = ymax))
...