ggplot2 - 用两种颜色分隔条形图

时间:2016-03-05 22:01:12

标签: r colors ggplot2

我每年都获得有关频率的数据。我用ggplot2描绘了这些数据(x年; y - 频率)。现在我想通过将1980年下面的所有条形图用红色和所有条形图等于或高于1980绿色来分隔条形图。我怎么能这样做 - 下面是我的MWE试图用scale_fill_manual设置这些边界,因为我没有正确地执行它而无效。

数据

dput(allePubs2)
structure(list(Jahr = 1922:2015, Publikationen = c(1L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 
0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 2L, 0L, 0L, 0L, 1L, 0L, 1L, 4L, 
2L, 3L, 2L, 2L, 4L, 1L, 4L, 1L, 3L, 6L, 1L, 2L, 2L, 3L, 1L, 2L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 12L, 4L, 5L, 14L, 9L, 6L, 5L, 7L, 
5L, 6L, 4L, 7L, 3L, 7L, 6L, 7L, 8L, 6L, 4L, 14L)), .Names = c("Jahr", 
"Publikationen"), row.names = c(NA, -94L), class = "data.frame")

MWE尝试

cutoff80 <- 
  ggplot(data=allePubs2, aes(x=Jahr, y=Publikationen)) +
  geom_bar(stat="identity", width = 0.5)+
  scale_y_continuous(name="Anzahl Publikationen", breaks = 0:14, limits = c(0, 15))+
  scale_x_continuous(name="Jahr", breaks = c(1920, 1925, 1930, 1935, 1940, 1945, 1950, 1955, 1960, 1965, 1970, 1975, 
                                             1980, 1985, 1990, 1995, 2000, 2005, 2010, 2015), 
                     limits = c(1920, 2016))+
  ggtitle("Cut-Off bei 1980")+
  theme_hc() +
  geom_vline(xintercept = 1979.5)+ 
  scale_fill_manual(breaks = c("1922", "1979","1980","2016"), 
                  values=c("red", "red", "green", "green"))
cutoff80

1 个答案:

答案 0 :(得分:1)

您可以在数据框中添加一个可用于控制条形颜色的变量:

allePubs2$before1980 <- factor(allePubs2$Jahr < 1980,
                           levels = c(TRUE, FALSE),
                           labels = c("vor 1980", "nach 1980"))

在这里,我使用factor将逻辑变量转换为因子。标签稍后将在图例中使用,因此在此适当选择它们非常重要。

现在,您可以将before1980映射到颜色,就像将Jahr映射到x坐标一样:

library(ggplot2)
ggplot(data=allePubs2, aes(x=Jahr, y=Publikationen, fill = before1980)) +
  geom_bar(stat="identity", width = 0.5)+
  scale_y_continuous(name="Anzahl Publikationen", breaks = 0:14, limits = c(0, 15))+
  scale_x_continuous(name="Jahr", breaks = seq(1920, 2015, by = 5), 
                     limits = c(1920, 2016))+
  ggtitle("Cut-Off bei 1980")+
  geom_vline(xintercept = 1979.5)+ 
  scale_fill_manual(name = "", values = c("vor 1980" = "red", "nach 1980" = "green"))

enter image description here

我还定义了一个手动刻度,确保颜色与您希望的颜色一致。请注意如何将某个值与"vor 1980" = "red"的颜色相关联。 name参数可用于设置图例的标题,我已根据您的要求将其设置为空。

我还使用scale_y_continuous()简化了seq的中断并删除了theme_hc(),因为我不知道该函数的来源。