You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ggplot2中geom_point的ggrepel标签与次坐标轴不对齐如何调整

问题原因

ggplot2的次Y轴仅为刻度映射展示层,不会自动转换任何绘图元素的坐标数值,所有图层的y坐标都需要和主Y轴的数值范围匹配。你现有代码存在两处不匹配:

  1. geom_point、geom_line中对次轴对应数值BASE_SHARE做了*1000的缩放来适配主Y轴范围,但geom_label_repel的y值直接使用了原始BASE_SHARE,数值量级差了三个数量级,自然会和点错位。
  2. 次坐标轴的转换公式和缩放系数不匹配:你对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:06:06