使用图层为 ggplot2 条形图分配稳定的颜色

Assigning stable colors to ggplot2 bar plot with a layer

我正在寻找一种方法来控制条形图中各部分的颜色,以便在绘制数据子集时它们是稳定的。 我见过这个解决方案: How to assign colors to categorical variables in ggplot2 that have stable mapping?

这看起来很有希望,但我似乎无法将其应用到我的数据中。我怀疑这与我使用的图层有关。

我生成绘图的代码是:

   plot = ggplot(subdata,mapping = aes(x = as.factor(group))) +
        layer(geom = "bar", mapping = aes(fill = as.factor(NUM_MOTIFS)))

我可以获得完整数据集的级别,但是当我尝试将其添加到图中时,我不断收到此错误:

  Error: Aesthetics must either be length one, or the same length as the dataProblems:as.factor(NUM_MOTIFS)

无论我把它放在哪里... 有什么想法吗?

编辑: 示例数据:

fulldata = data.frame(group = rep("A",10), NUM_MOTIFS = c(0,0,1,1,1,2,2,2,4,5))
subdata = data.frame(group = rep("B",8), NUM_MOTIFS = c(0,0,1,1,2,2,2,2))

非常感谢!

我想这就是你需要的:

#dummy data
fulldata = data.frame(group = rep("A",10), NUM_MOTIFS = c(0,0,1,1,1,2,2,2,4,5))
subdata = data.frame(group = rep("B",8), NUM_MOTIFS = c(0,0,1,1,2,2,2,2))

#merge full and subset data for plotting
df <- rbind(fulldata,subdata)
df$NUM_MOTIFS <- as.factor(df$NUM_MOTIFS)

#plot
ggplot(df,aes(group,fill=NUM_MOTIFS)) + geom_bar()

我认为这会成功。请注意,您可以为 'cbbPalette' (some examples) 选择其他值。

fulldata = data.frame(group = rep("A",10), NUM_MOTIFS = c(0,0,1,1,1,2,2,2,4,5))
subdata = data.frame(group = rep("B",8), NUM_MOTIFS = c(0,0,1,1,2,2,2,2))
fulldata$NUM_MOTIFS=as.factor(as.character(fulldata$NUM_MOTIFS))
subdata$NUM_MOTIFS=as.factor(as.character(subdata$NUM_MOTIFS))

levels(subdata$NUM_MOTIFS)=levels(fulldata$NUM_MOTIFS)

cbbPalette <- c("#000000", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7")

ggplot(subdata,mapping = aes(x = as.factor(group),fill=NUM_MOTIFS)) +geom_bar()+
  scale_fill_manual(values=cbbPalette)


ggplot(fulldata,mapping = aes(x = as.factor(group),fill=NUM_MOTIFS)) +geom_bar()+
  scale_fill_manual(values=cbbPalette)