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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:57:02