R语言ggplot2绘制次轴图报'from'必须为有限数错误求助
报错原因
使用ggplot2绘制带次坐标轴的分面图时触发如下报错:
Error in seq.default(range[1], range[2], length.out = self$detail) : 'from' must be a finite number
报错本质是ggplot生成坐标轴刻度时,拿到的轴范围起始值不是有限数值(可能是NA、NaN、Inf/-Inf),结合提供的代码,具体诱因有3个:
- 代码冗余:重复叠加了5次
facet_wrap(~site,scales="free_y")和theme_bw(),同一图层重复添加会干扰坐标轴范围的计算逻辑,属于无意义的错误写法。 - 数据异常:使用
scales="free_y"会为每个分面单独计算y轴范围,如果筛选出的febrero(二月)子集中,某个site分面对应的映射y值列存在全空、全为无限值的情况,就会导致轴范围计算失败。 - 次轴逻辑错误:当前写法
sec_axis(~.,name="Iboca_24h")是完全复制主坐标轴比例,既没有做ggplot2要求的线性缩放转换,也没有和映射到次轴的字段做匹配,当对应字段存在缺失值时会直接触发刻度计算错误。
修复步骤
第一步:校验数据异常值
先运行以下代码,定位数据里的非有限值、分面空值问题:
# 提取二月子集 feb_subset <- IBOCA_Nowcast[IBOCA_Nowcast$month=="febrero",] # 检查参与绘图的y字段非有限值数量 y_cols <- c("NowCast12pm25", "MM24h", "Iboca_24h", "Iboca_NC") sapply(feb_subset[, y_cols], function(x) sum(!is.finite(x))) # 检查每个站点分面是否存在整列无有效数值的情况 aggregate( feb_subset[, y_cols], by = list(site = feb_subset$site), FUN = function(x) all(!is.finite(x)) )
如果校验返回存在非有限值、或某个站点分面下绘图字段全为无效值,先过滤对应无效行/分组,或补全缺失值再绘图。
第二步:修正绘图代码
删除重复的分面、主题图层,补充次轴的线性缩放逻辑(ggplot2次轴必须基于主轴做线性变换,不支持独立范围),参考代码如下:
# 计算主副轴缩放系数,根据实际数据的量级调整,保证次轴字段映射到主轴范围时不会出现比例失调 scale_coef <- max(feb_subset$Iboca_24h, na.rm = T) / max(feb_subset$NowCast12pm25, na.rm = T) g3 <- ggplot(feb_subset, aes(x = date))+ # 主轴映射字段 geom_line(aes(y = NowCast12pm25, colour = "Nowcast 12h"), linewidth = 0.1) + geom_line(aes(y = MM24h, colour = "media movil 24h"), linewidth = 0.1)+ # 次轴映射字段先除以缩放系数,对齐主轴数值范围 geom_line(aes(y = Iboca_24h / scale_coef, colour = "Iboca_24h"), linewidth = 0.1)+ geom_line(aes(y = Iboca_NC / scale_coef, colour = "Iboca_NC_12h"), linewidth = 0.1)+ # 分面、主题全局只设置一次 facet_wrap(~site, scales = "free_y")+ theme_bw()+ # 次轴反向缩放还原真实数值,分别设置主副轴名称 scale_y_continuous( name = "Nowcast 12h / 24h滑动平均浓度", sec.axis = sec_axis(~ . * scale_coef, name = "Iboca相关指标浓度") )
内容的提问来源于stack exchange,提问作者Luisa Osorio
相关产品推荐
相关产品推荐

