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

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"(代表退赛)这类非数值字符。

核心原因

  1. NA值被自动过滤:as.numeric(positionText)会把"R"转换为NA,ggplot在编织输出时默认会丢弃含NA的行;而直接运行预览时,环境渲染机制可能未严格过滤这些NA值。geom_line()会自动跳过NA值连接有效点,但geom_point()会直接删除NA对应的点,导致退赛记录的点消失。
  2. 重复数据干扰:原数据中部分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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:55:35