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

后端 未结 3 514
轻奢々
轻奢々 2020-12-14 23:21

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.

相关标签:
3条回答
  • 2020-12-14 23:41

    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 :

    0 讨论(0)
  • 2020-12-14 23:48

    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!

    0 讨论(0)
  • 2020-12-14 23:52

    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

    0 讨论(0)
提交回复
热议问题