ggplot: построение интервалов по оси x и среднего значения по оси y.

Предположим, что у меня есть кадр данных, который выглядит так:

data <- data.frame(y = rnorm(10,0,1), x = runif(10,0,1))

Что я хотел бы сделать, так это разрезать значения x на ячейки, например:

data$bins <- cut(data$x,breaks = 4)

Затем я хотел бы построить (используя ggplot) результат таким образом, чтобы ось x была ячейками, а ось y - средним значением точек данных $ y, которые попадают в соответствующую ячейку.

заранее спасибо


person H_A    schedule 15.10.2015    source источник
comment
Я вижу, что ваш вопрос требует сократить значения, а затем построить средние значения. Более статистически обоснованный подход к поиску бинов с использованием стандартного алгоритма в функции hist, такой как > tmp <- hist(data.x, breaks="Sturges") , а затем с использованием чего-то вроде idxs = findInterval(data.x, tmp$breaks). Затем используйте индексы для координат x в ggplot: tmp$mids[idxs] и средние значения по y, используя решение, предложенное @christoph.   -  person Sid    schedule 17.09.2017


Ответы (3)


Вы можете использовать функцию stat_summary().

library(ggplot2)
data <- data.frame(y = rnorm(10,0,1), x = runif(10,0,1))
data$bins <- cut(data$x,breaks = 4)
# Points:
ggplot(data, aes(x = bins, y = y)) +
  stat_summary(fun.y = "mean", geom = "point")

# Histogram bars:
ggplot(data, aes(x = bins, y = y)) +
  stat_summary(fun.y = "mean", geom = "histogram")

Вот фото точек:

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

person maccruiskeen    schedule 15.10.2015

Этот поток немного устарел, но вот, используйте stat_summary_bin (это может быть в более новых версиях).

ggplot(data, mapping=aes(x, y)) +
stat_summary_bin(fun.y = "mean", geom="bar", bins=4 - 1) +
ylab("mean")

Вот картинка

person chromestone    schedule 16.01.2019

Поскольку среднее значение ваших значений y может быть меньше 0, я рекомендую точечный график вместо гистограммы. Точки обозначают средства. Вы можете использовать либо qplot, либо обычную функцию ggplot. Последний более настраиваемый. В этом примере оба выдают один и тот же результат.

library(ggplot2)

set.seed(7)
data <- data.frame(y = rnorm(10,0,1), x = runif(10,0,1))
data$bins <- cut(data$x,breaks = 4, dig.lab = 2)

qplot(bins, y, data = data, stat="summary", fun.y = "mean")

ggplot(data, aes(x = factor(bins), y = y)) + 
  stat_summary(fun.y = mean, geom = "point")

Вы также можете добавить планки ошибок. В этом случае они показывают среднее значение +/- 1,96, умноженное на групповое стандартное отклонение. Среднее значение группы и стандартное отклонение можно получить с помощью tapply.

m <- tapply(data$y, data$bins, mean)
sd <- tapply(data$y, data$bins, sd)
df <- data.frame(mean.y = m, sd = sd, bin = names(m))

ggplot(df, aes(x = bin, y = mean.y, 
               ymin = mean.y - 1.96*sd, 
               ymax = mean.y + 1.96*sd)) + 
  geom_errorbar() + geom_point(size = 3)

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

person toldo    schedule 15.10.2015