【问题标题】:ggplot subsetting in loop循环中的ggplot子集
【发布时间】:2020-02-24 20:08:43
【问题描述】:

这是我遇到的 ggplot+ lapply+ 子集问题

这里是一个可重现的例子

stages=as.vector(c("1","2","3","1","1","1","1","1","1","2","2","2","2","2","3","3","3","3","3","3","3","3","3","3","3","1","1"))
x13=c(0.9, 0, 0, 0.692, 0,0,0,0,0,0,0,0,0,0.53, 0.5,0,2,3,55,49,64,9,4,1,0,54,0)
y13=c(0.9, 0, 0, 0.692, 0,0,0,0,0,0,0,0,0.53,0.9, 0, 0, 0.692, 0,0,0,0,0,0,0,0,0,0.53)
countmatrix=cbind(x13,stages,y13)
countmatrix=as.data.frame(countmatrix)
p2=ggplot(data=countmatrix, aes(stages, fill = x13))+
  geom_bar(position="stack",  fill="gray34")+
  geom_bar(data=subset(countmatrix, x13!=0),  aes(fill=stages ))
p2 ````

一旦我将它放入复制许多变量的函数中,它似乎不起作用(子集部分至少似乎不起作用。 这是我使用的代码。

barplotseries <- function(x){
  y=as.name(x)
  ggplot(data=countmatrix, aes(stages, fill = y))+
    geom_bar(position="stack",  fill="gray34")+
    geom_bar(data=subset(countmatrix,y!=0),  aes(fill=stages ))
}
x=c("x13","y13")
p2=lapply(x, barplotseries)
do.call("grid.arrange", c(p2, ncol=2))

所有人都希望能够在尽可能多的变量上绘制相同的图。

请告诉我您的建议(我应该使用 For 吗?)我不知道如何使用它。

谢谢

【问题讨论】:

  • 您的可重现示例不包括 stages
  • 使用变量将绘图保存在函数内部,以便您可以在函数外部访问它。
  • 此外,可重现的示例不会呈现这样的图。请务必在空的 R 环境中重新运行发布的代码(即没有以前的 globalenv 对象),以确保所有编译和渲染都相应地进行。
  • 对不起,我忘了复制第一行。矢量阶段现在。现在可以重现了。

标签: r ggplot2 subset lapply


【解决方案1】:

正如@Parfait 指出的那样,调用 globalenv 对象不是一个好主意。

您的原始函数不起作用,因为 1. 它接受一个字符串,然后将其传递给 ggplot2 中的 aes,2. 当您在 countmatrix 上设置子集时,您又将字符串传入..

进行一些编辑,以下应该可以工作:

#keep the data.frame as factors and numeric
stages=as.vector(c("1","2","3","1","1","1","1","1","1","2","2","2","2","2","3","3","3","3","3","3","3","3","3","3","3","1","1"))
x13=c(0.9, 0, 0, 0.692, 0,0,0,0,0,0,0,0,0,0.53, 0.5,0,2,3,55,49,64,9,4,1,0,54,0)
y13=c(0.9, 0, 0, 0.692, 0,0,0,0,0,0,0,0,0.53,0.9, 0, 0, 0.692, 0,0,0,0,0,0,0,0,0,0.53)
countmatrix=data.frame(x13,stages,y13)

你编辑的函数

barplotseries <- function(y,DATA){
  DATA_subset = subset(DATA,DATA[,y]>0)      
  ggplot(data=DATA, aes_string(x="stages", fill = y))+
    geom_bar(position="stack",  fill="gray34")+
    geom_bar(data=DATA_subset,  aes(fill=stages ))
}

组合图

x=c("x13","y13")
p2=lapply(x,function(i)barplotseries(i,countmatrix))
do.call("grid.arrange", c(p2, ncol=2))

您还可以进行其他类型的子集设置,例如 y 列大于某个截止值:

barplotseries <- function(y,DATA){
  DATA_subset = subset(DATA,DATA[,y]>mean(DATA[,y])-1.96*sd(DATA[,y]))
  ggplot(data=DATA, aes_string(x="stages", fill = y))+
    geom_bar(position="stack",  fill="gray34")+
    geom_bar(data=DATA_subset,  aes(fill=stages ))
}

【讨论】:

  • 嘿伙计!太感谢了。它完美无瑕!非常感谢!
  • 你现在的子集规则是什么?希望不要太复杂=p
  • 我想删除底部 5% 的值(通过 Z 分数消除)data=subset(DATA,DATA[,y]&gt;(mean(y))-1.96*sd(y)),但它不起作用
  • 如果我输入一个像 data=subset(DATA,DATA[,y]> 0 或 1 或 2 这样的值。它可以工作,但是我输入了一个它没有的公式(比如 (mean( y))-1.96*sd(y)))
  • 你必须再次调用 DATA[,y],因为这里的 y 是一个字符.. 所以做一些类似 data=subset(DATA,DATA[,y]>(mean(DATA[,y ]))-1.96*sd(DATA[,y]))
猜你喜欢
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 2014-03-28
  • 2012-03-25
相关资源
最近更新 更多