R: How to : 3d Density plot with gplot and geom_density

别说谁变了你拦得住时间么 提交于 2020-01-09 19:08:48

问题


I'm trying to combine multiple density plots with overlay. ggplot and geom_density do the job, but the densities are stacked on top of each other.

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")

Something similar to this is what I'm trying to achieve:

In my case, the years would be substituted by height.

Thanks!!!


回答1:


I know this old, but other people with this kind of issue may stumble upon this post, so I thought I'd add a recently discovered solution. There is a new package that was just created to do exactly this type of visualization and it is called ggjoy and is designed to work with the ggplot2 system.

All of the info can be found here: https://github.com/clauswilke/ggjoy

Hope this can be of help!




回答2:


The chart you are looking for is called a ridgelineplot. Try the ggridges package with ggplot2.

An example with temporal data:

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())

Here is the result :




回答3:


As @jlhoward mentioned, using facets could work, or using subplots, but either option doesn't scale well with a large number of groups. Consider using an ecdf plot instead.

Without the data in your object all.complete, I can't recreate your plot, so here is a simplified example:

library(ggplot2)

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

For more than a couple groups, I've found ecdf plots to be much easier to interpret. To make a similar plot:

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

You can have dozens of ecdf plots on the same plot, and since they are just lines they are still separate enough to view. Density plots or histograms would be too overlapped, as in your example.

This is the blog post that got me to start using ecdf plots and has more info about them: http://allendowney.blogspot.com/2013/08/are-my-data-normal.html



来源:https://stackoverflow.com/questions/25985159/r-how-to-3d-density-plot-with-gplot-and-geom-density

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!