在r中使用ggplot将变量传递给函数

在r中使用ggplot将变量传递给函数,r,ggplot2,R,Ggplot2,我提供了一个函数来绘制PCA图,如下所示。我想传递主成分(变量a和b)的名称,但还没有找到一种方法。我试过使用aes_字符串。收到的错误是eval(expr、envir、enclose)中的错误:找不到对象“.names” 根据下面的建议,我举了一个具体的例子。一个函数起作用,另一个函数不起作用。目标是将变量传递给此函数 #data d = iris[1:4] ###############################################################

我提供了一个函数来绘制PCA图,如下所示。我想传递主成分(变量a和b)的名称,但还没有找到一种方法。我试过使用aes_字符串。收到的错误是eval(expr、envir、enclose)中的错误:找不到对象“.names”

根据下面的建议,我举了一个具体的例子。一个函数起作用,另一个函数不起作用。目标是将变量传递给此函数

 #data
  d = iris[1:4]
  #########################################################################
  # PCA_Plot functions
  #########################################################################

  PCA_Plot = function(pcaData)
  {
    library(ggplot2)

    theta = seq(0,2*pi,length.out = 100)
    circle = data.frame(x = cos(theta), y = sin(theta))
    p = ggplot(circle,aes(x,y)) + geom_path()

    loadings = data.frame(pcaData$rotation, .names = row.names(pcaData$rotation))
    p + geom_text(data=loadings, mapping=aes(x = PC1, y = PC2, label = .names, colour = .names, fontface="bold")) +
      coord_fixed(ratio=1) + labs(x = "PC1", y = "PC2")
  }
  # non-working function with two extra variables
  PCA_Plot2 = function(pcaData, var1, var2)
  {
    library(ggplot2)

    theta = seq(0,2*pi,length.out = 100)
    circle = data.frame(x = cos(theta), y = sin(theta))
    p = ggplot(circle,aes(x,y)) + geom_path()

    loadings = data.frame(pcaData$rotation, .names = row.names(pcaData$rotation))
    p + geom_text(data=loadings, mapping=aes(x = var1, y = var2, label = .names, colour = .names, fontface="bold")) +
      coord_fixed(ratio=1) + labs(x = var1, y = var2)
  }


  #pca
  library(stats)
  p = prcomp(d)

  PCA_Plot(p) #works

  PCA_Plot2(p, "PC1", "PC2") # ERROR Error: Discrete value supplied to 
  continuous scale

在没有数据的情况下,下面是一个使用一些基本R数据集的函数的简化示例。我认为您遇到了一个quosure问题:您不能仅仅通过使用与列名对应的字符串直接访问列。相反,您希望在没有数据的情况下使用类似于
q_var的东西,下面是一个使用一些基本R数据集的函数的简化示例。我认为您遇到了一个quosure问题:您不能仅仅通过使用与列名对应的字符串直接访问列。相反,您希望使用类似于
q\u var的东西,您几乎可以使用
aes\u string
!您将
var1
var2
作为字符串提供,但不是
标签
名称
。如果您将其更改为
“.names”
,您的函数将正常工作

我稍微改变了你的功能:

  • 直接返回ggplot对象,而不是指定中间变量
  • 合并了绘图调用
  • 将库调用移到函数外部(无需每次调用函数时都加载库)


  • 你带着
    aes\u字符串就快到了!您将
    var1
    var2
    作为字符串提供,但不是
    标签
    名称
    。如果您将其更改为
    “.names”
    ,您的函数将正常工作

    我稍微改变了你的功能:

  • 直接返回ggplot对象,而不是指定中间变量
  • 合并了绘图调用
  • 将库调用移到函数外部(无需每次调用函数时都加载库)


  • 您应该提供一个可复制的示例。为了进一步@MLavoie对可复制示例的评论,如果您可以使用
    dput(data)
    dput(head(data,50))向我们提供一个易于加载到
    数据的R样本
    这将大大有助于我们帮助您。您应该提供一个可复制的示例。为了进一步@MLavoie对可复制示例的评论,如果您可以使用
    dput(data)
    dput(head(data,50))
    为我们提供一个易于加载到R中的
    数据样本,将大大有助于我们帮助您。
    
    library(stats)
    library(ggplot2)
    
    PCA_Plot2 = function(pcaData, var1, var2)
    {
    
      theta = seq(0,2*pi,length.out = 100)
    
       circle = data.frame(x = cos(theta), y = sin(theta))
    
       loadings = data.frame(pcaData$rotation,  .names = row.names(pcaData$rotation))
    
      ggplot(circle, aes(x,y)) +
        geom_path() +
        geom_text(aes_string(x = var1, y = var2, label = ".names"), inherit.aes = FALSE, data = loadings) +
        coord_fixed(ratio=1) +
        labs(x = var1, y = var2)
    }
    
    PCA_Plot2(p, "PC1", "PC2")