Добавьте факторы пересечения линий в точечный график (ggplot) - PullRequest
2 голосов
/ 11 марта 2011

Я пытаюсь воспроизвести точечный график партий / случаев / обработок с линиями, пересекающими факторы в ggplot. Это что-то вроде этого графика из курса линейных моделей Дугласа Бейтса, который показывает 6 групп по оси y с непрерывным откликом по оси x со средним для каждой группы, соединенной линией: Dotplot from Bates

На примере набора данных sleepstudy, связанного с пакетом lme4, я имею:

library(ggplot2)
p <- ggplot(sleepstudy, aes(x=Reaction, y=reorder(Subject, Reaction)))
p <- p + geom_point()
print(p)

Что дает базовую точечную диаграмму с объектами на оси y в порядке увеличения времени реакции.

Затем я создаю фрейм данных со средним временем реакции для каждого субъекта:

mean_rxn <- function(df) mean(df$Reaction, na.rm=T)
sleepsummary <- ddply(sleepstudy, .(Subject), mean_rxn)

Я могу построить среднее значение для каждого предмета:

p.points <- p + geom_point(data=sleepsummary, aes(x=V1, y=reorder(Subject, V1), size=10))
print(p.points)

Но я не могу заставить линии пересекать факторы. То есть при переходе от geom_point к geom_line ничего не отображается

# does nothing
p.line <- p + geom_line(data=sleepsummary, aes(x=V1, y=reorder(Subject, V1)))
print(p.line)

У кого-нибудь есть идеи? В конечном счете, моя цель состоит в том, чтобы таким образом построить некоторые результаты модели поверх необработанных данных, поэтому методы вычисления средств «на лету» при построении исходного фрейма данных менее полезны, поскольку мне нужно получить свои данные из более сложная модель подходит.

Спасибо за любую помощь!

Ryan

Ответы [ 2 ]

5 голосов
/ 11 марта 2011

Отредактированный

Моим первым предложением было преобразование значений в числовые перед построением графика.

p.line <- p + 
  geom_line(data=sleepsummary, aes(x=V1, y=as.numeric(reorder(Subject, V1))))

Но Хэдли отмечает, что предпочтительно использовать group = 1 в решении, а не as.numeric ():

p.line <- p + 
  geom_line(data=sleepsummary, aes(x=V1, y=reorder(Subject, V1), group=1))
print(p.line)

enter image description here

3 голосов
/ 11 марта 2011

Вы также можете использовать stat_summary следующим образом:

require(lme4)
require(ggplot2)

data(sleepstudy)

ggplot(sleepstudy, aes(x = reorder(Subject, Reaction), y = Reaction)) + 
geom_point() + 
stat_summary(fun.y = mean, geom = "line", aes(group = 1)) + 
labs(x = "Subject", y = "Reaction") +
coord_flip()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...