#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. невозможно, как это сделать в любом случае, поскольку ни один из приведенных выше примеров не предоставил желаемый график?
Комментарии:
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()