R: Как: 3D-график плотности с gplot и geom_density

Я пытаюсь объединить графики с несколькими плотностями с наложением. ggplot и geom_density выполняют свою работу, но плотности накладываются друг на друга.Это наложение, но не 3D

ggplot(all.complete, aes(x=humid_temp)) +  
  geom_density(aes(group=height, colour=height, fill=height.f, alpha=0.1)) + 
  guides(fill = guide_legend(override.aes = list(colour = NULL))) +
  labs(main="Temperature by Height", x="Temperature", y="Density")

Я пытаюсь добиться чего-то подобного: Плотность? с 3D-наложением

В моем случае годы будут заменены ростом.

Спасибо!!!


person rafaelvalle    schedule 23.09.2014    source источник
comment
И после этого можем ли мы увидеть набор контурных графиков, расположенных псевдоперпендикулярно временной оси? Нет, правда. Я не проявляю здесь свой обычный сарказм. Я думаю, что это сделано в книге «Решетки», рис. 14.3 (но не в псевдотрехмерном расположении).   -  person IRTFM    schedule 23.09.2014
comment
ggplot не занимается 3D-графикой. Если вам нужен нижний график, вам придется использовать другой пакет. Вы можете попробовать аспекты, но с таким количеством групп, которые могут быть неинформативными.   -  person jlhoward    schedule 23.09.2014


Ответы (3)


Я знаю это старое, но другие люди с такой проблемой могут наткнуться на этот пост, поэтому я решил добавить недавно обнаруженное решение. Существует новый пакет, который был только что создан именно для такого типа визуализации, он называется ggjoy и предназначен для работы с системой ggplot2.

Всю информацию можно найти здесь: https://github.com/clauswilke/ggjoy

Надеюсь, это может помочь!

person Daniel    schedule 17.07.2017
comment
Ну наконец то! Спасибо, Даниэль! - person rafaelvalle; 18.07.2017
comment
Похоже, что пакет ggjoy устарел. См.: [cran.r-project.org/web/ пакеты/ggjoy/виньетки/ - person Benoit Lamarsaude; 31.05.2018

Диаграмма, которую вы ищете, называется графиком хребта. Попробуйте пакет ggridges с ggplot2.

Пример с временными данными:

library(viridis)
ggplot(lincoln_weather, aes(x = `Mean Temperature [F]`, y = `Month`, fill = ..x..)) +
  geom_density_ridges_gradient(scale = 3, rel_min_height = 0.01, gradient_lwd = 1.) +
  scale_x_continuous(expand = c(0.01, 0)) +
  scale_y_discrete(expand = c(0.01, 0)) +
  scale_fill_viridis(name = "Temp. [F]", option = "C") +
  labs(title = 'Temperatures in Lincoln NE',
       subtitle = 'Mean temperatures (Fahrenheit) by month for 2016\nData: Original CSV from the Weather Underground') +
  theme_ridges(font_size = 13, grid = TRUE) + theme(axis.title.y = element_blank())

Вот результат:

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

person Benoit Lamarsaude    schedule 02.04.2018

Как упоминал @jlhoward, использование фасетов может работать или использование подзаговоров, но любой вариант плохо масштабируется с большим количеством групп. Вместо этого рассмотрите возможность использования графика ecdf.

Без данных в вашем объекте all.complete я не могу воссоздать ваш сюжет, поэтому вот упрощенный пример:

library(ggplot2)

ggplot(iris, aes(x = Sepal.Length)) +  
  geom_density(aes(group = Species, 
                   colour = Species, 
                   fill = Species),
               alpha = 0.2)

График плотности

Для более чем пары групп я обнаружил, что графики ecdf намного легче интерпретировать. Чтобы сделать аналогичный сюжет:

 ggplot(iris, aes(x = Sepal.Length)) +  
  stat_ecdf(aes(color = Species))

график ecdf

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

Это сообщение в блоге, которое заставило меня начать использовать графики ecdf и содержит больше информации о них: http://allendowney.blogspot.com/2013/08/are-my-data-normal.html

person Eric Watt    schedule 11.09.2016