基于具有相同变量的两组创建图

Create a plot based on two groups with the same variables

我有以下数据:

structure(list(Month = c("2018-08", "2018-09", "2018-10", "2018-11", 
"2018-12", "2019-01", "2019-02", "2019-03", "2019-04", "2019-05", 
"2019-06", "2019-07", "2019-08", "2019-09", "2019-10", "2019-11", 
"2019-12", "2020-01", "2020-02", "2020-03", "2020-04", "2020-05"
), `Member 1` = c("Yes", "Yes", "Yes", "No", "No", "No", "Yes", 
"Yes", "Yes", "Yes", "No", "No", "No", "Yes", "Yes", "No", "Yes", 
"Yes", "No", "Yes", "No", "Yes"), `Rating 1` = c(1L, 1L, 4L, 
5L, 3L, 2L, 3L, 1L, 4L, 1L, 4L, 5L, 6L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L), `Member 2` = c("No", "Yes", "No", "Yes", "Yes", 
"No", "Yes", "Yes", "Yes", "No", "Yes", "No", "No", "Yes", "No", 
"Yes", "No", "Yes", "No", "Yes", "No", "Yes"), `Rating 2` = c(1L, 
4L, 1L, 4L, 1L, 4L, 1L, 4L, 1L, 4L, 2L, 2L, 2L, 3L, 4L, 5L, 5L, 
1L, 2L, 5L, 3L, 2L)), class = "data.frame", row.names = c(NA, 
-22L))

我的目标是在 R 中通过 ggplot 创建一个图,其中我在 x-axis 上有“月份”,在 y-axis 上有“评级”。我的数据包含两列评级(称为评级 1 和评级 2)。但是,它们具有相同的比例,因此我可以将 y-axis 称为评级。但后来我想在情节中总共有四行。您可以将其视为具有“成员 1”和“评级 1”以及“成员 2”和“评级 2”。所以我想在情节中有四行:

应该有一个包含两个子组的图例,每个子组都包含一个标题(标题分别为评级 1 和评级 2):

评分 1:

评分 2:

我是 ggplot 的新手,非常感谢任何帮助。

到目前为止我尝试过的:

  1. 我创建了两个不同的数据框,一个用于会员 1 及其评级,一个用于会员 2 及其评级。然后我更改了列名,使它们在两个数据框中都相同。
Data1 <- subset(Data, select=c(Month, `Member 1`, `Rating 1`))
Data2 <- subset(Data, select=c(Month, `Member 1`, `Rating 1`))

colnames(Data1) <- c("Month", "Member", "Rating")
colnames(Data2) <- c("Month", "Member", "Rating")
  1. 我按以下方式使用了 ggplot:
ggplot() + 
  geom_line(data = Data1, aes(x = Month, y = Rating, group=`Member`, fill=`Member`, color=`Member`, linetype=`Member`), color = "red") +
  geom_line(data = Data2, aes(x = Month, y = Rating, group=`Member`, fill=`Member`, color=`Member`, linetype=`Member`), color = "blue") +
  xlab('Month') +
  ylab('Rating')

当我 运行 ggplot 代码时,我得到了一个具有所需 x-axis 和 y-axis 的图。但是,我想在右边有一个图例,如上所述。现在,我只有蓝色的传说。此外,如果我可以为一个成员使用 geom_point,这会使其更加可视化,那就太好了。

你还没有说你想要什么类型的情节。在任何情况下,最好将数据转换为长格式以创建绘图:

library(tidyverse)

df %>%
  pivot_longer(-1, names_to = c(".value", "PersonNum"),
               names_pattern = "^(.*) (\d)$") %>%
  mutate(Month = as.Date(paste0(Month, "-01"))) %>%
  ggplot(aes(Month, Rating, color = Member)) +
  geom_line() +
  geom_point() +
  facet_grid(PersonNum~.) +
  scale_color_manual(values = c('orange2', 'deepskyblue4')) +
  theme_bw(base_size = 16)


更新

如果您不需要分面,可以将所有行放在一个面板中。我认为这是一个更难阅读的情节,并且不如带有刻面的情节那么吸引人/信息丰富,但为了完整性而在这里。

df %>%
  pivot_longer(-1, names_to = c(".value", "PersonNum"),
               names_pattern = "^(.*) (\d)$") %>%
  mutate(Month = as.Date(paste0(Month, "-01")),
         Group = paste0('Rating: ', PersonNum, ', Member: ', Member)) %>%
  ggplot(aes(Month, Rating, color = Group)) +
  geom_line() +
  geom_point() +
  scale_color_brewer(palette = 'Set1') +
  theme_bw(base_size = 16)