How to combine the fill and alpha aesthetics from two different geoms when using ggplotly

331 Views Asked by At

I am trying to add a relief to an interactive choropleth map. I saw that in a non-interactive setting this can be done using the alpha scale of geom_raster and the fill scale of geom_polygon. This works just fine:

library(ggplot2)
library(plotly)

# load raster data
volcano_raster <- as.data.frame(volcano)
volcano_raster <- reshape(data = volcano_raster,
                          direction = "long",
                          varying = colnames(volcano_raster),
                          timevar = "y",
                          v.names = "alpha",
                          idvar = "x")[,c("x", "y", "alpha")]
rownames(volcano_raster) <- NULL
volcano_raster$f <- 0

# create polygon data
volcano_polygon <- data.frame(x = c(1, 25, 25, 1, 25, 50, 50, 25, 50, 75, 75, 50, 75, 87, 87, 75),
                              y = rep(c(61, 61, 1, 1), 4),
                              order = rep(1:4, 4),
                              group = rep(1:4, each = 4),
                              fill = rep(1:4, each = 4))

# create plot (works)
p <- ggplot()
p <- p + geom_polygon(data = volcano_polygon,
                      aes(x = x,
                          y = y,
                          fill = fill,
                          group = group))
p <- p + geom_raster(data = volcano_raster,
                     aes(x = x, y = y, alpha = alpha))
p

Plot when using ggplot

But as soon as I try to make it interactive through ggplotly, R complains that the fill aesthetic is missing:

ggplotly(p)
Error in `[.data.frame`(g, , c("fill_plotlyDomain", "fill")) : 
  undefined columns selected

To avoid this error I tried to add a dummy fill aesthetic. However, then ggplotly does not display the alpha shading:

# create plot (works)
p <- ggplot()
p <- p + geom_polygon(data = volcano_polygon,
                      aes(x = x,
                          y = y,
                          fill = fill,
                          group = group))
p <- p + geom_raster(data = volcano_raster,
                     aes(x = x, y = y, fill = 0, alpha = alpha))
ggplotly(p)

Plot when using ggplotly

I know from here that ggplotly can combine the fill and alpha aesthetics when using one geom. This also works in my case:

p <- ggplot()
p <- p + geom_polygon(data = volcano_polygon,
                      aes(x = x,
                          y = y,
                          fill = fill,
                          group = group,
                          alpha = fill))
ggplotly(p)

Plot when using fill and alpha from the same geom

Unfortunately, I cannot figure out how to create a plot using ggplotly that uses the fill aesthetic of one geom and the alpha aesthetic of another.

EDIT:

This post describes a workaround through using geom_point instead of geom_raster. However, the size of geom_point (unlike width of geom_bar) is given in pixels and not relative to the resolution. As a result it's very hard to find the correct value for the size argument, making it rather impractical for an interactive setting.

0

There are 0 best solutions below