R plotly - Plotting grouped lines

13,812

Oddly enough in plotly the order that you do the dplyr group_by matters (it should not I would think). Perhaps this is a bug, perhaps some kind of feature in some way I don't know about.

At this point plotly is young, and full of unexpected "bugs" like this, so be very cautious about expecting plotly to be a complete replacement for ggplot2, it is not even close at the moment, although it has some cool features for sure.

So this gets you what you want:

library(dplyr)
library(plotly) 
mpg %>%
  group_by(class,manufacturer) %>%
  summarise(models=n()) %>%
  plot_ly(x=~manufacturer, y=~models, group=~class,
                           type="scatter",color=~class, mode="lines+markers")

Yielding: enter image description here

Where as what you tried gets you a blank :

library(dplyr)
library(plotly) 
mpg %>%
  group_by(manufacturer,class) %>%
  summarise(models=n()) %>%
  plot_ly(x=~manufacturer, y=~models, group=~class,
                           type="scatter",color=~class, mode="lines+markers")

orphans the lines for some odd reason:

enter image description here

And here is your ggplot version for reference:

mpg %>%
  group_by(manufacturer, class) %>%
  summarise(models=n()) %>%
  ggplot(aes(x=manufacturer, y=models, group=class, color=class)) +
  geom_line() + geom_point() +
  theme_minimal()

enter image description here

Share:
13,812
kraussian
Author by

kraussian

Old dog trying to learn new tricks.

Updated on June 07, 2022

Comments

  • kraussian
    kraussian almost 2 years

    I am migrating over from ggplot2 to plotly, in order to take advantage of the interactive features they offer.

    I do realize that the plotly library has a ggplotly function I can use to encapsulate native ggplot commands, but I wanted to learn how to plot similar graphs using native plotly commands.

    My problem is that I can't seem to make plotly draw grouped lines the way ggplot2 does.

    Base Data, using the default mpg data set from ggplot2

    mpg %>%
      group_by(manufacturer, class) %>%
      summarise(models=n())
    
    |manufacturer |class      | models|
    |:------------|:----------|------:|
    |audi         |compact    |     15|
    |audi         |midsize    |      3|
    |chevrolet    |2seater    |      5|
    |chevrolet    |midsize    |      5|
    |chevrolet    |suv        |      9|
    |dodge        |minivan    |     11|
    |dodge        |pickup     |     19|
    |dodge        |suv        |      7|
    |ford         |pickup     |      7|
    |ford         |subcompact |      9|
    |ford         |suv        |      9|
    |honda        |subcompact |      9|
    |hyundai      |midsize    |      7|
    |hyundai      |subcompact |      7|
    |jeep         |suv        |      8|
    |land rover   |suv        |      4|
    |lincoln      |suv        |      3|
    |mercury      |suv        |      4|
    |nissan       |compact    |      2|
    |nissan       |midsize    |      7|
    |nissan       |suv        |      4|
    |pontiac      |midsize    |      5|
    |subaru       |compact    |      4|
    |subaru       |subcompact |      4|
    |subaru       |suv        |      6|
    |toyota       |compact    |     12|
    |toyota       |midsize    |      7|
    |toyota       |pickup     |      7|
    |toyota       |suv        |      8|
    |volkswagen   |compact    |     14|
    |volkswagen   |midsize    |      7|
    |volkswagen   |subcompact |      6|
    

    Example 1: This works

    mpg %>%
      group_by(manufacturer, class) %>%
      summarise(models=n()) %>%
      plot_ly(x=~class, y=~models, type="scatter", mode="lines+marker", color=~manufacturer)
    

    Example 2: But this returns only a blank plot

    Difference with Example 1 is that I'm trying to group by class instead of manufacturer.

    mpg %>%
      group_by(manufacturer, class) %>%
      summarise(models=n()) %>%
      plot_ly(x=~manufacturer, y=~models, type="scatter", mode="lines+marker", color=~class)
    

    Example 3: This is the ggplot2 version of how I would like it plotted

    mpg %>%
      group_by(manufacturer, class) %>%
      summarise(models=n()) %>%
      ggplot(aes(x=manufacturer, y=models, group=class, color=class)) +
        geom_line() +
        theme_minimal()
    

    How could I make Example 2 look like Example 3?

    • kraussian
      kraussian about 7 years
      @MikeWise Hmm I tried changing the column name to "klass" using mutate(), but it still gives me an empty plot. As for the sum, I realized I wasn't specific about the base data set. The column "models" is already a summarized value, and I've edited my post to reflect that. Thanks for pointing it out, though.
    • Mike Wise
      Mike Wise about 7 years
      Yeah, I took that comment back after looking deeper. Did you look at my new answer?
    • Mike Wise
      Mike Wise about 7 years
      Notifications appear to be broken. I received no notification of your comment.
  • kraussian
    kraussian about 7 years
    Thanks! Although I agree that that's a very weird undocumented bug/feature. And I didn't realize that plotly is still very young; perhaps I should consider using ggplotly to encapsulate ggplot instead.
  • kraussian
    kraussian about 7 years
    Oh wait, I'm using the latest plotly version 4.5.6, and it tells me that "The group argument has been deprecated. Use group_by() or split instead.". But when I replace group=~class with split=~class, plotly shows the points but not the lines.
  • Mike Wise
    Mike Wise about 7 years
    Like I said, buggy. But they are working hard on it. Check out the github issues list to see the activity.
  • hmhensen
    hmhensen almost 5 years
    Running the solution with group produces warnings. group has been deprecated. color takes care of the grouping now.
  • Marcin
    Marcin almost 4 years
    Still having problem with connecting the dots, both in my work and in provided example. Got same, unconnected-dots result... color/group_by does not help.