使用图层为 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)
我正在寻找一种方法来控制条形图中各部分的颜色,以便在绘制数据子集时它们是稳定的。 我见过这个解决方案: 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)