Вопрос:

Точечный график с ошибками

r plot

118550 просмотра

6 ответа

397 Репутация автора

Как я могу создать следующий график в 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
..  ...

введите описание изображения здесь

Автор: sherlock85 Источник Размещён: 23.10.2012 02:29

Ответы (6)


6 плюса

106782 Репутация автора

#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)
Автор: Roland Размещён: 23.10.2012 04:09

115 плюса

4397 Репутация автора

Решение

Прежде всего: очень прискорбно и удивительно, что 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)

Результат выглядит так:

Пример точечной диаграммы с полосами ошибок 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)
Автор: Laryx Decidua Размещён: 26.02.2014 09:30

-1 плюса

82 Репутация автора

Я собрал код начала гипотетического эксперимента с десятью измерениями, воспроизведенными три раза. Просто для удовольствия с помощью других стековых потоков. Спасибо ... Очевидно, что циклы - это вариант, который applyможно использовать, но мне нравится видеть, что происходит.

#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)
Автор: ComputerNoob Размещён: 23.04.2015 03:38

8 плюса

77071 Репутация автора

Использование 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, говоря, что данные получены из двух файлов), то вы должны получить все данные в одном фрейме данных в начале, добавить переменную группировки в dplyr::group_byвызов ( например, group_by(x, file)если fileэто имя столбца) и добавить его в качестве «группы» эстетической в ggplot, например, aes(x = x, y = ymean, group = file).

Автор: Gregor Размещён: 23.04.2015 04:16

1 плюс

11 Репутация автора

Другой (более легкий - по крайней мере для меня) способ сделать это ниже.

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)
Добавить столбцы ошибок на график: среднее значение - среднее значение, среднее значение + среднее значение
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)

Надеюсь, это поможет.

Автор: aggers Размещён: 05.10.2016 03:21

3 плюса

41 Репутация автора

Подводя итог ответа Ларикс Децидуа:

определить и использовать функцию, подобную следующей

plot.with.errorbars <- function(x, y, err, ylim=NULL, ...) {
  if (is.null(ylim))
    ylim <- c(min(y-err), max(y+err))
  plot(x, y, ylim=ylim, pch=19, ...)
  arrows(x, y-err, x, y+err, length=0.05, angle=90, code=3)
}

где можно переопределить автоматический ylim , а также передать дополнительные параметры, такие как main , xlab , ylab .

Автор: Ehud Schreiber Размещён: 04.03.2018 01:03
Вопросы из категории :
32x32