2012-09-26 41 views
2

我有示出三种状态一个vioplot:R为状态概率

library(vioplot) 
state1 <- rnorm(100,5,2) 
state2 <- rnorm(100,8,3) 
state3 <- rnorm(100,12,0.5) 
vioplot(state1,state2, state3, names=c("a", "b", "c"), col="green") 

如何添加到该图以图形方式显示 即发生STATE1的概率是0.3, state2是0.2,state3是0.5?

或者有更好的方式来表示这种图形?

谢谢你的帮助。

+1

我试图找出一种方法来使宽度与概率成比例(可能太聪明了?),但我很确定'vioplot'不会在没有一些黑客攻击的情况下做到这一点,而且我无法确定了解如何诱导'ggplot2 :: geom_violing()'做到这一点(虽然它可能是) –

回答

2

以下是Ben Bolker建议根据给定状态概率对密度估计的面积进行加权的示例(我相信)。我使用ggplot2的权值参数来做到这一点,它似乎需要一些黑客来允许vioplot函数允许一个权重函数(虽然这将是有用的,见related discussion on crossvalidated)。

enter image description here

library(ggplot2) 
library(reshape2) 

state1 <- rnorm(100,5,2) 
state2 <- rnorm(100,8,3) 
state3 <- rnorm(100,12,0.5) 
state1_w <- rep(0.3, 100) 
state2_w <- rep(0.2, 100) 
state3_w <- rep(0.5, 100) 

state_df1 <- data.frame(cbind(state1,state2,state3)) 
state_df2 <- data.frame(cbind(state1_w,state2_w,state3_w)) 
#now to reshape and merge 
state_melt1 <- melt(state_df1, measure.vars = c("state1","state2","state3"), variable.name = "State_Num", value.name = "State_Value") 
state_melt2 <- melt(state_df2, measure.vars = c("state1_w","state2_w","state3_w"), variable.name = "State_W", value.name = "State_WValue") 
state_melt <- data.frame(state_melt1,state_melt2) 

#now making the plot 
p1 <- ggplot(data = state_melt, aes(State_Num,State_Value,weight = State_WValue)) 
p1 + geom_violin(fill = "green") 

你会得到一些错误信息,说的权重不增加一个,但在这里,我们希望地区正比于他们的状态空间的概率。

+0

非常感谢您的帮助 –

2
text(x=(1:3)+.2, y=-0.5, 
     labels=paste0("prob=\n", 
        round(sapply(list(state1, state2, state3), mean)/ 
             length(c(state1, state2, state3)) 
          ,2)))