使用scale_fill_manual时如何设置ggplot图例除"Others"外文本为斜体
实现方案
要实现“除Others图例外,其余图例文本为斜体”的需求,不需要修改全局theme的通用图例设置,只需要在scale_fill_manual中为每个图例条目单独指定文本样式即可,该方法为ggplot2原生支持,无需额外安装第三方包。
调整逻辑
- 按照Species因子的实际标签,为每个图例条目匹配对应文本样式规则
- 标签文本为Others的条目设置为常规正体,其余所有条目设置为斜体
- 顺带优化原代码中重复设置
guides(fill=...)的冗余部分,修复原代码中后一次guide设置覆盖前一次参数、导致ncol=1失效的问题
可直接套用的完整代码
# 第一步:为每个图例标签匹配对应文本样式 legend_label_styles <- lapply(levels(D$Species), function(label) { if (label == "Others") { # Others条目保持常规正体 element_text(size = 35, colour = "black", face = "plain") } else { # 其余所有条目设为斜体 element_text(size = 35, colour = "black", face = "italic") } }) # 第二步:绘图(调整scale_fill_manual传入自定义labels,合并重复guides参数) p <- ggplot(D, aes(x = factor(Habitat, levels = c("Water", "Soil")), y = RA, fill = factor(Species))) + geom_bar(stat = "identity", position = "stack", width = 0.5, colour = 'black', size = 0.1) + # 传入自定义的标签样式向量 scale_fill_manual(name = "Species", values = myColour, labels = legend_label_styles) + # 合并原来重复的两个guides(fill=...)设置 guides(fill = guide_legend( ncol = 1, override.aes = list(linetype = "solid", color = "white", size = 5) )) + xlab(" ") + ylab("[ % ]") + ylim(0, 100) + theme( aspect.ratio = 2, panel.background = element_rect(fill = "white"), panel.grid.minor = element_blank(), plot.title = element_text(size = 35, face = "bold", vjust = 0, hjust = -0.1), legend.title = element_text(size = 35, colour = "black", face = "bold"), legend.key.size = unit(1, 'cm'), legend.key = element_rect(size = 15, color = "white"), legend.key.height = unit(2, "cm"), legend.key.width = unit(2, "cm"), legend.box.spacing = unit(1.5, "cm"), axis.title = element_text(size = 30, face = "bold"), axis.title.x = element_text(vjust = -3), axis.text = element_text(size = 25, colour = "black"), axis.line = element_line(colour = "black", size = 0.9) )
注意事项
- 代码中按标签文本值判断样式,不会因为Species因子的水平顺序变动导致样式匹配错位,只要标签名是
Others就会自动设置为正体 - 原代码中两次调用
guides(fill=...)时,后一次的设置会覆盖前一次的所有参数,因此原来设置的ncol=1实际是失效的,本次调整将两个guide的参数合并,保证所有设置都能生效 - 原theme中全局设置的
legend.text会被scale层单独指定的标签样式覆盖,因此不需要在theme中额外指定face属性,避免冲突 - 如果绘图后样式不生效,可先运行
levels(D$Species)确认因子列表中是否真的存在值为Others的标签,避免拼写不一致(比如写成"others"、"Other")导致规则失效
内容的提问来源于stack exchange,提问作者Valdarn8
相关产品推荐
相关产品推荐

