我有这个
Product <- c("X","Y","Z")
Var1 <- runif(3)
Var2 <- rnorm(3)
Var3 <- rnorm(3)
df <- data.frame(Product,Var1,Var3,Var2)
bar.plot <- function(dat,k,p,this) {
mytitle <- paste("Topic:",as.character(this))
ggplot(dat, aes_string(x = substitute(k), y = substitute(p))) +
geom_bar(position = "dodge",stat = "identity",fill="lightblue", colour="black") +
theme(plot.title=element_text(size=25,face="bold"), axis.text.y = element_text(size=20),axis.title.y = element_blank(),axis.text.x = element_text(size = 10,angle = 30, hjust = 1)) +
labs(title=mytitle)
}
我希望以下内容为df
中的每个列返回三个图。但事实并非如此。
col <- c(Var1,Var2,Var3)
for(i in col){
bar.plot(df,Product,i,"Data")
}
为什么会出现这种情况?感谢。
答案 0 :(得分:0)
正如@DrDom所说,你需要col
中的字符,如果你想在for循环中看到你需要print
它们的情节。 (或保存它们,或将它们分配到list
...)
col <- c("Var1", "Var2", "Var3")
for(i in col){
print(bar.plot(df, Product, i, "Data"))
}
虽然这可以与原始bar.plot
一起使用,substitute
完全没必要(您已经在使用aes_string
!),因此我们可以简化为:
bar.plot <- function(dat,k,p,this) {
mytitle <- paste("Topic:", as.character(this))
ggplot(dat, aes_string(x = k, y = p)) +
geom_bar(position = "dodge", stat = "identity",
fill = "lightblue", colour = "black") +
theme(plot.title=element_text(size = 25, face = "bold"),
axis.text.y = element_text(size = 20),
axis.title.y = element_blank(),
axis.text.x = element_text(size = 10, angle = 30, hjust = 1)) +
labs(title = mytitle)
}
答案 1 :(得分:0)
这是一种略有不同的方法。
bar.plot <- function(dat,k,p,this) {
mytitle <- paste("Topic:",as.character(this))
gg <- data.frame(x=dat[,k],y=dat[,p])
ggplot(gg, aes(x,y)) +
geom_bar(position = "dodge",stat = "identity",fill="lightblue", colour="black") +
theme(plot.title=element_text(size=25,face="bold"), axis.text.y = element_text(size=20),axis.title.y = element_blank(),axis.text.x = element_text(size = 10,angle = 30, hjust = 1)) +
labs(title=mytitle)
}
for(i in 2:4){
print(bar.plot(df,"Product",i,"Data"))
}
这会在函数内部构建一个包含x
和y
列的数据框,并在调用ggplot(...)
时使用该数据框,而不是尝试使用aes_string(...)
。< / p>
您的代码:col <- c(Var1,Var2,Var3)
创建一个矢量长度9,基本上连接三个Var列。当你使用for (i in col)
R将i设置为col中每个元素的值时,循环运行9次 - 而不是你想要的。