ggplot2设置条形透明度后knitr导出PDF时插入PNG意外变透明如何解决
问题原因
你遇到的导出PDF时插入图片褪色的问题,是ggplot图层参数继承和PDF渲染设备的共同作用导致的:你在geom_bar中设置了alpha映射,PDF导出设备渲染时会将该透明度参数误应用到后续的annotation_custom图片图层上,而RStudio内置预览的渲染逻辑对参数继承的处理更宽松,因此不会出现异常。
解决方法
以下两种方案都可以保留指定条形的半透明效果,同时保证插入的图片完全不透明:
方案1:显式指定图片图层的透明度
直接在annotation_custom中添加alpha=1参数,强制覆盖继承的透明度设置,修改后的绘图代码如下:
ggplot(df2, aes(x=day, y=value)) + geom_bar(aes(fill=day, alpha=variable), stat="identity", width = .75, position = position_dodge(width=.8)) + scale_alpha_manual(values=c(1, .45)) + scale_fill_manual(values= barcolors) + theme_bw() + theme( panel.grid.major.x = element_blank(), legend.position="none", legend.text=element_text(size=14), legend.title = element_blank(), axis.title.x = element_blank()) + # 新增alpha=1参数 annotation_custom(g, xmin=.7, xmax=1.3, ymin=35, ymax=40, alpha = 1) + ylim(0,40)
方案2:避免alpha作为映射变量
不将alpha放入aes映射中,直接给条形传入对应透明度的向量,从根源上避免参数继承问题,兼容性更强,修改后的绘图代码如下:
# 构造对应透明度的向量,variable为x的条形alpha=1,y的为0.45 bar_alpha <- ifelse(df2$variable == "x", 1, 0.45) ggplot(df2, aes(x=day, y=value)) + # 把alpha从aes中移除,直接传入构造好的透明度向量 geom_bar(aes(fill=day), stat="identity", width = .75, position = position_dodge(width=.8), alpha = bar_alpha) + scale_fill_manual(values= barcolors) + theme_bw() + theme( panel.grid.major.x = element_blank(), legend.position="none", legend.text=element_text(size=14), legend.title = element_blank(), axis.title.x = element_blank()) + annotation_custom(g, xmin=.7, xmax=1.3, ymin=35, ymax=40) + ylim(0,40)
两种方案导出PDF时都不会出现图片褪色的问题,可根据使用习惯选择。
内容的提问来源于stack exchange,提问作者JK Lambert
相关产品推荐
相关产品推荐

