Rmd转HTML时ggplot绘图数据点消失问题排查求助
Rmd编织后ggplot数据点消失的问题分析与解决
问题现象
编写Rmd文件时,直接运行代码生成的ggplot绘图能正常显示所有数据点;但将Rmd编织为HTML格式后,绘图仅保留线条,数据点完全消失。
相关代码块:
{r position_per_year, message=FALSE, warning=FALSE, include=FALSE, fig.show='asis'} # Position reached per year position_2007 <- gp_2007 %>% group_by(location, surname) %>% summarise(position = as.numeric(positionText), .groups = "drop") %>% ungroup() %>% ggplot(aes( x = location, y = position, group = surname, color = surname, )) + geom_point() + geom_line() + scale_y_reverse(breaks = seq(24, 1), limits = c(24,1)) + scale_x_discrete(guide = guide_axis(angle = 90)) + xlab("GP Location") + ylab("Place reached")
手动执行print(position_2007)时预览正常,但编织HTML后仅线条可见。数据集gp_2007的positionText字段包含"R"(代表退赛)这类非数值字符。
核心原因
- NA值被自动过滤:
as.numeric(positionText)会把"R"转换为NA,ggplot在编织输出时默认会丢弃含NA的行;而直接运行预览时,环境渲染机制可能未严格过滤这些NA值。geom_line()会自动跳过NA值连接有效点,但geom_point()会直接删除NA对应的点,导致退赛记录的点消失。 - 重复数据干扰:原数据中部分
location+surname组合存在重复行(比如Budapest对应Hamilton有两条记录),summarise未做聚合处理,直接保留了所有转换后的行,编织时的渲染逻辑可能因重复数据异常隐藏有效点。
解决办法
办法1:处理NA值并去重聚合
把退赛的"R"映射到合理数值(比如25,适配y轴上限24),同时对重复的分组记录去重:
{r position_per_year, message=FALSE, warning=FALSE, fig.show='asis'} # Position reached per year position_2007 <- gp_2007 %>% group_by(location, surname) %>% summarise( position = case_when( positionText == "R" ~ 25, TRUE ~ as.numeric(positionText) ), .groups = "drop" ) %>% distinct(location, surname, .keep_all = TRUE) %>% # 去重同一站同一车手的重复记录 ggplot(aes( x = location, y = position, group = surname, color = surname )) + geom_point(size = 2) + # 增大点尺寸确保可见 geom_line() + scale_y_reverse(breaks = seq(24, 1), limits = c(25, 1)) + # 调整y轴上限兼容退赛值 scale_x_discrete(guide = guide_axis(angle = 90)) + xlab("GP Location") + ylab("Place reached") print(position_2007)
办法2:直接使用预处理好的数值列
数据集已包含处理过的positionOrder列("R"对应19/21),直接用该列可避免NA转换问题:
{r position_per_year, message=FALSE, warning=FALSE, fig.show='asis'} # Position reached per year position_2007 <- gp_2007 %>% group_by(location, surname) %>% summarise(position = positionOrder, .groups = "drop") %>% distinct(location, surname, .keep_all = TRUE) %>% ggplot(aes( x = location, y = position, group = surname, color = surname )) + geom_point(size = 2) + geom_line() + scale_y_reverse(breaks = seq(24, 1), limits = c(24, 1)) + scale_x_discrete(guide = guide_axis(angle = 90)) + xlab("GP Location") + ylab("Place reached") print(position_2007)
办法3:修正代码块选项
移除代码块的include=FALSE参数,该参数会隐藏代码块输出,手动print和编织逻辑可能产生冲突:
{r position_per_year, message=FALSE, warning=FALSE, fig.show='asis'} # 后续代码保持不变
内容的提问来源于stack exchange,提问作者Jeffrey Sachs
相关产品推荐
相关产品推荐

