2011-10-25 59 views
4

我有一個數據集,看起來像這樣:情節水平系列

id  factor H1 H2 H3 H4 H5 H6 
434543 lev3 0.8 0.7 0.7 0.5 0.6 0.8 
434544 lev2 0.5 0.7 0.9 0.7 0.7 0.1 
434545 lev3 0.7 0.7 0.8 0.5 0.7 0.7 
434546 lev2 0.4 0.6 0.5 0.8 0.7 0.2 
434547 lev3 0.6 0.7 0.8 0.8 0.8 0.7 
434548 lev2 0.7 0.7 0.6 0.7 0.8 0.4 
434549 lev2 0.8 0.8 0.8 0.7 0.6 0.5 
434550 lev1 0.3 0.3 0.4 0.3 0.4 0.5 
434551 lev1 0.0 0.3 0.4 0.3 0.2 0.4 
434552 lev3 0.6 0.8 0.8 0.8 0.6 0.7 
434553 lev2 0.6 0.8 0.5 0.2 0.5 0.8 

我想繪製的均值和SD在每個時間點(H1 ... H6)的水平,但通過手段繪製一條連續的線,而不是條形圖。什麼是最好的方法來做到這一點?

+0

非常有趣的問題。即使是第一步,即在不使用循環的情況下爲每個級別和每個時間點H1..6生成平均值/ sd都將非常棘手!也許一些2個嵌套的tapply/sapply/mapply調用?但我無法想象如何。對於情節部分,請從包plotrix中查看'plotCI' - 它確實是您想要的情節類型。你可以用CI晶須(代表SD)做一條線。 – TMS

回答

5

下面是一個方法,以優良的ggplot2包。

require(ggplot2) 
require(reshape) 

# Load data 
data = read.table('data.txt', header=T) 

# Format data 
data = melt(data, id.vars=c('id', 'factor'), variable_name='time') 
data$time = as.numeric(gsub('H(.+)', '\\1', data$time)) 

# Function to summarize y at each x 
getband <- function(y.in){ 
    ymax = mean(y.in) + sd(y.in) 
    ymin = mean(y.in) - sd(y.in) 
    data.frame(ymax, ymin) 
} 

# Plot 
dev.new(width=5, height=4) 
qplot(time, value, group=factor, geom='point', color=factor, fill=factor, data=data) + 
    stat_summary(color=0, fun.data=getband, geom='ribbon', alpha=0.2) + 
    stat_summary(fun.y=mean, geom='line') 

enter image description here

+0

看起來非常好!幾乎正是我所期待的。我會用我的真實數據來嘗試。 – fletch

+0

@fletch太棒了!如果你想減少重疊繪圖,你也可以查看['position_jitter'](http://had.co.nz/ggplot2/position_jitter.html)選項。 –

+0

*錯誤:無法找到函數「融化」* - 我已經在腳本開始處添加了'require(reshape)'。 – TMS