ggplot2如何为分位数柱形图添加展示区间的自定义第二图例
实现方法
我们可以借助ggplot未使用的美学映射(比如color)来生成第二份图例,同时隐藏该映射对应的可视化元素,仅保留图例展示,无需额外安装依赖包。
第一步:预处理生成标签列
替代你原来的循环写法,直接在数据集内生成对应标签,自动适配分位数个数:
dataset_1$quantile_label <- paste(dataset_1$Quantile_rank, ": ", dataset_1$Quantile, sep = "")
第二步:修改ggplot绘图代码
新增geom_point层触发第二图例生成,同时调整图例格式为单列:
ggplot(dataset_1, aes(x=as.factor(Quantile_rank), y=EventRate)) + geom_bar(aes(fill=EventRate), stat="identity") + scale_fill_gradient(low = "green", high = "red") + # 新增:仅用于生成第二图例的点层,size=0隐藏实际显示的点 geom_point(aes(color = quantile_label), size = 0) + # 新增:设置第二图例的名称、标签,values值随便填不影响显示 scale_color_manual(name = "分位数区间", values = rep("transparent", nrow(dataset_1))) + geom_text(aes(label=round(EventRate, digits=3)), vjust=1.6, color="darkblue", size=3.5) + geom_errorbar(aes(ymin=EventRate_LowCI90, ymax=EventRate_HighCI90), width=.2, position=position_dodge(.9)) + labs(title = paste("Event rate for variable",var, sep=" "), subtitle = "Plot of event rates per quantile", caption = paste("Number of quantiles:", ntiles, sep=" "), x="Bin", y = "Event Rate") + # 新增:设置第二图例为单列,隐藏图例前的颜色标记 guides(color = guide_legend(ncol = 1, keywidth = 0, keyheight = 0, override.aes = list(size = 0))) + theme( plot.title = element_text(color = "black", size = 12, face = "bold"), plot.subtitle = element_text(color = "blue"), plot.caption = element_text(color = "blue", face = "italic") # 可自行调整图例位置,比如放右侧: legend.position = "right" )
修改说明
- 新增的
geom_point层仅用于触发图例生成,size=0不会在柱形图上显示任何多余元素 guides中的参数ncol=1强制图例为单列布局,override.aes去掉图例项前的颜色点,仅保留文本标签- 标签会随分位数个数自动更新,无需手动调整,NA对应的标签也会自动展示
内容的提问来源于stack exchange,提问作者Didifr
相关产品推荐
相关产品推荐

