ggplot中geom_rect的fill在图与图例显示不一致如何解决
问题原因
这个异常是两个因素共同导致的:
- geom_rect重复渲染叠加:你没有为
geom_rect指定独立数据集,它默认继承全局的tempdf1数据,数据有多少行就会重复绘制多少次矩形。多次半透明图层叠加后,图上实际显示的填充色透明度会远高于你设置的alpha参数值。 - 图例和画布渲染逻辑不一致:图例中的填充色块只会渲染1次,直接使用你设置的
alpha值,和画布上叠加后的实际显示效果天然存在差异:- 当你设置
alpha=0.005时,画布上多次叠加后总透明度提升,颜色接近正常但仍偏淡(过亮),而图例里单次低透明度渲染反而因为色块小,视觉上看起来接近实色 - 当你设置
alpha=0.5时,画布上多次叠加后几乎完全不透明,颜色显示正常,而图例里用alpha=0.5渲染的半透明色块就会几乎和背景融合,难以看清
- 当你设置
修复方案
两步修改即可解决:
- 给
geom_rect指定独立的单行数据集,避免重复绘制叠加 - 用
guides函数强制图例的填充色为不透明,和你设置的标准色一致
修改后的完整代码如下:
# 先创建矩形专用的数据集,避免重复渲染 rect_df <- data.frame( error_type = c("5% Error", "10% Error"), xmin = c(p5xmin - 1, p10xmin - 1), xmax = c(p5xmax + 1, p10xmax + 1), ymin = c(p5ymin, p10ymin), ymax = c(p5ymax, p10ymax) ) #graph the average output by machine ggplot(data=tempdf1)+ #dot plot of individual POD machines geom_point(aes(x=sample,y=mean_perc_FAM_to_ref,color=POD_machine),width=0.1)+ #line plot of the mean across POD machines stat_summary(aes(x=sample,y=mean_perc_FAM_to_ref,group=known_conc,color=POD_machine),fun=mean,geom="line")+ #wrap by known conc facet_wrap(.~known_conc,scales="free")+ # 改用独立数据集绘制矩形,关闭全局数据继承,alpha可根据需要调整为0.2-0.5之间 geom_rect(data = rect_df, aes(xmin=xmin, xmax=xmax, ymin=ymin, ymax=ymax, fill=error_type), alpha=0.3, inherit.aes = FALSE)+ scale_fill_manual(values=c("5% Error"="green","10% Error"="yellow"))+ # 强制图例填充色为不透明,和设置的颜色一致 guides(fill = guide_legend(override.aes = list(alpha = 1)))+ #labels labs(x="Sample",y="Measured % of Trait",color="POD Machine",fill="Error Range")+ #clean up background, add gridlines (only to y-axis), add x- and y-axis lines theme(panel.background=element_blank())+ theme(panel.grid=element_line(color="black"))+ theme(panel.grid.major=element_blank())+ theme(panel.grid.minor=element_blank())+ theme(axis.line=element_line(color="black"))+ #customize x-axis so there is no space between graph and y-axis scale_x_continuous(expand=c(0,0))+ #customize tick marks in y-axis scale_y_continuous(labels=scales::percent)
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

