如何根据年份绘制变量的可用性?

时间:2015-10-16 04:26:42

标签: r plot bar-chart availability

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年,但在某些年份,某些组的价值可能会丢失。

我想绘制的图表如下:

x轴是年

y轴是基团(即A,B&amp; C应该在y-lab上显示)

条形或线条代表每个组的价值可用性

如果值为NA,则条形码不会在该时间点显示。 如果可能的话,首选ggplot2。

有人可以帮忙吗? 谢谢。

我认为我的描述令人困惑。我期待下面的图表,但x轴将是年份。条形图或折线表示全年特定组的价值可用性。

在A组的样本数据框中,我们有

2012 A 5
2013 A NA
2014 A 3

然后在2013年的A组应该没什么,然后在2014年A组的点上会出现一个点。

enter image description here

1 个答案:

答案 0 :(得分: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)

enter image description here

修改 为了得到一个有价值的酒吧,你可以使用这种略显缺乏吸引力的方法。有必要对组数据进行数值表示,以给条形宽度。此后,我们可以使比例再次代表变量。

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))

enter image description here