geom_pictogram图例不显示颜色问题求助
问题描述
尝试创建包含象形图、颜色和分面信息的华夫饼图:使用geom_waffle时一切正常,但改用geom_pictogram并将美学映射中的fill替换为label后,颜色图例不再显示。已尝试显式使用guides、scale_color_manual的limits参数,均无效。
数据准备代码
fig3gout <- data.frame(value=c(30,20,0,0,0,0,0,0,0,50, 30,20,2,3,0,0,0,0,0,45, 35,15,6,4,5,3,3,2,0,27, 38,12,10,15,6,4,4,3,0,8), phase=rep(c("Baseline","Deploying a","Deploying b and c","Consolidation"),each=10), improvement=rep(c(rep("none",2),rep("a",2),rep("b",2),rep("c",2),rep("undiagnosed",2)),4), measure=rep(c("treated","diagnosed"),20)) fig3gout$phase <- factor(fig3gout$phase,levels=c("Baseline","Deploying a","Deploying b and c","Consolidation"),ordered=T) fig3gout$improvement <- factor(fig3gout$improvement,levels=c("none","a","b","c","undiagnosed")) fig3gout$measure <- factor(fig3gout$measure,levels=c("treated","diagnosed"))
正常运行的geom_waffle代码
library(ggplot2) library(waffle) ggplot(data=fig3gout,aes(values=value,fill=measure))+ geom_waffle(size = 2.5, n_rows = 10, flip = TRUE,aes(color=improvement))+ scale_fill_manual(values=c(1,2))+ scale_color_manual(name=NULL,values=c("#873600", "#28B463", "#7D3C98", "#EC7063", "#F0F3F4"), labels=c("Baseline","QI a","QI b","QI c","undiagnosed")) + facet_wrap(~phase,nrow=1,strip.position="bottom")+ coord_equal() + theme_minimal() + theme(panel.grid = element_blank(), panel.spacing=unit(-.2,"cm",data=NULL), axis.text=element_blank(), axis.ticks=element_blank(), legend.title=element_blank(), legend.position = c("top"), legend.box="vertical", legend.box.just = "top", legend.key.size = unit(1,units="cm"), legend.margin = margin(2, 2, 6, 6))
出现问题的geom_pictogram代码
ggplot(data=fig3gout,aes(values=value,label=measure))+ geom_pictogram(size = 2.5, n_rows = 10, flip = TRUE,aes(color=improvement))+ scale_label_pictogram(name=NULL, values=c(diagnosed="user-plus",treated="user"))+ scale_color_manual(name=NULL,values=c("#873600", "#28B463", "#7D3C98", "#EC7063", "#F0F3F4"), labels=c("Baseline","QI a","QI b","QI c","undiagnosed")) + facet_wrap(~phase,nrow=1,strip.position="bottom")+ coord_equal() + theme_minimal() + theme(panel.grid = element_blank(), panel.spacing=unit(-.2,"cm",data=NULL), axis.text=element_blank(), axis.ticks=element_blank(), legend.title=element_blank(), legend.position = c("top"), legend.box="vertical", legend.box.just = "top", legend.key.size = unit(1,units="cm"), legend.margin = margin(2, 2, 6, 6))
解决方案
问题根源是geom_pictogram生成的label图例与color图例发生冲突,导致color图例被覆盖或未正确渲染。以下两种方法可修复:
方法1:强制指定color图例的渲染规则
在scale_color_manual中添加guide参数,让color图例忽略label映射,只显示颜色块:
ggplot(data=fig3gout,aes(values=value,label=measure))+ geom_pictogram(size = 2.5, n_rows = 10, flip = TRUE,aes(color=improvement))+ scale_label_pictogram(name=NULL, values=c(diagnosed="user-plus",treated="user"))+ scale_color_manual(name=NULL,values=c("#873600", "#28B463", "#7D3C98", "#EC7063", "#F0F3F4"), labels=c("Baseline","QI a","QI b","QI c","undiagnosed"), guide = guide_legend(override.aes = list(label = "")))+ facet_wrap(~phase,nrow=1,strip.position="bottom")+ coord_equal() + theme_minimal() + theme(panel.grid = element_blank(), panel.spacing=unit(-.2,"cm",data=NULL), axis.text=element_blank(), axis.ticks=element_blank(), legend.title=element_blank(), legend.position = c("top"), legend.box="vertical", legend.box.just = "top", legend.key.size = unit(1,units="cm"), legend.margin = margin(2, 2, 6, 6))
方法2:调整美学映射优先级
将color=improvement移到全局aes中,确保color映射的图例优先级高于label:
ggplot(data=fig3gout,aes(values=value,label=measure,color=improvement))+ geom_pictogram(size = 2.5, n_rows = 10, flip = TRUE)+ scale_label_pictogram(name=NULL, values=c(diagnosed="user-plus",treated="user"))+ scale_color_manual(name=NULL,values=c("#873600", "#28B463", "#7D3C98", "#EC7063", "#F0F3F4"), labels=c("Baseline","QI a","QI b","QI c","undiagnosed")) + facet_wrap(~phase,nrow=1,strip.position="bottom")+ coord_equal() + theme_minimal() + theme(panel.grid = element_blank(), panel.spacing=unit(-.2,"cm",data=NULL), axis.text=element_blank(), axis.ticks=element_blank(), legend.title=element_blank(), legend.position = c("top"), legend.box="vertical", legend.box.just = "top", legend.key.size = unit(1,units="cm"), legend.margin = margin(2, 2, 6, 6))
内容的提问来源于stack exchange,提问作者del_courv
相关产品推荐
相关产品推荐

