R语言ggplot2无法在次坐标轴绘制BASE_SHARE百分比折线图求助
错误原因
- ggplot2的次坐标轴仅承担刻度标签的映射展示作用,不会自动转换图层的原始数据:你的主Y轴展示
DELTA_VOTES,数值范围在-3275931719之间,而`BASE_SHARE`的数值范围仅为4.438.2,直接用原始值作为折线、点的Y坐标,会因为和主Y轴量级差过大,几乎贴在0刻度位置无法正常显示。 - 你设置的次轴转换规则为
~./2000,对应需要先将BASE_SHARE乘以2000做正向缩放,匹配主Y轴的量级后再绘制图层。
修正后代码
# 先加载依赖包 library(tidyverse) 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=SWING)) + geom_bar(stat='identity', width=.5,aes(fill=PARTY))+ geom_text(aes(label=SWING,vjust=ifelse(DELTA_VOTES>0, -0.5, 1.5)))+ # 调整标签位置避免遮挡 scale_fill_manual(values=c("#00BFFF","#F98C1F","#22409A"))+ labs(subtitle="Vote swing among parties 2012 to 2017", title= "Bhagwanpur,Uttarakhand") + theme(axis.title.x=element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(), axis.line = element_line(colour = "black")) + # 缩放BASE_SHARE匹配主Y轴量级,添加折线、点图层,改红色避免和柱子混淆 geom_point(aes(x=PARTY, y=BASE_SHARE*2000, group = 1), color = "red", size = 2)+ geom_line(aes(x=PARTY, y=BASE_SHARE*2000, group = 1), color = "red", linewidth = 1)+ scale_y_continuous(name = "DELTA_VOTES", sec.axis = sec_axis(~./2000, name = "BASE_SHARE(%)")) draw
效果说明
修正后主Y轴展示各党派得票变化量,次Y轴对应的红色折线、点可正常展示各党派的BASE_SHARE百分比数值,不会出现折叠在0刻度的问题。
内容的提问来源于stack exchange,提问作者DSR
相关产品推荐
相关产品推荐

