Как построить график доступности переменной по годам?

year <- c(2000:2014)
group <- c("A","A","A","A","A","A","A","A","A","A","A","A","A","A","A",
         "B","B","B","B","B","B","B","B","B","B","B","B","B","B","B",
         "C","C","C","C","C","C","C","C","C","C","C","C","C","C","C")
value <- sample(1:5, 45, replace=TRUE)

df <- data.frame(year,group,value)
df$value[df$value==1] <- NA

   year group value
1  2000     A    NA
2  2001     A     2
3  2002     A     2
...
11 2010     A     2
12 2011     A     3
13 2012     A     5
14 2013     A    NA
15 2014     A     3
16 2000     B     2
17 2001     B     3
...
26 2010     B    NA
27 2011     B     5
28 2012     B     4
29 2013     B     3
30 2014     B     5
31 2000     C     5
32 2001     C     4
33 2002     C     3
34 2003     C     4
...
44 2013     C     5
45 2014     C     3

Выше приведен образец данных для моего вопроса. Каждая группа (A, B или C) имеет значение с 2000 по 2014 год, но в некоторые годы значение может отсутствовать для некоторых групп.

График, который я хотел бы построить, выглядит следующим образом:

ось абсцисс - год

ось y — это группа (т. е. A, B и C должны отображаться в y-lab)

полоса или линия представляют доступность значения каждой группы

Если значение равно NA, то полоса не будет отображаться в этот момент времени. ggplot2 предпочтительнее, если это возможно.

Кто-нибудь может помочь? Спасибо.

Я думаю, что мое описание сбивает с толку. Я ожидаю график, как показано ниже, НО по оси x будет год. А полоса или линия представляют доступность значения для данной группы в течение года.

В образце данных группы A мы имеем

2012 A 5
2013 A NA
2014 A 3

Тогда в точке группы А в 2013 году ничего не должно быть, и тогда в точке группы А в 2014 году будет стоять точка.

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


person cyrusjan    schedule 16.10.2015    source источник
comment
Пожалуйста, не используйте df <- as.data.frame(cbind(year,group,value)). Все принуждается к character из-за cbind. Пожалуйста, используйте df <- data.frame(year, group, value).   -  person    schedule 16.10.2015
comment
понятно, спасибо, что напомнили   -  person cyrusjan    schedule 16.10.2015
comment
Попробуйте ggplot(df)+ geom_bar(aes(x=year, y=value, fill=group), position='dodge', stat='identity')   -  person akrun    schedule 16.10.2015
comment
Спасибо, akrun, но это не тот, кого я хочу. значение не имеет значения. Я хочу показать, в каком году каждая группа имеет доступную стоимость.   -  person cyrusjan    schedule 16.10.2015
comment
Извините, не уверен, что понимаю   -  person akrun    schedule 16.10.2015


Ответы (1)


Вы можете использовать geom_errorbar без диапазона (geom_errorbarh для горизонтального). Затем просто подмножество для complete.cases (или !is.na(df$value))

library(ggplot2)

set.seed(10)

year <- c(2000:2014)
group <- c("A","A","A","A","A","A","A","A","A","A","A","A","A","A","A",
       "B","B","B","B","B","B","B","B","B","B","B","B","B","B","B",
       "C","C","C","C","C","C","C","C","C","C","C","C","C","C","C")
value <- sample(1:5, 45, replace=TRUE)

df <- data.frame(year,group,value)
df$value[df$value==1] <- NA

no_na_df <- df[complete.cases(df), ]

ggplot(no_na_df, aes(x=year, y = group)) + 
    geom_errorbarh(aes(xmax = year, xmin = year), size = 2)

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

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

df$group_n <- as.numeric(df$group)

no_na_df <- df[complete.cases(df), ]

ggplot(no_na_df, aes(xmin=year-0.5, xmax=year+0.5, y = group_n)) + 
    geom_rect(aes(ymin = group_n-0.1, ymax = group_n+0.1)) +
    scale_y_discrete(limits = levels(df$group))

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

person JohannesNE    schedule 16.10.2015
comment
Спасибо. Я думаю, что мое описание сбивает с толку, и я отредактировал свой вопрос для уточнения. - person cyrusjan; 16.10.2015
comment
Общая идея верна, но вместо строк вы хотите столбцы с разрывами, где отсутствуют данные? Иначе я все еще не понимаю. - person JohannesNE; 16.10.2015
comment
Я бы сказал, что общая идея верна. На вашем графике доступные точки данных представлены в виде сегментов линии. Но представьте, что вы представляете их в виде точек и соединяете эти точки в одной группе. - person cyrusjan; 16.10.2015
comment
Строки, вероятно, потребуют группировки всех последовательных лет без перерыва. Это возможно, но требует некоторой подготовки данных. Однако сделать псевдобарплот довольно просто. Смотрите мою правку. - person JohannesNE; 16.10.2015