R plotly - Plotting grouped lines
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")
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:
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()
Comments
-
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 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 about 7 yearsYeah, I took that comment back after looking deeper. Did you look at my new answer?
-
Mike Wise about 7 yearsNotifications appear to be broken. I received no notification of your comment.
-
-
kraussian about 7 yearsThanks! 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 about 7 yearsOh 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 about 7 yearsLike I said, buggy. But they are working hard on it. Check out the github issues list to see the activity.
-
hmhensen almost 5 yearsRunning the solution with
group
produces warnings.group
has been deprecated.color
takes care of the grouping now. -
Marcin almost 4 yearsStill 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.