带有误差条的散点图

she*_*k85 48 plot r

如何在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)

结果如下:

示例散点图与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)
Run Code Online (Sandbox Code Playgroud)

  • “以及特别直观的‘code=3’参数”讽刺指出:D :D (2认同)

Gre*_*gor 8

使用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).


Rol*_*and 6

#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)