14
votes

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?

1
@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.kraussian
Yeah, I took that comment back after looking deeper. Did you look at my new answer?Mike Wise
Notifications appear to be broken. I received no notification of your comment.Mike Wise

1 Answers

15
votes

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