Я хотел бы нарисовать гистограмму с кривой плотности, а затем поместить блок-график над верхним полем.Я знаю, как это сделать, используя функции hist()
, boxplot()
и layout()
или используя функции из пакетов ggplot2
и grid
.Однако я ищу конкретное решение, использующее ggplot2
и функцию ggMarginal()
в пакете ggExtra
.Давайте смоделируем некоторые данные, прежде чем я представлю свою проблему:
library(ggplot2)
library(ggExtra)
set.seed(1234)
vdat = data.frame(V1 = c(sample(1:10, 100, T), 99))
vname = colnames(vdat)[1]
boxplot(vdat[[vname]], horizontal = T)
Отметим, что я явно вставляю выброс 99 в выборку чисел от 1 до 10. Следовательно, когда я рисую блокпост, должно отображаться 99как выброс.
Я легко могу нарисовать гистограмму, используя ggplot2
.
p = ggplot(data=vdat, aes_string(x=vname)) +
geom_histogram(aes(y=stat(density)),
bins=nclass.Sturges(vdat[[vname]])+1,
color="black", fill="steelblue", na.rm=T) +
geom_density(na.rm=T) +
theme_bw()
p
Когда я пытаюсь использовать ggMarginal
, чтобы добавить маргинальное поле, добавленные поля не являются правильными.
p1 = ggMarginal(p, type="boxplot")
p1
Поле справа может быть справа.Но тот сверху, который мне нужен, определенно не прав.Выброс 99 отсутствует, а медиана явно не верна.
Когда я пытаюсь предоставить не p1
, а исходные данные, x
и y
, как указано в справочной документации, я получаю правильное поле, но гистограмма исчезла.
p2 = ggMarginal(data=vdat, x=vname, y=NA, type="boxplot", margins="x")
p2
Как я могу объединить правильные части p1 и p2 так, чтобы у меня была гистограмма от p1 и блокпост от p2?
Я пытаюсь что-то вроде
p1 + p2
или
ggMarginal(p1, data=vdat, x=vname, y=NA, type="boxplot", margins="x")
Но они не работают.