ggplot2:使用填充geom_bar指定颜色时缺少图例

Posted

技术标签:

【中文标题】ggplot2:使用填充geom_bar指定颜色时缺少图例【英文标题】:ggplot2: Missing legend when specify color using fill in geom_bar 【发布时间】:2018-12-21 23:31:52 【问题描述】:

在堆积条形图中,我试图指定不同条形的颜色。例如,治疗组的渐变绿色和对照组的渐变蓝色。但是,在指定颜色后,我丢失了图例。有没有办法把传说加回来?

# Create data set
ID<-c(rep(1:4, 6))
Group<-c(rep(0,4), rep(1,4), rep(0,4), rep(1,4), rep(0,4), rep(1,4))
Time<-c(rep("Time 1",8), rep("Time 2",8), rep("Time 3",8))
Response<-c(1,2,3,1,2,3,1,2,2,3,3,1,1,3,2,1,2,1,3,1,2,2,1,3)

data <- data.frame(ID, Group, Time, Response)
data$Response<-as.factor(data$Response)

library(dplyr)
data1<-as.data.frame(
  data %>% 
    group_by(Group, Time, Response) %>%                     
    summarise(N= n()))

# Define the color for control and treatment groups
trtCol <- c("#3182bd", "#9ecae1", "#deebf7")
conCol <- c("#31a354", "#a1d99b", "#e5f5e0")
Palette<-c(conCol, trtCol, conCol, trtCol, conCol, trtCol)

library(ggplot2)
library(scales)

# Specify color in ggplot using "geom_bar (fill=Palette)"
ggplot(data1, aes(Group, N, fill = Response))+ 
  geom_bar(position = "fill",stat = "identity", fill=Palette) + 
  facet_wrap(~Time, strip.position = "bottom") +
  labs(title="Distribution of Responses by Groups over Time", 
       x="Time Points", y="Percentage")+
  scale_y_continuous(labels = percent_format()) +
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5), 
        axis.text.x=element_blank(), axis.ticks.x=element_blank(), 
        panel.spacing = unit(0.1, "lines"))+
  geom_text(aes(x=0,y=-0.05,label="Control\nGroup"), size=3.5)+
  geom_text(aes(x=1,y=-0.05,label="Treatment\nGroup"), size=3.5)

当我为每个条形指定颜色时,图例消失了。

我想要的图表如上所示。有谁知道如何找回传说?治疗组一份,对照组一份。或者有没有办法手动添加图例?

【问题讨论】:

【参考方案1】:

我不是ggplot2 方面的专家,但我认为您丢失了图例,因为您使用参数分配fill=Palette 删除了geom_bar 中的美学映射。从本质上讲,您的fill 审美不仅仅是Response,而是ResponseGroup 的组合,因为每个组对于相同的响应都有不同的颜色(这可能是一个有问题的做法,但这不是由我决定)。

我认为这段代码可以满足您的需求。我在data1 中添加了一个helper 字段,以便拥有正确的fill 美学。注意我需要手动覆盖scale_fill_manual中的图例标签

library(dplyr)
data1<- as.data.frame(data %>% 
    group_by(Group, Time, Response) %>%                     
    summarise(N= n())) %>%
  mutate(helper = as.character(group_indices(., Group, Response)))

# Define the color for control and treatment groups
trtCol <- c("#deebf7", "#9ecae1","#3182bd")
conCol <- c("#e5f5e0", "#a1d99b", "#31a354")
Palette<-c(conCol, trtCol, conCol, trtCol, conCol, trtCol)

library(ggplot2)
library(scales)

# Specify color in ggplot using "geom_bar (fill=Palette)"
ggplot(data1, aes(Group, N, fill = helper)) + 
  facet_wrap(~Time, strip.position = "bottom") +
  labs(title="Distribution of Responses by Groups over Time", x="Time Points", y="Percentage") +
  scale_fill_manual(name = "Response", values = Palette, labels = c(1, 2, 3, 1, 2, 3)) +
  geom_bar(position = "fill",stat = "identity") + 
  scale_y_continuous(labels = percent_format()) + 
  theme_classic() +
  theme(plot.title = element_text(hjust = 0.5), axis.text.x=element_blank(), axis.ticks.x=element_blank(), 
        panel.spacing = unit(0.1, "lines"))+
  geom_text(aes(x=0,y=-0.05,label="Control\nGroup"), size=3.5)+
  geom_text(aes(x=1,y=-0.05,label="Treatment\nGroup"), size=3.5)

【讨论】:

有效!!!太感谢了!问题是在“aes”中,我应该将“fill”指定为组和响应的组合。我错过了这个小组,所以传说就消失了。【参考方案2】:

我使用了 Zack 建议的代码,并在其中添加了“guides(fill=guide_legend(ncol=2))”。这是我得到的图表

Revised graph

【讨论】:

以上是关于ggplot2:使用填充geom_bar指定颜色时缺少图例的主要内容,如果未能解决你的问题,请参考以下文章

ggplot2:geom_bar 与组,position_dodge 和填充

在barplot ggplot2中个性化每个面上的填充颜色

画图笔记:ggplot2优化柱形图(添加误差线、差异比较分析)

scale_fill_manual 在 geom_bar 中不起作用

ggplot2:geom_ribbon 的填充颜色行为

ggplot2之颜色设置