Make your ggplots shareable, collaborative, and with D3

April 17, 2014

(This article was first published on rOpenSci Blog - R, and kindly contributed to R-bloggers)

Editor's note: This is a guest post from Matt Sundquist form the team.

You can access the source code for this post at

Ggplotly and Plotly's R API let you make ggplot2 plots, add py$ggplotly(), and make your plots interactive, online, and drawn with D3. Let's make some.

1. Getting Started and Examples

Here is Fisher's iris data.

ggiris <- qplot(Petal.Width, Sepal.Length, data = iris, color = Species)

Let's make it in Plotly. Install:

install_github("plotly", "ropensci")


## Loading required package: RCurl
## Loading required package: bitops
## Loading required package: RJSONIO

Sign up online, use our public keys below, or sign up like this:

signup("new_username", "[email protected]")

That should have responded with your new key. Use that to create a plotly interface object, or use ours:

py <- plotly("RgraphingAPI", "ektgzomjbx")

It just works.


The call opens a browser tab. Or in an .Rmd document, the plot is embedded if you specify the plotly=TRUE chunk option (see source). If you're running this from the source, it makes all the graphs at once in your browser. Reaction my first time: here be dragons.

If you click the data and graph link in the embed, it takes you to Plotly's GUI, where you can edit the graph, see the data, and share your plot with collaborators.

1.2 Maps

Next: Maps!

data(canada.cities, package="maps")
viz <- ggplot(canada.cities, aes(long, lat)) +
  borders(regions="canada", name="borders") +
  coord_equal() +
  geom_point(aes(text=name, size=pop), colour="red", alpha=1/2, name="cities")

Call Plotly.


1.3 Scatter

Want to make a scatter and add a smoothed conditional mean? Here's how to do it in Plotly. For the rest of the plots, we'll just print the Plotly version to save space. You can hover on text to get data, or click and drag across a section to zoom in.

model <- lm(mpg ~ wt + factor(cyl), data=mtcars)
grid <- with(mtcars, expand.grid(
  wt = seq(min(wt), max(wt), length = 20),
  cyl = levels(factor(cyl))

grid$mpg <- stats::predict(model, newdata=grid)

viz2 <- qplot(wt, mpg, data=mtcars, colour=factor(cyl)) + geom_line(data=grid)

1.4 Lines

Or, take ggplotly for a spin with the orange dataset:

orange <- qplot(age, circumference, data = Orange, colour = Tree, geom = "line")

1.5 Alpha blend

Or, make plots beautiful.

prettyPlot <- ggplot(data=diamonds, aes(x=carat, y=price, colour=clarity))
prettyPlot <- prettyPlot + geom_point(alpha = 1/10)

1.6 Functions

Want to draw functions with a curve?

eq <- function(x) {x*x}
tmp <- data.frame(x=1:50, y=eq(1:50))

# Make plot object
p <- qplot(x, y, data=tmp, xlab="X-axis", ylab="Y-axis")
c <- stat_function(fun=eq)

py$ggplotly(p + c)

2. A GitHub for data and graphs

Like we might work together on code on GitHub or a project in a Google Doc, we can edit graphs and data together on Plotly. Here's how it works:

  • Your URL is shareable.
  • Public use is free.
  • You can set the privacy of your graph.
  • You can edit and add to plots from our GUI or with R or APIs for Python, MATLA, Julia, Perl, Arduino, Raspberry Pi, and REST.
  • You get a profile of graphs, like Rhett Allain from Wired Science.
  • You can embed interactive graphs in iframes.

2.1 Inspiration and team

Plotly's API is part of [rOpenSci](, being developed by the brilliant Toby Hocking, and on GitHub. Your thoughts, issues, and pull requests are welcome. Right now, you can make scatter and line plots; let us know what you'd like to see next.

The project was inspired by Hadley Wickham and the elegance and precision of ggplot2. Thanks to Scott Chamberlain, Joe Cheng, and Elizabeth Morrison-Wells for their help.

3. ggthemes and Plotly

Using ggthemes opens up another set of custom graph filters for styling your graphs. To get started, you'll want to install ggthemes.

install_github("ggthemes", "jrnold")

and load your data.

dsamp <- diamonds[sample(nrow(diamonds), 1000), ]

Inverse gray.

gray <- (qplot(carat, price, data = dsamp, colour = cut) + 

The Tableau scale.

tableau <- (qplot(carat, price, data = dsamp, colour = cut) + 
              theme_igray() + 

Stephen Few's scale.

few <- (qplot(carat, price, data = dsamp, colour = cut) + 
          theme_few() + 
## Error: Failed connect to; Operation timed out

To leave a comment for the author, please follow the link and comment on their blog: rOpenSci Blog - R. offers daily e-mail updates about R news and tutorials on topics such as: Data science, Big Data, R jobs, visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...

If you got this far, why not subscribe for updates from the site? Choose your flavor: e-mail, twitter, RSS, or facebook...

Comments are closed.


Mango solutions

RStudio homepage

Zero Inflated Models and Generalized Linear Mixed Models with R

Quantide: statistical consulting and training


CRC R books series

Contact us if you wish to help support R-bloggers, and place your banner here.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)