R语言ggplot2绘制双Y轴报错:Discrete value supplied to continuous scale
问题解决:ggplot双Y轴报错
Error: Discrete value supplied to continuous scale 错误原因
- 代码中
scale_y_continuous(sec.axis = sec_axis(~.*scale, name="Share"))里的scale变量未定义,导致转换逻辑失效 - 直接使用原始
share值(范围0.04-0.05)与p100kp(范围1.6-3)在同一图层绘制,数值范围差距过大,触发ggplot的刻度类型判断错误
解决步骤及修正代码
要实现双Y轴折线图,需先将其中一个变量的数值转换到主Y轴的范围,再通过次Y轴的逆转换还原原始刻度:
year <- c(2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2015) share <- c(0.0434, 0.0446, 0.0452, 0.0458, 0.0466, 0.0472, 0.0475, 0.0479, 0.0475, 0.0465) p100kp <- c(2.0611, 1.7536, 1.7326, 2.2372, 2.9999, 2.5188, 2.5407, 2.8492, 1.6834, 1.7290) df <- data.frame(year, share, p100kp) # 计算转换比例:将share放大到p100kp的数值范围 scale_factor <- max(df$p100kp) / max(df$share) PP1 <- ggplot(df, aes(x = year)) + # 主Y轴:每10万人凶杀案数 geom_line(aes(y = p100kp, color = "Homicides per 100K population")) + # 次Y轴对应的数据:用转换后的share值 geom_line(aes(y = share * scale_factor, color = "Share of national wealth")) + # X轴刻度:只显示数据中存在的年份 scale_x_continuous(breaks = df$year) + # 主Y轴设置,次Y轴用逆转换还原share原始值 scale_y_continuous( name = "Homicides per 100K population", sec.axis = sec_axis(~./scale_factor, name = "Share of national wealth (Bottom 50%)") ) + labs(x = "Year", color = "") + scale_color_manual(values = c("orange2", "gray30")) print(PP1)
关键修改说明
- 定义
scale_factor,通过最大值比例将share转换到与p100kp相近的数值范围,避免因数值差异过大导致的类型错误 - 次Y轴使用
~./scale_factor做逆转换,将主Y轴的刻度还原为share的原始数值 - 修正X轴刻度为数据中实际存在的年份,避免出现无数据的年份刻度
内容的提问来源于stack exchange,提问作者SimonvZ
相关产品推荐
相关产品推荐

