R ggplot:为什么我必须将数据转换为长格式?

R ggplot:为什么我必须将数据转换为长格式?,r,dataframe,ggplot2,R,Dataframe,Ggplot2,使用ggplot绘图时,我经常需要将数据转换为长格式,例如,如下面的代码所示。我有两个问题: 有没有办法将列(因此每个变量)用作“组”?所以每一列都被绘制出来,并且有不同的颜色?因此,无需将数据转换为长格式。(无需将每个变量放入geom_line()) 为什么必须将数据转换为长格式?背后的原因是什么?当您的数据具有宽格式时,它如何比打印更好 示例代码: library(tidyverse) # Data in wide format df_wide <- data.frame(

使用ggplot绘图时,我经常需要将数据转换为长格式,例如,如下面的代码所示。我有两个问题:

  • 有没有办法将列(因此每个变量)用作“组”?所以每一列都被绘制出来,并且有不同的颜色?因此,无需将数据转换为长格式。(无需将每个变量放入
    geom_line()
  • 为什么必须将数据转换为长格式?背后的原因是什么?当您的数据具有宽格式时,它如何比打印更好
  • 示例代码:

    library(tidyverse) 
    # Data in wide format
      df_wide <- data.frame(
       Horizons = seq(1,10,1),
       Country1 = c(2.5, 2.3, 2.2, 2.2, 2.1, 2.0, 1.7, 1.8, 1.7, 1.6),
       Country2 = c(3.5, 3.3, 3.2, 3.2, 3.1, 3.0, 3.7, 3.8, 3.7, 3.6),
       Country3 = c(1.5, 1.3, 1.2, 1.2, 1.1, 1.0, 0.7, 0.8, 0.7, 0.6)
       )
    
    # Convert to long format
      df_long <- df_wide %>%
       gather(key = "variable", value = "value", -Horizons)
        
    # Plot the lines
      plotstov <- ggplot(df_long, aes(x = Horizons, y = value)) + 
       geom_line(aes(colour = variable, group = variable))+
       theme_bw() 
    
    库(tidyverse)
    #宽格式数据
    
    df_-wide很难说这是不可能的——例如,有人可以为
    ggplot
    编写一个包装包,自动为您完成这项工作——但没有像这样明显的解决方案

    Hadley Wickham,ggplot
    的作者,已经建立了整个“tidyverse”生态系统的概念,这基本上是长格式的数据。使用长格式数据的基本原因是,相同的数据可以用许多宽格式表示,但长格式通常是唯一的。例如,假设您有按年度、国家和工业部门表示收入的数据。在广泛的格式中,列是表示年份、国家、部门还是某种组合?在tidyverse/ggplot世界中,您可以简单地指定要用作分组变量的变量。使用广泛的面向格式的工具(如base R的
    matplot
    ),您可以首先重塑数据,使列表示分组变量(例如,年份),然后进行绘图

    Wickham及其同事在更新版本的tidyverse中构建了
    gather
    (或
    pivot\u longer
    )等工具,以便于转换为长格式,并构建了多种其他工具来处理长(“tidy”)数据


    您可以围绕
    ggplot
    编写包装,以完成转换…

    正如我所看到的,您已经有了第二个问题的答案,因此我将在这里重点讨论第一个问题

    回答2-是的,有一种方法可以分别绘制每一列,具体如下:

    # load environment
    library(ggplot2)
    # create dataframe
    df <- data.frame(
      Horizons = seq(1,10,1),
      Country1 = c(2.5, 2.3, 2.2, 2.2, 2.1, 2.0, 1.7, 1.8, 1.7, 1.6),
      Country2 = c(3.5, 3.3, 3.2, 3.2, 3.1, 3.0, 3.7, 3.8, 3.7, 3.6),
      Country3 = c(1.5, 1.3, 1.2, 1.2, 1.1, 1.0, 0.7, 0.8, 0.7, 0.6)
    )
    # plot
    ggplot(df) +
      geom_line(aes(x = Horizons, y = Country1, colour = 'Country1')) +
      geom_line(aes(x = Horizons, y = Country2, colour = 'Country2')) +
      geom_line(aes(x = Horizons, y = Country3, colour = 'Country3'))
      theme_bw()
    
    #加载环境
    图书馆(GG2)
    #创建数据帧
    
    df您必须添加在不同geom_行中分隔的每个变量,这是您想要的吗?谢谢您的评论!我知道情况就是这样。但是,难道没有自动执行的选项吗?比如当你有长格式的数据时?我相信这就是tidyverse函数存在的原因,但是你可以在管道中直接将pivot与绘图连接起来,以避免创建一个单独的对象,然后再进行绘图!谢谢你的回答!最后,我结束了这个问题:)我一直认为它可能有一些其他的原因谢谢你的回答!我早就知道了。我想知道是否有一种方法不需要将每个变量都放入
    geom\u行
    。我的问题不够清楚,这不是我想要的,我的错。不过还是要谢谢你的awnser。