使用带分类变量的geom_rect来阴影ggplot图表的背景

时间:2018-05-14 22:31:12

标签: r ggplot2

这是我的数据集示例:

df <- data.frame(group = rep(c("group1","group2","group3", "group4", "group5", "group6"), each=3),
                 X = paste(letters[1:18]),
                 Y = c(1:18))

如您所见,有三个变量,其中两个是分类的(groupX)。我使用ggplot2构建了折线图,其中X轴为X,Y轴为Y

我想使用group变量为背景添加阴影,因此必须出现6种不同的颜色。

我试过这段代码:

ggplot(df, aes(x = X, y = Y)) +
  geom_rect(xmin = 0, xmax = 3, ymin = -0.5, ymax = Inf,
            fill = 'blue', alpha = 0.05) +
  geom_point(size = 2.5)

geom_rect()仅在X轴上为03之间的区域着色。

我想我可以通过复制geom_rect()这么多次来手动完成。但我确信必须有一个更漂亮的代码使用变量本身。有什么想法吗?

3 个答案:

答案 0 :(得分:5)

要获得整个图表的着色,geom_rect需要所有矩形的xminxmax位置,因此需要通过映射xmin和{xmax来提供这些位置。 {1}}到数据中的列,而不是对它们进行硬编码。

ggplot(df, aes(x = X, y = Y)) +
  geom_rect(aes(xmin = X, xmax = dplyr::lead(X), ymin = -0.5, ymax = Inf, fill = group), 
            alpha = 0.5) +
  geom_point(size = 2.5) +
  theme_classic()

enter image description here

答案 1 :(得分:1)

这会让你接近 - 需要在数据框中添加几列。在这里使用dplyr。

df <- df %>%
  group_by(group) %>%
  mutate(xmin = sort(X)[1],
         xmax = sort(X, decreasing = T)[1])

ggplot(df, aes(x = X, y = Y)) +
  geom_point(size = 2.5) + 
  geom_rect(aes(xmin=xmin, xmax = xmax, fill = group), ymin = -0.5, ymax = Inf,
            alpha = 0.05) 

答案 2 :(得分:0)

这是一种方式:

df2 <- df %>% mutate(Xn=as.numeric(X))

ggplot(df2) +
  geom_rect(aes(xmin=Xn-.5, xmax=Xn+.5, ymin=-Inf, ymax=Inf, fill = group), alpha=0.5, stat="identity") +
  geom_point(aes(x = Xn, y = Y), size = 2.5) + scale_x_continuous(breaks=df2$Xn, labels=df2$X)

enter image description here