如何从stat_summary中添加图例并从主图中删除图例?

问题描述 投票:0回答:1

我想按两组即产品和开始日期来绘制df1的值,并绘制一个包含df1(蓝色)和df2(红色)平均值的交叉条,如附图所示。

df1 <- data.frame(product = c("A","A","A","A","A","A","A","B","B","B","B","B","B","B","C","C","C","C","C","C","C","D","D","D","D","D","D","D"), 
                  start_date =as.Date(c('2020-02-01', '2020-02-02', '2020-02-03', '2020-02-04', '2020-02-05', '2020-02-06', '2020-02-07')),
                  value = c(15.71,17.37,19.93,14.28,15.85,10.5,8.58,5.62,5.19,5.44,4.6,7.04,6.29,3.3,20.35,27.92,23.07,12.83,22.28,21.32,31.46,34.82,23.68,29.11,14.48,25.2,16.91,27.79))

df2 <- data.frame(product = c("A","A","A","A","A","A","B","B","B","B","B","B","C","C","C","C","C","C","D","D","D","D","D","D"), 
                  start_date =as.Date(c('2019-07-09', '2019-07-10', '2019-07-11', '2019-07-12', '2019-07-13', '2019-07-14')),
                  value = c(9.06,10.74,14.64,7.67,8.72,11.21,4.76,4.53,3.81,4.32,3.95,5.2,20.36,21.17,19.51,16.25,17.93,16.94,14.51,14.65,23.28,10.84,16.71,12.48))

图形

graph1 <- ggplot(df1, aes(
    y = value, x = product, fill = product, color = factor(start_date))) +
  geom_col(data = df1, stat = "identity",position = position_dodge(width = 0.8), width = 0.7, inherit.aes = TRUE, size = 0) + 
  xlab("Product") + ylab("Values")  + ylim(c(0,40)) + 
  scale_fill_manual(values=c("#008FCC", "#FFAA00", "#E60076", "#B00000")) +
  stat_summary(data = df1, aes(x = factor(product),y = value),fun = "mean",geom = "crossbar", color = "blue", size = 1, width = 0.8, inherit.aes = FALSE) +
  stat_summary(data = df2, aes(x = factor(product),y = value),fun = "mean",geom = "crossbar", color = "red", size = 1, width = 0.8, inherit.aes = FALSE) 

有什么办法可以去掉柱状图的边框,并在图的右上角添加两根横杠的图例?enter image description here

另外,我想知道是否有办法将df1中的 "日期 "添加到图中每个条形图的下方?

r ggplot2 rstudio geom-col
1个回答
2
投票

你关于调整剧情的问题有多个部分。 总结一下几点。

  • 改变从... color=factor(start_date)group= 去掉条形图周围的颜色,但保持每个条形图的start_date分隔。

  • 使用 theme(legend.position=... 并指定地块区域内图例的精确位置。 使用 theme(legend.direction='horizontal') 适当的时候也可以。

  • 增加 color= 的属性,进入 stat_summary(geom='crossbar'...) 调用,以便将它们都 "添加 "到图例中,然后使用 scale_color_manual 来指定颜色,如果你不喜欢默认的颜色。

  • 小建议。 使用 ylim(X,Y) 而不是 ylim(c(X,Y)). 不需要把极限放到一个矢量中,因为 ylim 可以接受,反而更简单。 请注意,无论哪种方式都还是可以的,所以这一点是次要的。

  • 你不需要 data=df1 首次 stat_summary 调用,因为它是基于 data= 中设定的值 ggplot(.... 你还需要 y= 值,不过,因为它是必需的。

下面是实现上面注释的调整后的代码。

ggplot(df1, aes(y = value, x = product, fill = product, group = factor(start_date))) +
    geom_col(data = df1, position = position_dodge(width = 0.8),
        width = 0.7, inherit.aes = TRUE, size = 0) +
    xlab("Product") + ylab("Values") + ylim(0,60) +
    scale_fill_manual(values=c("#008FCC", "#FFAA00", "#E60076", "#B00000")) +
    stat_summary(aes(x = factor(product), y=value, color='mean1'),
        fun = "mean", geom = "crossbar",
        size = 1, width = 0.8, inherit.aes = FALSE) +
    stat_summary(data = df2, aes(x = factor(product),y=value, color='mean2'),
        fun = "mean", geom = "crossbar",
        size = 1, width = 0.8, inherit.aes = FALSE) +
    theme(legend.position=c(0.75,0.8), legend.direction = 'horizontal') +
    scale_color_manual(values=c('blue', 'red'))

enter image description here

解释: 将其改为 group=factor(start_date) 是为了让你保持不同产品之间的条块分割--这个概念被称为 "躲避"。 由于您最初的调用是 color= 是在 aes(它创建了一个传说项目和 geom_col 用来躲避,因为其他的美学已经被映射到了。xyfill= 美学正在应用。 如果你删除 color=您可以为每个产品获得一条杠。 即使您指定了 position='dodge', geom_col 不会躲避它们,因为没有关于如何做的信息。 这就是为什么你包括 group= 审美--给 geom_col 应该如何躲避的信息。

你用 aes(... 示意 ggplot 哪些传说要创造。 如果美学被映射到 xy,它只是用在策划上。 group= 美学用于闪避和其他群体属性,但基本上其他任何美学(size, shape, color, fill, linetype......等等等等)用来创建图例。 如果我们同时指定 stat_summary 呼吁包括一个 color 审美,将创建一个组合的图例。 这里的问题是,数据集中没有一列(因为你有两列)用于映射到颜色,所以我们通过命名一个字符("mean1 "和 "mean2")来创建一个。

最后一点:如果你结合你的数据集,可能会更容易绘制。 你可能还是想说明它们的来源,所以像这样的工作。

df1$origin_df <- 'df1'
df2$origin_df <- 'df2'
df <- rbind(df1, df2)

然后用 df 而不是 df1. 然后你可以使用一个 stat_summary 调用 color=origin_df.

热门问题
推荐问题
最新问题