如何在R中生成以下图?图中显示的点是平均值,它们的范围对应于最小值和最大值.我有两个文件中的数据(下面是一个例子).
x y
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
.. ...
Run Code Online (Sandbox Code Playgroud)

Lar*_*dua 118
首先:非常不幸和令人惊讶的是R无法"开箱即用"绘制错误条.
这是我最喜欢的解决方法,优点是您不需要任何额外的包.诀窍是绘制箭头(!),但用小水平条代替箭头(!!!).这个不那么直截了当的想法来自R Wiki Tips,并在此复制为一个经过深思熟虑的例子.
假设你有一个"平均值" avg向量和另一个"标准偏差"向量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)
Run Code Online (Sandbox Code Playgroud)
结果如下:

在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)
Run Code Online (Sandbox Code Playgroud)
使用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))
Run Code Online (Sandbox Code Playgroud)
如果有一个额外的分组列(OP的示例图每个x值有两个错误条,说数据来自两个文件),那么你应该在开始时获取一个数据框中的所有数据,将分组变量添加到dplyr::group_by调用中(例如,group_by(x, file)if 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)
Run Code Online (Sandbox Code Playgroud)