Передать измененный геом от объекта другому ggplot - PullRequest
0 голосов
/ 07 июня 2019

Сначала я строю график

   df <- data.frame(x = c(1:40, rep(1:20, 3), 15:40))
    p <- ggplot(df, aes(x=x, y = x)) +
      stat_density2d(aes(fill='red',alpha=..level..),geom='polygon', show.legend = F)

Затем я хочу изменить значения geom_density и использовать их на другом графике.

# build plot 
q <- ggplot_build(p)

# Change density
dens <- q$data[[1]]     
dens$y <- dens$y - dens$x 

Построить другой график, используя измененные плотности, что-то вроде этого:

  # Built another plot
    ggplot(df, aes(x=x, y =1)) + 
      geom_point(alpha = 0.3) +
      geom_density2d(dens)

Это не работает, но есть ли способ сделать это?


РЕДАКТИРОВАТЬ: делать это при наличии нескольких групп :

df <- data.frame(x = c(1:40, rep(1:20, 3), 15:40), group = c(rep('A',40), rep('B',60), rep('C',26)))
p <- ggplot(df, aes(x=x, y = x)) +
  stat_density2d(aes(fill=group,alpha=..level..),geom='polygon', show.legend = F)

q <- ggplot_build(p)
dens <- q$data[[1]]     
dens$y <- dens$y - dens$x

ggplot(df, aes(x=x, y =1)) + 
  geom_point(aes(col = group), alpha = 0.3) +
  geom_polygon(data = dens, aes(x, y, fill = fill, group = piece, alpha = alpha)) +
  scale_alpha_identity() +
  guides(fill = F, alpha = F)

Результаты применительно к моему собственному набору данных Хотя это именно то, что яищу цвета заливки, которые не соответствуют начальным цветам (связаны с A, B и C): enter image description here

1 Ответ

1 голос
/ 08 июня 2019

Как это? Возможно построить преобразование форм, нанесенных на geom_density. Но это не совсем то же самое, что манипулирование основной плотностью ...

ggplot(df, aes(x=x, y =1)) + 
  geom_point(alpha = 0.3) +
  geom_polygon(data = dens, aes(x, y, fill = fill, group = piece, alpha = alpha)) +
  scale_alpha_identity() +
  guides(fill = F, alpha = F)

enter image description here


Edit - OP теперь имеет несколько групп. Мы можем построить те с кодом ниже, который производит художественный сюжет сомнительной полезности. Он делает то, что вы предлагаете, но я хотел бы предположить, что было бы более плодотворно преобразовать исходные данные и обобщить их, если вы ищете репрезентативный результат.

ggplot(df, aes(x=x, y =1)) + 
  geom_point(aes(col = group), alpha = 0.3) +
  geom_polygon(data = dens, aes(x, y, fill = group, group = piece, alpha = alpha)) +
  scale_alpha_identity() +
  guides(fill = F, alpha = F) +
  theme_minimal()

enter image description here

...