Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

filled.contour vs. ggplot2 + stat_contour

Tags:

r

ggplot2

I am new to ggplot2, and I am trying to replicate a graph that I created using filled.contour with ggplot2.

below is my code:

require(ggplot2)
require(reshape2)

#data prep
scale <- 10

xs <- scale * c(0, 0.5, 0.8, 0.9, 0.95, 0.99, 1)
ys <- scale * c(0, 0.01, 0.05, 0.1, 0.2, 0.5, 1)

df <- data.frame(expand.grid(xs,ys))
colnames(df) <- c('x','y')
df$z <- ((scale-df$x) * df$y) / ((scale-df$x) * df$y + 1)

#filled contour looks good
filled.contour(xs, ys, acast(df, x~y, value.var='z'))

#ggplot contour looks bad
p <- ggplot(df, aes(x=x, y=y, z=z))

p + stat_contour(geom='polygon', aes(fill=..level..))

I can't figure out how to get ggplot contour to fill the polygons all the way up to the upper left hand side (there's a point at (0,10) with z= 0.99) ...all I get are these weird triangles

like image 631
MattMcD Avatar asked Sep 11 '14 13:09

MattMcD


1 Answers

To create a ggplot version of the filled.contour plot you'll need to have a larger data.frame than the df object in your example and using geom_tile will produce the plot you are looking for. Consider the following:

# a larger data set
scl <- 10
dat <- expand.grid(x = scl * seq(0, 1, by = 0.01), 
                   y = scl * seq(0, 1, by = 0.01))
dat$z <- ((scl - dat$x) * dat$y) / ((scl - dat$x) * dat$y + 1)

# create the plot, the geom_contour may not be needed, but I find it helpful
ggplot(dat) + 
aes(x = x, y = y, z = z, fill = z) + 
geom_tile() + 
geom_contour(color = "white", alpha = 0.5) + 
scale_fill_gradient(low = "lightblue", high = "magenta") + 
theme_bw()

enter image description here

like image 56
Peter Avatar answered Sep 29 '22 05:09

Peter