Search code examples
rggplot2plotlyggplotly

ggplot version of dotplot


Curious how to plot this dotplot using ggplot or plotly library functions. Also label the mpg values on individual dots.

# Dotplot: Grouped Sorted and Colored
# Sort by mpg, group and color by cylinder 
x <- mtcars[order(mtcars$mpg),] # sort by mpg
x$cyl <- factor(x$cyl) # it must be a factor
x$color[x$cyl==4] <- "red"
x$color[x$cyl==6] <- "blue"
x$color[x$cyl==8] <- "darkgreen"    
dotchart(x$mpg,labels=row.names(x),cex=.7,groups= x$cyl,
         main="Gas Milage for Car Models\ngrouped by cylinder",
         xlab="Miles Per Gallon", gcolor="black", color=x$color)

enter image description here


Solution

  • With a quick clean up of the rownames to be a column you can do the following.

    We used factor() for the aesthetics for color so that it becomes discrete/ When faceting to acheive this look you need to specify "free_y" for scale and space.

    Base

    library(tidyverse)
    mtcars2 = rownames_to_column(mtcars, "car")
    ggplot(mtcars2, aes(x = mpg, y = factor(car), color = factor(cyl))) + 
      geom_point(shape = 1) + 
      facet_grid(cyl ~ ., scales = "free_y", space = "free_y") + 
      theme_bw() + 
      theme(panel.grid = element_blank(),
            panel.grid.major.y = element_line(size=.1, color="grey90"),
            legend.position = "none") +
      ggtitle("Gas Milage for Car Models\ngrouped by cylinder") + 
      xlab("Miles Per Gallon") +
      ylab("")
    

    enter image description here


    Adding Text

    ggplot(mtcars2, aes(x = mpg, y = factor(car), color = factor(cyl))) + 
      geom_point(shape = 1) + 
      geom_text(aes(label = mpg), colour = "grey40", size = 3, hjust = -0.3) + 
      facet_grid(cyl ~ ., scales = "free_y", space = "free_y") + 
      theme_bw() + 
      theme(panel.grid = element_blank(),
            panel.grid.major.y = element_line(size=.1, color="grey90"),
            legend.position = "none") +
      ggtitle("Gas Milage for Car Models\ngrouped by cylinder") + 
      xlab("Miles Per Gallon") +
      ylab("")
    

    enter image description here

    You can probably use geom_label instead but geom_text works great here.