ggplot叠加绘图报错:Error in is.finite(x) : default method not implemented for type 'list'
解决ggplot叠加图形报错:Error in is.finite(x) : default method not implemented for type 'list'
核心问题分析
报错根源是代码存在aes映射使用错误、静态注释误用动态映射及图层参数调用不规范的问题,具体如下:
geom_vline的aes中直接用avg_ideology$type传入列表型数据,ggplot无法解析;annotate是静态注释工具,不支持通过aes做动态样式映射;geom_pointrange的xmin/xmax直接调用数据框列,不符合ggplot语法规范;- 重复调用主题设置造成冗余,且可能引发样式冲突。
修正后的完整代码
pq <- ggplot() + # 密度图层 geom_density( data = bg, aes(x = ideology, fill = type, group = type), alpha = 0.25, color = NA) + # 垂直线图层:修正aes映射,仅用列名 geom_vline( data = avg_ideology, aes(xintercept = name, color = type), size = 1, alpha = 0.25) + # 静态注释:直接传值,无需映射 annotate( "text", x = avg_ideology$name, label = avg_ideology$label, y = avg_ideology$height, colour = "black", angle = 90, vjust = -0.5, size = 3) + scale_fill_manual( values = c(Democrat = "blue", Republican = "red", Z = "black")) + # 标签设置 labs( x = "潜在意识形态维度上的立场", title = "民主党与共和党潜在总统初选候选人的Twitter意识形态得分") + # 主题设置:仅保留一次 theme_classic() + theme( plot.title = element_text(face = "bold", hjust = 0.5), legend.position = "none", axis.title.y = element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank(), axis.line.y = element_blank()) + xlim(-2, 2) + # 点范围图层:将xmin/xmax移入aes geom_pointrange( data = ideology, aes(x = twscore, y = rown1, color = party, xmin = lower, xmax = upper)) + scale_color_manual( values = c("blue", "red", "black")) + # 替换annotate为geom_text实现动态颜色映射 geom_text( data = ideology, aes(x = twscore + 0.5, y = rown1, label = screen_name, color = party), angle = 90, size = 3) pq
关键修复说明
- 所有图层的aes映射均使用列名而非
数据框$列名的形式,避免传入列表型数据; - 用
geom_text替代原最后一个annotate,实现基于party列的动态文本颜色映射; - 合并重复的主题设置,减少冗余代码。
内容的提问来源于stack exchange,提问作者Sharmeen Ehtasham
相关产品推荐
相关产品推荐

