возможно ли создать ggMarginal график без десагрегирования данных?

#r #ggplot2

#r #ggplot2

Вопрос:

У меня есть фрейм данных с некоторыми точками и их частотой появления, и я хочу построить точки (шары), используя их частоту для представления их размера. Но я также хочу использовать ggMarginal для создания маргинальных графиков. Приведенный ниже код создает маргинальные значения без учета их частот.

 library(ggplot2)
df <- data.frame("x" = 1:5, "y" = c(5,8,8,12,10), "f" = c(4,5,8,8,5))
p <- ggplot(df, aes(x=x, y=y, size=f))   geom_point()   theme_bw()
ggExtra::ggMarginal(p, data=df, type = "histogram")
  

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

Я не хочу создавать еще один фрейм данных с дезагрегированными данными. Но это привело бы к правильным маргиналам. Как показано ниже:

 # disaggregated data
df2 <- df[ rep(1:nrow(df), df$f), c("x", "y") ]
p <- ggplot(df2, aes(x=x, y=y))   geom_point()   theme_bw()
ggExtra::ggMarginal(p, data=df2, type = "histogram")
  

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

Но даже если я попытаюсь использовать оба фрейма данных, результирующие маргиналы все равно будут ошибочными.

 p <- ggplot(df, aes(x=x, y=y, size=f))   geom_point()   theme_bw()
ggExtra::ggMarginal(p, data=df2, type = "histogram")
  

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

  1. Возможно ли создать маргиналы с дезагрегированием данных? Как?
  2. Если 1. невозможно, как это сделать в любом случае, поскольку ни один из приведенных выше примеров не предоставил желаемый график?

Комментарии:

1. это последний код … все еще неверный.

2. маргиналы на втором графике правильные, остальные неправильные

3. p <- ggplot(df2, aes(x=x, y=y)) geom_point() geom_count() theme_bw(); ggExtra::ggMarginal(p, data = df2, type = "histogram")

Ответ №1:

Это можно сделать с cowplot помощью package .

 library(tidyverse)
library(cowplot)

df <- data.frame("x" = 1:5, 
                 "y" = c(5,8,8,12,10), 
                 "f" = c(4,5,8,8,5))
df2 <- df[rep(1:nrow(df), df$f), c("x", "y") ]

p <- 
  ggplot(df, aes(x=x, y=y, size=f))   
  geom_count()   
  theme_bw()
xhist <- 
  axis_canvas(p, axis = "x")   
  geom_histogram(data = df2, aes(x = x), color = 'lightgray')
yhist <-
  axis_canvas(p, axis = "y", coord_flip = TRUE)   
  geom_histogram(data = df2, aes(x = y), color = 'lightgray')  
  coord_flip()
p %>%
  insert_xaxis_grob(xhist, grid::unit(1, "in"), position = "top") %>%
  insert_yaxis_grob(yhist, grid::unit(1, "in"), position = "right") %>%
  ggdraw()
  

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