Как добавить коробочный график к гистограмме, используя ggMarginal в R - PullRequest
0 голосов
/ 17 октября 2018

Я хотел бы нарисовать гистограмму с кривой плотности, а затем поместить блок-график над верхним полем.Я знаю, как это сделать, используя функции 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")

Но они не работают.

1 Ответ

0 голосов
/ 18 октября 2018

Согласно документации ggMarginal, p должен быть ggplot scatterplot .Мы можем вставить следующую строку в качестве первого слоя geom в p:

geom_point(aes(y = 0.01), alpha = 0)

y = 0.01 было выбрано в качестве значения в пределах диапазона оси y существующего графика, а alpha = 0 гарантирует, что этот слой не будет

Выполнение кода с этим p должно дать вам поле с выбросом.

p <- ggplot(data=vdat, aes_string(x=vname)) + 
  geom_point(aes(y = 0.01), alpha = 0) +
  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()

p1 = ggMarginal(p, type="boxplot", margins = "x")
p1

plot

Между прочим, я не думаю, что в этом случае имеет смысл отображать блокпост справа, поскольку вы не назначили никакой переменной y.

...