ggplot2中geom_point的ggrepel标签与次坐标轴不对齐如何调整
问题原因
ggplot2的次Y轴仅为刻度映射展示层,不会自动转换任何绘图元素的坐标数值,所有图层的y坐标都需要和主Y轴的数值范围匹配。你现有代码存在两处不匹配:
geom_point、geom_line中对次轴对应数值BASE_SHARE做了*1000的缩放来适配主Y轴范围,但geom_label_repel的y值直接使用了原始BASE_SHARE,数值量级差了三个数量级,自然会和点错位。- 次坐标轴的转换公式和缩放系数不匹配:你对
BASE_SHARE的缩放系数是1000,次轴转换却用了./2000,会导致次轴刻度数值本身也和真实值不符。
修正方案
调整geom_label_repel的y映射和次轴转换公式即可,完整修正代码如下:
library(tidyverse) library(ggrepel) BHAGWANPUR <- structure(list(STATE = c("UTTARAKHAND", "UTTARAKHAND", "UTTARAKHAND" ), DISTRICT = c("HARDWAR", "HARDWAR", "HARDWAR"), AC = c("BHAGWANPUR", "BHAGWANPUR", "BHAGWANPUR"), PARTY = c("INC", "BJP", "BSP"), VOTES = c(44882L, 42369L, 4069L), DELTA_VOTES = c(14835L, 31719L, -32759L), VOTE_PERCENTAGE = c(48.2, 45.5, 4.4), SWING = c(9.9, 31.9, -42.5), X.CHANGE = c(49.4, 297.8, -89), BASE_SHARE = c(38.2, 13.6, 4.4)), class = "data.frame", row.names = c(NA, -3L)) BHAGWANPUR <- BHAGWANPUR %>% mutate(mpg_type=ifelse(SWING>0,"ABOVE","BELOW")) BHAGWANPUR$PARTY <- factor(BHAGWANPUR$PARTY,levels=BHAGWANPUR$PARTY) draw <- ggplot(BHAGWANPUR, aes(x=PARTY, y=DELTA_VOTES, label=DELTA_VOTES)) + geom_bar(stat='identity', width=.5,aes(fill=PARTY))+ geom_text(aes(label=DELTA_VOTES,vjust="top"),position = position_stack(vjust = 0.5))+ scale_fill_manual(values=c("#00BFFF","#F98C1F","#22409A"))+ labs(subtitle="2012 to 2017", title= "Bhagwanpur,Uttarakhand") + theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), axis.line = element_line(colour = "black")) draw <- draw+ geom_point(colour = c("#00BFFF","#F98C1F","#22409A"), aes(x=PARTY, y=(BASE_SHARE * 1000),group = 1))+ # 修正:标签的y值和点保持一致,用缩放后的数值 geom_label_repel( aes(PARTY, y = BASE_SHARE * 1000, label = BASE_SHARE), fontface = 'bold', color = 'black', box.padding = unit(0.35, "lines"), point.padding = unit(0.5, "lines"), segment.color = 'grey50' ) + geom_line(aes(x=PARTY, y=BASE_SHARE * 1000,group = 1), stat="identity")+ # 修正:次轴转换公式和缩放系数匹配,除以1000还原原始BASE_SHARE数值 scale_y_continuous(name = "Votes", sec.axis = sec_axis(~./1000, name = "Base Share",labels = function(x) paste0(x, "%"))) draw
内容的提问来源于stack exchange,提问作者DSR
相关产品推荐
相关产品推荐

