ggplot - 在折线图的 x 轴上有组

yas*_*107 2 r graph ggplot2

我有一个基本数据框,显示每组的 RMSE。

data <- data.frame(
  RMSE = c(9.77, 9.6, 9.42, 7.98, 7.78, 7.63, 7.66, 7.65, 7.61, 6.63, 6.58, 6.43),
  Model = c("LR - LHS", "LR - LHS", "LR - LHS", "XGB - Reg", "XGB - Reg", "XGB - Reg",
            "RF - LHS", "RF - LHS", "RF - LHS", "XGB - LHS", "XGB - LHS", "XGB - LHS")
)
Run Code Online (Sandbox Code Playgroud)

我想创建 RMSE 线图,但在 x 轴上需要模型 1、2 和 3 以及其下方的组。像这样的东西:

纸上图表

我得到的是 4 x 值,3 个点,一个在下一个,而不是彼此相邻(有 12 个值)。我尝试的另一个图给出了很好的结果,但它是 4 条不同的断开线。

Rui*_*das 5

这是在回答另一个 SO 问题时受到启发的一种方法。下面的代码
不是在组内使用数字并进行排序。然后包(CRANGitHub)负责对轴标签进行分组。paste0interactionggh4x

data <- data.frame(
  RMSE = c(9.77, 9.6, 9.42, 7.98, 7.78, 7.63, 7.66, 7.65, 7.61, 6.63, 6.58, 6.43),
  Model = c("LR - LHS", "LR - LHS", "LR - LHS", "XGB - Reg", "XGB - Reg", "XGB - Reg",
            "RF - LHS", "RF - LHS", "RF - LHS", "XGB - LHS", "XGB - LHS", "XGB - LHS")
)

suppressPackageStartupMessages({
  library(dplyr)
  library(ggplot2)
})

data %>%
  mutate(
    Group = interaction(row_number(), Model, sep = "&"),
    Group = factor(Group, levels = stringr::str_sort(Group, numeric = TRUE))
  ) %>%
  ggplot(aes(Group, RMSE, group = Model)) +
  geom_line() +
  geom_point() +
  guides(x = ggh4x::guide_axis_nested(delim = "&"))
Run Code Online (Sandbox Code Playgroud)

创建于 2023-09-08,使用reprex v2.0.2


我不认为每条线有不同的颜色有什么意义,它会在没有真正新信息的情况下给绘图增加噪音,这些线已经被Model.
但无论如何,它就在这里。

data %>%
  mutate(
    Group = interaction(row_number(), Model, sep = "&"),
    Group = factor(Group, levels = stringr::str_sort(Group, numeric = TRUE))
  ) %>%
  ggplot(aes(Group, RMSE, group = Model, colour = Model)) +
  geom_line() +
  geom_point() +
  guides(x = ggh4x::guide_axis_nested(delim = "&"))
Run Code Online (Sandbox Code Playgroud)

创建于 2023-09-08,使用reprex v2.0.2


编辑2

回答asd-tm 的评论,这里是 x 轴上模型内数字的图。
主要区别在于数据准备,首先强制Model使用适当的级别进行因子分析,然后按模型分组,然后才创建与模型内的(行)数字的交互。

data %>%
  mutate(Model = factor(Model, levels = Model %>% unique())) %>%
  group_by(Model) %>%
  mutate(Group = interaction(row_number(), Model, sep = "&")) %>%
  ggplot(aes(Group, RMSE, group = Model, colour = Model)) +
  geom_line() +
  geom_point() +
  guides(x = ggh4x::guide_axis_nested(delim = "&"))
Run Code Online (Sandbox Code Playgroud)

创建于 2023-09-08,使用reprex v2.0.2