如何通过R函数将多个参数传递给ggplot(美学和比例格式)? 如何将多个参数传递给ggplot函数?

如何通过R函数将多个参数传递给ggplot(美学和比例格式)? 如何将多个参数传递给ggplot函数?,r,function,ggplot2,R,Function,Ggplot2,下面是一个我想自动绘制的示例 library(ggplot2) library(scales) p <- ggplot(diamonds, aes(x=cut, y=price) ) + geom_boxplot() + scale_y_continuous(labels = dollar) p 对于var1,我得到: Error: Discrete value supplied to continuous scale 和var2: Error in f(..., sel

下面是一个我想自动绘制的示例

library(ggplot2)
library(scales)

p <- ggplot(diamonds, aes(x=cut, y=price) ) + 
  geom_boxplot() +
  scale_y_continuous(labels = dollar)
p
对于var1,我得到:

Error: Discrete value supplied to continuous scale 
和var2:

Error in f(..., self = self) : Breaks and labels are different lengths
问题1。为什么不起作用?这对我来说是最重要的问题

然后我想制作多个图,我可以用for循环来完成,但我一直听说我应该用apply来完成。这是我试过的

问题2。如何使多个图形与apply一起工作

FirstPlotData <- c("price","dollar")
SecondPlotData <- c("depth", "comma")
plotMetaData <- data.frame(FirstPlotData,SecondPlotData)
mapply会工作吗?怎么做

mapply(mytestfunction,plotMetaData[1,],plotMetaDataList[2,])

提前谢谢。我注意到我可以用facet绘制多个图形,但对于我更复杂的例子,隐藏异常值、缩放和统计,然后绘制多个图并放入cowplot网格似乎更容易。

您可能需要
aes\u string
。此函数的设计目的是使使用ggplot编程更容易(类似的想法也适用于
dplyr
命令)。以下工作:

library(tidyverse)

data(diamonds)

myfunction <- function(var1){
  p <- ggplot(diamonds, aes_string(x="cut", y= var1) ) + 
    geom_boxplot()
  p
  return(p)
}

myfunction("price")
使用应用程序? 为此,我倾向于使用循环(欢迎其他人不同意)。如果您开始使用应用方法,那么您可能希望
apply
,因为
lappy
mappy
vapply
sapply
分别是列表应用、多元应用、向量应用和简单应用。

试试这个

library(ggplot2)
library(scales)
library(rlang) # for sym

myfunction <- function(var1,var2){
  p <- ggplot(diamonds, aes(x=cut, y= !! sym(var1)) ) + 
    geom_boxplot() +
    scale_y_continuous(labels = get(var2))
  p
  return(p)
}
myfunction('price','dollar')
库(ggplot2)
图书馆(比例尺)
图书馆(rlang)#用于sym

myfunction您能提供一个输出示例吗?添加了数字和错误输出。查找(和谷歌)函数aes_string()。谢谢Joran,这将解决第一个问题。谢谢。在一个完美的世界中,相同的语法可以解决这两个问题?我想您可能希望安装一个最新版本的ggplot2-对评估(我想)进行了一些更新,代码可以在3.0.0+上运行,但不是我以前安装的非常旧的版本,但注意我在get()中使用了下面的aes_string()从这个answer.aes_字符串可以解出aes部分,但另一个答案也可以对刻度进行排序。对我来说,For循环似乎也更容易。
mapply(mytestfunction,plotMetaData[1,],plotMetaDataList[2,])
library(tidyverse)

data(diamonds)

myfunction <- function(var1){
  p <- ggplot(diamonds, aes_string(x="cut", y= var1) ) + 
    geom_boxplot()
  p
  return(p)
}

myfunction("price")
# works
ggplot(diamonds, aes(x=cut, y= price) ) + geom_boxplot()

# these 2 are equivalent, but do not work
ggplot(diamonds, aes(x=cut, y= "price") ) + geom_boxplot()
var1 = "price"
ggplot(diamonds, aes(x=cut, y= var1) ) + geom_boxplot()

# these 2 are equivalent, both works but inputs are strings
ggplot(diamonds, aes_string(x="cut", y= "price") ) + geom_boxplot()
var1 = "price"
ggplot(diamonds, aes_string(x="cut", y= var1) ) + geom_boxplot()
library(ggplot2)
library(scales)
library(rlang) # for sym

myfunction <- function(var1,var2){
  p <- ggplot(diamonds, aes(x=cut, y= !! sym(var1)) ) + 
    geom_boxplot() +
    scale_y_continuous(labels = get(var2))
  p
  return(p)
}
myfunction('price','dollar')