【问题标题】:ggplot how to "read" data vertically instead of horizontally in Rggplot如何在R中垂直而不是水平“读取”数据
【发布时间】:2021-01-04 10:55:12
【问题描述】:

数据框目前如下所示:

编辑:结构

library(data.table)
library(dplyr)
library(tibble)

但我收到以下错误:“每个组仅包含一个观察结果”。

如果是这样,我怎样才能得到一个按月绘制每列值的折线图?

另外,我不确定如何在 ggplot aes() 位中选择多个区域。我尝试使用 c() 无济于事。任何帮助和对新手友好的建议将不胜感激!

【问题讨论】:

  • 为了帮助我们帮助您,请您通过分享您的数据样本、您尝试过的代码和包你用过吗?请参阅how to make a minimal reproducible example 请不要使用 str()、head() 或屏幕截图来发布您的数据。只需在控制台中输入dput(NAME_OF_DATASET) 并将以structure(.... 开头的输出复制并粘贴到您的帖子中。
  • 顺便说一句:至少对于您显示的代码,请尝试添加 group=1 美学。
  • 感谢提醒,我不知道那个 dput 命令。我刚刚添加了您所要求的内容,将数据框修剪为 3x3 表。希望它有效! p.s.我尝试添加 group = 1 但我收到相同的错误消息

标签: r ggplot2 aes linegraph


【解决方案1】:

你的问题有几个部分:

  1. 要立即解决您的错误,您需要在 geom_line() 函数中添加一个 group = 1 参数

    1a。这是因为 geom line 允许您绘制多个相互断开的“组”线。在这种初始情况下,所有点都在同一个组中,您希望通过线将它们全部连接起来。

  2. 要绘制多个组,您首先需要以长格式定位数据,这将使您更轻松地使用 ggplot。为此,您需要包含如下行:

     tidyr::pivot_longer(data, -Date, values_to = "value_on_date", names_to = "region")
    

这将生成一个长格式的数据

然后您可以将代码更改为类似

df %>% 
        tidyr::pivot_longer(-Date, values_to = "value_on_date", names_to = "region") %>% 
ggplot( aes(Date, value_on_date)) +
        geom_line(aes(group = region)) +
        labs(x="Date", y="Value on date")

然后将显示 3 行,每个区域一个。

2a。该代码中值得注意的事情,请注意在 geom_line 中,该组现在位于 aes() 调用中,这是因为该组现在将随数据而变化,而不是一个常数,这是所有 ggplot 的通用结构。

2b。 ggplot 中的另一个原则是每一行应该是 1 个观察值,以及所有相关的细节。根据您显示的数据,每行实际上是 3 位数据,每个区域一个,这不适用于 ggplot。

2c。然后,您可以通过在 aes() 参数中添加诸如 color = region 之类的内容来扩展它,以更清楚地显示哪个区域是哪个区域

希望这会有所帮助,正如stefan 所说,包括一些关于如何进入您的会话状态的最小可重现示例可以帮助任何想要回答您的问题的人。

【讨论】:

    【解决方案2】:

    问题在于您的 x 轴变量是字符变量或分类变量。在这种情况下,ggplot 默认使用此变量对数据进行分组,即每组只有一个观察值。在这种情况下,您必须告诉 ggplot 所需的分组,这可以由 group=1 完成,这意味着 ggplot2 应该将所有观察结果视为属于一个组,为简单起见,我们称之为 1

    要获得所有区域的线图,最好使用例如将数据重塑为长格式。 tidy::pivot_longer 为我们提供了两个新的列,一个带有类别或区域的名称,一个带有相应的值。重塑后,您可以使用 group=name 映射 y 上的值并按区域分组。

    library(dplyr)
    library(tidyr)
    library(ggplot2)
    
    df <- structure(list(Date = c("01-2019", "02-2019", "03-2019"), `North East` = c(
      5.05625777763551,
      5.58119346747183, 5.41295614949722
    ), London = c(
      4.2102766429572,
      4.45850956493638, 4.36960549219723
    ), `West Midlands` = c(
      5.0708122696351,
      5.20425572086481, 5.07463979478007
    )), row.names = c(NA, 3L), class = "data.frame")
    
    df_long <- df %>%
      pivot_longer(-Date)
    
    ggplot(df_long, aes(Date, value, color = name, group = name)) +
      geom_line() +
      labs(x = "Date", y = "Region")
    

    【讨论】:

    • 完美运行,非常感谢代码和详尽的解释!我能问你为什么在pivot_longer中包含“-Date”吗? df_long % pivot_longer(-Date).
    • 如果不使用-Date,日期将被视为第四个区域类别,因此使用-Date,我告诉pivot_longer 重塑除Date 之外的所有列。
    【解决方案3】:

    添加组美学将修复此错误。

    在 ggplot 调用中将 group = 1 添加到您的 aes。

    【讨论】:

      猜你喜欢
      • 2017-09-01
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 2021-11-04
      • 2022-12-10
      • 2022-08-02
      相关资源
      最近更新 更多