如何在ggplot中为点配置两组不同的填充颜色?解决箭头形状点填充颜色与图例不一致的问题
解决点填充色与选择方向绑定的问题
要让箭头形状的点填充色和"Direction of selection"图例一致,同时保留条形图的个体填充色,核心是处理两个独立的fill映射(条形图对应个体,点对应选择方向),并调整形状的属性映射。下面是具体的解决方案:
1. 准备工作:加载必要的包
因为ggplot默认只能有一个fill比例尺,我们需要用ggnewscale包来创建第二个fill scale,用于点的填充色:
install.packages("ggnewscale") library(ggnewscale)
2. 调整数据的因子顺序(可选但推荐)
确保dir.selection的因子顺序和你的颜色、形状逻辑对应,比如让"Preferred"(向上箭头)、"-"(中性)、"Avoided"(向下箭头)按顺序排列:
my.dat$dir.selection <- factor(my.dat$dir.selection, levels = c("Preferred", "-", "Avoided")) # 对应调整颜色和形状的顺序 col.dir.sel <- c("#26AE61", "#2D3D50", "#E74D3C") # Preferred:绿, -:深灰, Avoided:红 shape.dir.sel <- c(24, 21, 25) # 24=上箭头,21=圆圈,25=下箭头
3. 修改绘图代码
关键变化是拆分fill映射,让条形图和点使用各自的fill scale:
text.size <- 14 my.dat %>% ggplot(aes(x = Habitat, y = indices)) + geom_hline(yintercept = 0)+ # 条形图:绑定fill到个体band.fct,使用Set1调色板 geom_bar(aes(fill = band.fct), position = "dodge", stat = "identity", width = .7, size = 2) + # 启动新的fill比例尺,用于点的填充色 new_scale_fill() + # 点:绑定fill、color、shape到选择方向dir.selection geom_point(position = position_dodge(width = .7), aes(x = Habitat, y = position.point, fill = dir.selection, col = dir.selection, shape = dir.selection), size = 6) + ylim(range(c(-1.2, my.dat$indices, 1.2))) + # 主题设置保留你的原有配置 theme(axis.line = element_line(linetype = "solid"), axis.ticks = element_line(colour = "black", size = 1), axis.title = element_text(size = text.size), axis.title.x=element_blank(), axis.text = element_text(size = text.size-2, colour = "black"), plot.title = element_text(size = text.size, hjust = 0.05, vjust = -7), plot.tag = element_text(face = "bold", colour = "black", size = 20), plot.tag.position = c(0.01, 0.98), plot.background = element_rect(fill = "transparent", color = NA), panel.grid.major = element_line(colour = col.grid, size = 0.3, linetype = "dotted"), panel.grid.minor = element_line(colour = col.grid, size = 0.0, linetype = "dotted"), panel.background = element_rect(fill = "transparent"), legend.title = element_text(colour="black", size=text.size, face="bold"), legend.text = element_text(colour="black", size=text.size-2)) + labs(y = "Index") + scale_x_discrete(drop=FALSE) + # 条形图的fill比例尺:对应Individuals图例 scale_fill_brewer(palette="Set1", drop=FALSE, name="Individuals") + # 点的color比例尺:对应选择方向 scale_color_manual(values = col.dir.sel, drop=FALSE, name = "Direction of\nselection") + # 点的fill比例尺:和color一致,确保填充色正确 scale_fill_manual(values = col.dir.sel, drop=FALSE, name = "Direction of\nselection") + # 形状比例尺:绑定到选择方向,图例中显示正确的颜色和形状 scale_shape_manual(values = shape.dir.sel, drop=FALSE, guide = guide_legend(override.aes = list(fill = col.dir.sel, color = col.dir.sel))) + # 调整图例顺序和显示:合并选择方向的color/fill/shape图例,隐藏个体图例的形状 guides(fill = guide_legend(override.aes = list(shape = NA), order=1), color = guide_legend(order=2), shape = guide_legend(order=2))
关键修改说明:
- 移除了初始
ggplot()中的fill=band.fct,让每个图层独立设置fill映射。 - 使用
new_scale_fill()分隔条形图和点的fill比例尺,避免冲突。 - 将
geom_point的fill绑定到dir.selection,而非继承条形图的band.fct,这样点的填充色就会和选择方向对应。 - 调整
scale_shape_manual的guide参数,确保图例中的形状和颜色匹配实际点的样式。 - 通过
guides()优化图例显示,合并选择方向的多个图例,让界面更整洁。
这样修改后,点的填充色就会和"Direction of selection"图例一致,同时条形图的个体填充色也能保留,箭头形状的上下方向也符合选择逻辑。
内容的提问来源于stack exchange,提问作者M. Beausoleil
相关产品推荐
相关产品推荐

