这是我要自动化的情节的一个例子。
library(ggplot2)
library(scales)
p <- ggplot(diamonds, aes(x=cut, y=price) ) +
geom_boxplot() +
scale_y_continuous(labels = dollar)
p
但我想绘制多个不同的变量并使用适当的比例 例如价格,深度等,有些以美元计。
所以我做了一个函数
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网格似乎更容易。
答案 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()
为此,我倾向于使用循环(欢迎其他人不同意)。如果您打算使用套用方法,那么您可能希望apply
为lapply
,mapply
,vapply
和sapply
为列表,多元,向量-和分别简单应用。