2018-08-22把gglot2默认图变漂亮

作者: iColors | 来源:发表于2018-08-22 09:57 被阅读91次

    一直以为ggplot图给出的默认图很丑,后来才觉得这蕴含了大量的智慧,如果一开始就给出漂亮的图,大家就懒的改,将来就会千篇一律。一开始丑一点,后头可以千姿百态、姹紫嫣红。说归说,改theme的方法有很多,下面就是一例。

    来自网络博客https://www.jumpingrivers.com/blog/styling-ggplot2-r-graphics/

    Styling ggplot2 graphics

    In my previous post, we demonstrated that contrary to popular opinion, it is possible to generate attractive looking plots using just base graphics. Although we did confess, that it did take a lot of time and effort. In this post, we repeat the same exercise. Using the dreaded irisdata set, we’ll first create the default ggplot2 graph, before applying a bit of care and attention.

    The standard ggplot version

    The standard scatter plot is straightforward to create. Load the package

    library("ggplot2")
    

    Then create a scatter plot with the wonderful grey background

    ## ggplot2 even spells colour correctly ;)
    ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + 
      geom_point(aes(colour = Species))
    
    image

    Unlike the base R offering, the list of possible improvements to this plot is pleasingly short. Basically, it’s

    • the axis labels (but they come from our column headings)
    • colours (red & blue aren’t the best combination)

    So overall, pretty good. Other aspects that could be improved are

    • grey background
    • direct labels on the points
    • starting the x-axis at 4, not 4.2

    Styling the plot using only ggplot2

    Using only ggplot2 (and a little bit of dplyr love), we can improve significantly and easily improve the graph. First, we’ll capitalise the legend key. I find it easier to manipulate the data directly,

    library("dplyr")
    iris = mutate(iris, Species = stringr::str_to_title(Species))
    

    With the data tweaked, we can get to the serious business of styling the plot. As the plot will contain a number of components it makes sense to create intermediate objects. As the points overlap, we’ll change from geom_point(), to geom_jitter(). This geom wiggles the points and allow us to see overlapping points:

    g = ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + 
      geom_jitter(aes(colour = Species)) + 
      xlab("Sepal length") + ylab("Sepal width") + # Improve axis labels
      ggtitle("The infamous Iris plot") # Title
    g
    
    image

    The changes we’ve made so far would impossible for any package to do for us – how would the package know the plot title? We can now improve the look and feel of the plot. There are two ways of complementary ways of doing this: scales and themes. The ggplot scales control things like colours and point size. In the latest version of ggplot2, version 3.0.0, the Viridis colour palette was introduced. This palette is particularly useful for creating colour-blind friendly palettes

    g + scale_colour_viridis_d() # d for discrete
    

    The theme controls elements such as grid lines, fonts, labels. I’m partial to theme_minimal()

    g + scale_colour_viridis_d() + 
      theme_minimal()
    
    image

    The hrbrthemes package

    We don’t just have to use the themes that come with ggplot2, we can use themes provided by other packages. The hrbrthemes packages contain a nice theme called ipsum that’s similar to the minimal theme, but also tweaks the font and allows sub-headings. There is also an associated colour scheme called scale_colour_ipsum()`. An additional improvement we’ll make, is to drop the legend and place the text directly on the chart. After loading the package

    library("hrbrthemes")
    

    we create a data frame with the label positions

    labels = data.frame(x = c(5, 5.3, 7), y = c(4.2, 2.1, 3.7), 
                        Species = c("Setosa", "Versicolor", "Virginica"))
    

    We construct the plot as usual

    ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width)) + 
      geom_jitter(aes(colour = Species)) + 
      theme_ipsum() + 
      labs(x = "Sepal length", y="Sepal width",
           title = "The infamous Iris data set",
           subtitle = "Thanks @hrbrmstr for the theme",
           caption = "jumpingrivers.com") + 
      scale_colour_ipsum(guide = FALSE) + 
      geom_text(data = labels, aes(x, y, label = Species, colour = Species)) + 
      xlim(c(4, 8))
    
    image

    Notice we can add data from two data sets onto a ggplot with relative ease.

    Thanks for reading, see you next time!

    相关文章

      网友评论

        本文标题:2018-08-22把gglot2默认图变漂亮

        本文链接:https://www.haomeiwen.com/subject/nsjeiftx.html