【问题标题】:Writing a function to specify which group/variable combination to send to ggplot编写一个函数来指定要发送到 ggplot 的组/变量组合
【发布时间】:2020-04-15 20:58:17
【问题描述】:

我有一个类似于df的数据框:

ID = c(letters[1:10])
num = c(1000,1200,1234,980,1300,1400,1251,1111,1354,1256)
df <- data.frame(ID = rep(ID, num), num = sequence(num))
df[paste0('Var', seq_along(ID))] <- rnorm(length(ID) * sum(num))
df$Location = rep(c("alpha", "beta"), each = 6043)

有 10 个变量对多个个体进行了测量(每个变量都由唯一的 ID 表示)。个体 (IDs) 嵌套在 Location 中,本例中有 2 个。所以IDs a:e 属于Location alpha,而IDs f:j 属于Location beta 我一直在通过创建一个新对象来制作我想要的图,该对象包含每个唯一 Location 的观察结果。对于每个变量 (Var1:Var10),我将 Location 的所有成员绘制在同一张图上,如下所示:

#example plot for alpha
alpha <- df%>%
  filter(Location == "alpha")
ggplot(df, aes(x=num, y=Var1))+
  labs(x= "num(distance)",y="Variable")+
  geom_line(aes(color = ID))

我的真实数据集有很多变量/ID 组合,所以我正在尝试编写一个函数,我可以只提供我想用来生成相同类型的绘图的LocationVar 我已经尝试了几种变体,但无法正常工作:

TSplot <- function(Location, Variable){
  ggplot(df, aes(x = num, y = Variable))+
      labs(x= "num(distance)", y=paste(Variable))+
  geom_line(aes(color = ID))
}

TSplot(alpha, Var1)

【问题讨论】:

    标签: r ggplot2 time-series


    【解决方案1】:

    有许多不同的方法可以解决这个问题。我试图建立在你提供的基础上。

    一种方法是提供数据框,另外还提供位置和变量作为函数参数的字符串。

    如果你在审美上为ggplot使用字符串,你可以使用aes_string

    library(tidyverse)
    
    TSplot <- function(df_input, location, variable) {
      df_input %>%
        filter(Location == location) %>%
        ggplot(aes_string(x = "num", y = variable)) +
          labs(x = "num (distance)", y = variable) +
          geom_line(aes(color = ID))
    }
    
    TSplot(df_input = df, location = "alpha", variable = "Var1")
    

    【讨论】:

      【解决方案2】:

      我想我理解您的问题 - 感谢您提供有用的示例集。您没有发布错误消息,但我猜如果您发送 TSplot(df, Location, Variable),您会收到错误 "Error in paste(Variable) : object 'variable' not found"

      这是因为ggplot 期望您发送一个“命名对象”,而您发送的是名称。

      例如,假设您让x 成为这个向量:

      x <- c('red', 'blue')
      

      如果您只输入名称,您可以调用该向量(“命名对象”),控制台会返回对象本身(向量):

      > x
      [1] "red"  "blue"  # I asked for the object called "x", I got the object itself
      

      但是如果你发送到控制台"x"(只是名字),你会得到"x",而不是对象。

      > "x"
      "x"    # thanks, console.  That's what I typed.  Note this is not the object called "x"
      

      是否可以发送“名称”,或者在这种情况下,只发送“x”,然后取回对象?是的!为此,您使用函数get()which returns the value of a named object

      > get("x")   # asking for the object named "x"
      [1] "red"  "blue"   # I get the object, not the name
      

      所以现在应该很明显你如何改变你的函数来工作了。您可以将对象的名称发送到函数:function(df),例如,将“您的整个数据框对象”发送到函数。但是在该命名对象中发送组件的名称是行不通的。您可以将列名发送为df$column.name,但发送function(column.name) 是行不通的,因为如果您在控制台中输入column.name,则不会收到df$column.name

      您可以通过更改使您的函数工作,以便将get() 合并到您需要仅使用引用名称“获取”对象的位置,所以这样的事情应该可以工作:

      Tsplot <- function(df, Variable){
          ggplot(df, aes(x = num, y = get(Variable)))+
              labs(x= "num(distance)", y=paste(Variable))+
              geom_line(aes(color = ID))
      }
      

      您应该可以发送Tsplot(df, 'Var1'),它会起作用。如果您发送Tsplot(df, Var1),它将无法正常工作。

      或者,如果您只想向aes() 发送一个字符串,您可以使用aes_string() 代替。如果您使用字符和对象名称组合调用,则最好将aes()get() 结合使用。换句话说,aes(x=name, y=get(character)) 在一个 aes() 调用中执行此操作,但对于 aes_string(),您必须使用两个:aes(x=name)aes_string(y=character)

      哦,我猜这是您的完整功能的摘录,因为您在此处发布的示例不包括“位置”。不过同样的情况也适用。

      【讨论】:

        【解决方案3】:

        我不太了解你的数据结构,但你试过了吗:

        TSplot <- function(df_input ,Location, Variable){
        df=df_input  
        ggplot(df, aes(x=num, y=Var1))+
          labs(x= "num(distance)",y="Variable")+
          geom_line(aes(color = ID))
        
        }
        
        
        newdata <- df[ which(df$Location=="alpha"), ]  # we select rows with criterion = "alpha"
        
        TSplot(newdata,Location, Variable) # we plot the wanted data
        

        【讨论】:

        • 我做了一些更改以澄清我的数据结构
        猜你喜欢
        • 1970-01-01
        • 2020-04-06
        • 2018-07-10
        • 2013-12-11
        • 2018-09-27
        • 1970-01-01
        • 1970-01-01
        • 2020-03-12
        • 1970-01-01
        相关资源
        最近更新 更多