散点图与错误栏

我怎样才能在R中产生下面的图? 图中显示的点是平均值,其范围对应于最小值和最大值。 我有两个文件中的数据(下面是一个例子)。

xy 1 0.8773 1 0.8722 1 0.8816 1 0.8834 1 0.8759 1 0.8890 1 0.8727 2 0.9047 2 0.9062 2 0.8998 2 0.9044 2 0.8960 .. ... 

在这里输入图像描述

首先, R不能“开箱即用”地画错误栏 ,这是非常不幸和令人惊讶的。

这是我最喜欢的解决方法,好处是你不需要任何额外的软件包 。 诀窍是绘制箭头(!),但用小横杠代替箭头(!!!)。 这个不那么简单的想法来自R维基提示 ,在这里作为一个解决的例子被转载。

假设您有一个“平均值” avgvector和另一个“标准偏差” sdev ,它们具有相同的长度n 。 我们以横坐标为这些“测量”的数目,所以x <- 1:n 。 使用这些,这里来的绘图命令:

 plot(x, avg, ylim=range(c(avg-sdev, avg+sdev)), pch=19, xlab="Measurements", ylab="Mean +/- SD", main="Scatter plot with std.dev error bars" ) # hack: we draw arrows but with very special "arrowheads" arrows(x, avg-sdev, x, avg+sdev, length=0.05, angle=90, code=3) 

结果如下所示:

示例散点图与std.dev错误栏

arrows(...)函数length=0.05是以英寸为单位的“箭头”的大小, angle=90指定“箭头”与箭头的轴垂直,特别直观的code=3参数指定我们要在箭头的两端绘制一个箭头。

对于水平误差条,以下更改是必要的,假定sdev向量现在包含x值中的误差, y值是纵坐标:

 plot(x, y, xlim=range(c(x-sdev, x+sdev)), pch=19,...) # horizontal error bars arrows(x-sdev, y, x+sdev, y, length=0.05, angle=90, code=3) 

使用ggplot和一个小dplyr进行数据处理:

 set.seed(42) df <- data.frame(x = rep(1:10,each=5), y = rnorm(50)) library(ggplot2) library(dplyr) df.summary <- df %>% group_by(x) %>% summarize(ymin = min(y), ymax = max(y), ymean = mean(y)) ggplot(df.summary, aes(x = x, y = ymean)) + geom_point(size = 2) + geom_errorbar(aes(ymin = ymin, ymax = ymax)) 

如果还有一个分组列(OP的示例图中每个x值有两个错误条,说明数据来源于两个文件),那么您应该在一个数据框中获取所有数据,将分组variables添加到dplyr::group_by调用(例如, group_by(x, file)如果file是列的名称)并且将其作为ggplot中的“​​组”审美添加,例如aes(x = x, y = ymean, group = file)

 #some example data set.seed(42) df <- data.frame(x = rep(1:10,each=5), y = rnorm(50)) #calculate mean, min and max for each x-value library(plyr) df2 <- ddply(df,.(x),function(df) c(mean=mean(df$y),min=min(df$y),max=max(df$y))) #plot error bars library(Hmisc) with(df2,errbar(x,mean,max,min)) grid(nx=NA,ny=NULL) 

另一个(更简单 – 至less对我来说)是这样做的。

 install.packages("ggplot2movies") data(movies, package="ggplot2movies") 

绘制平均长度与评分

 rating_by_len = tapply(movies$length, movies$rating, mean) plot(names(rating_by_len), rating_by_len, ylim=c(0, 200) ,xlab = "Rating", ylab = "Length", main="Average Rating by Movie Length", pch=21) 

添加误差棒的情节:平均值 – SD,平均值+ SD

 sds = tapply(movies$length, movies$rating, sd) upper = rating_by_len + sds lower = rating_by_len - sds segments(x0=as.numeric(names(rating_by_len)), y0=lower, y1=upper) 

希望有所帮助。

我把三个重复的十次测量结合在一起,开始完成一个假设实验的代码。 只是为了有趣的其他stackoverflowers的帮助。 谢谢…显然循环是一个选项,因为可以使用,但我喜欢看到会发生什么。

 #Create fake data x <-rep(1:10, each =3) y <- rnorm(30, mean=4,sd=1) #Loop to get standard deviation from data sd.y = NULL for(i in 1:10){ sd.y[i] <- sd(y[(1+(i-1)*3):(3+(i-1)*3)]) } sd.y<-rep(sd.y,each = 3) #Loop to get mean from data mean.y = NULL for(i in 1:10){ mean.y[i] <- mean(y[(1+(i-1)*3):(3+(i-1)*3)]) } mean.y<-rep(mean.y,each = 3) #Put together the data to view it so far data <- cbind(x, y, mean.y, sd.y) #Make an empty matrix to fill with shrunk data data.1 = matrix(data = NA, nrow=10, ncol = 4) colnames(data.1) <- c("X","Y","MEAN","SD") #Loop to put data into shrunk format for(i in 1:10){ data.1[i,] <- data[(1+(i-1)*3),] } #Create atomic vectors for arrows x <- data.1[,1] mean.exp <- data.1[,3] sd.exp <- data.1[,4] #Plot the data plot(x, mean.exp, ylim = range(c(mean.exp-sd.exp,mean.exp+sd.exp))) abline(h = 4) arrows(x, mean.exp-sd.exp, x, mean.exp+sd.exp, length=0.05, angle=90, code=3)