如何通过R函数将多个参数传递给ggplot(美观和小数位格式)?

时间:2018-08-23 04:39:09

标签: r function ggplot2

如何将多个参数传递给ggplot函数?

这是我要自动化的情节的一个例子。

library(ggplot2)
library(scales)

p <- ggplot(diamonds, aes(x=cut, y=price) ) + 
  geom_boxplot() +
  scale_y_continuous(labels = dollar)
p

enter image description here 但我想绘制多个不同的变量并使用适当的比例 例如价格,深度等,有些以美元计。

所以我做了一个函数

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

当我测试该功能时,它不起作用。这两个参数各自导致不同的错误。

myfunction("price","dollar")

对于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)

lapply对于多个参数不适用于我。它可以传递多个参数吗?

lapply(plotMetaData, function(avar,bvar)myfunction(avar, bvar))

mapply可以工作吗?怎么样?

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

先谢谢了。我注意到我可以用构面制作多个图形,但是对于我更复杂的示例,可以隐藏异常值,缩放和统计数据,然后进行多重绘制并放入Cowplot网格似乎更容易。

2 个答案:

答案 0 :(得分:3)

尝试一下

x = [0.0, 0.87, 0.0, 0.0, 0.0, 0.32, 0.46, 0.0, 0.0, 0.10, 0.0, 0.0]
import pandas as pd
data = pd.DataFrame(x)
inds = data[data[0]!=0.0].index
print(inds)

答案 1 :(得分:2)

您可能想要aes_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")

为什么?

对比以下内容:

# 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()

使用申请吗?

为此,我倾向于使用循环(欢迎其他人不同意)。如果您打算使用套用方法,那么您可能希望applylapplymapplyvapplysapply为列表,多元,向量-和分别简单应用。