【问题标题】:How to overlay a bar chart with a line chart in R?如何在 R 中用折线图覆盖条形图?
【发布时间】:2020-02-20 01:30:58
【问题描述】:

我希望以数周为基础减少数年的数据。我正在寻找最近一年(2020 年)作为酒吧聊天,而前几年(2019 年和 2018 年)是线图。

我当前的代码产生下面的视觉效果

data %>%
  ggplot(aes(week, result, fill = year)) +
  geom_col()

Chart

如果我想将所有年份制作成条形图,我知道我可以在 geom_col 中使用“dodge”。但是,我正在尝试将数据拆分为不同的几何图形

当我使用子集函数(下面的代码)时,我的图表发生了一些奇怪的事情,我无法弄清楚发生了什么

data %>%
  ggplot(aes(week, result, fill = year)) +
  geom_col(data = subset(data, year == 2020)) +
  geom_line(data = subset(data, year != 2020))

Chart 2

以下是我正在使用的数据示例。关于我做错了什么有什么想法吗?

structure(list(year = c("2018", "2018", "2019", "2019", "2020", 
"2020"), week = c(1L, 2L, 1L, 2L, 1L, 2L), result = c(6.88475831020016, 
7.62267452779933, 3.67553313593328, 6.18354398162893, 2.38101968527051, 
5.9596355812872)), .Names = c("year", "week", "result"), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

【问题讨论】:

  • 嗨 mf17,欢迎来到 SO !与其发布数据图像,不如通过以下链接提供可重现的数据集示例:stackoverflow.com/questions/5963269/…。它使试图帮助您的人更轻松
  • 数据中的年份是字符,但您是基于与数字的比较进行子集化

标签: r ggplot2 subset


【解决方案1】:

我不确定您的错误在哪里,但是我的虚拟示例模仿了您的示例,我只是在 aes 中添加了 color 以使行按年份分组,其余代码与您的相似:

ggplot(df, aes(x = week, y = Value, 
               color = as.factor(year),
               fill = as.factor(year)))+
  geom_col(data = subset(df, year == 2020)) +
  geom_line(data = subset(df, year != 2020))

数据

df <- data.frame(year = rep(2018:2020, each = 7),
                 week = rep(1:7,3),
                 Value = rnorm(21))

使用 OP 数据编辑

根据您的数据,您只需要根据字符值进行子集化,而不是 @camille 指出的数字:

ggplot(df, aes(x = week, y = result, 
                 color =year,
                 fill = year))+
    geom_col(data = subset(df, year == "2020")) +
    geom_line(data = subset(df, year != "2020"))

【讨论】:

  • 感谢您的快速回复!您提供的代码适用于我的完整数据集,我发现我遇到的问题与我的数据结构更相关,而不是 ggplot。基本上,我在运行 ggplot 代码之前过滤了我的数据框。当我根据标准对我的数据进行子集化时,它正在查看原始数据框,预过滤器。这增加了更多的数据行,并在生成视觉效果时导致错误。现在想想就明白了!
  • 不客气,我编辑了我的答案,以根据您提供的数据提供另一种方法