I think you will have to take off the ggplot2 training wheels and do
it another way. Here's the outline:
1. Use kde2d to compute your kernel on a grid - you'll have to choose
the bandwidth and grid size, ggplot2 usually makes those decisions for
you. Something like:
k = kde2d(xy.df$x, xy.df$y,h=0.3,n=200)
2. Convert the gridded density to contour lines with
cc = contourLines(k,levels=c(.25,.75))
with whatever levels you want. Now I'm not sure what you mean by
"50%" and "75%" - do you mean contours at that fraction of the peak
value? Find the max of k$z if you do and work with that. The absolute
values of k$z are dependent on the cell size since it should integrate
to 1 over the area. Or do you want contours that contain 50% and 75%
of the points? That's not quite so simple.
3. Convert the `cc` output to something ggplot can handle.
`contourLines` returns a list with one element per contour line (loop
or segment) with the level, x, and y coordinates. Suspect you need to
`cbind` all the coordinates with the level and the index to get
something like:
index level x y
1 0.75 0.123 0.545
[etc for contour 1]
2 0.5 .5345 .9123
[etc for contour 2]
and then you can feed this to geom_path, grouped by index and coloured
by level.... There's probably a solution for this already somewhere...
Barry
On Mon, Feb 29, 2016 at 7:34 AM, Diego Pavon
<diego.pavonjordan at gmail.com> wrote:
Hello list
I am trying to do a Kernel analysis of bird ring recoveries and I would
like to plot the kernel contour in ggplot. I have found that the command
'stat_density_2d()' can do this kernels. However, when I plot it, it
all the kernels from 10%... 90%. See example below:
# Simulate data
xy <- data.frame(x = runif(30), y = runif(30))
coordinates(xy) <- ~ x + y
plot(xy)
class(xy)
# Transform SpatialPoints into a data.frame to be used in ggplot2
xy.df <- as.data.frame(xy)
head(xy.df)
str(xy.df)
# Make the plot
p <- ggplot(data=xy.df, aes(background="white"))
p <- p + geom_point(aes(x=x, y=y),
data = xy.df,
size = 4)
p <- p + xlab("X") + ylab("Y")
p <- p + theme(text = element_text(size = 15))
p
# This makes the kernels
p2 <- p + stat_density_2d(data = xy.df, aes(x=x, y=y), col = 'red',
0.6)
p2
However, I am only interested in drawing the lines for the kernel 50% and
75% and not all of them.
Does anyone has an idea how to select only those lines (in my case 50 and
75%) to be plotted and omit the rest?
Thank you very much in advance for you time and help.
Best
Diego
--
*Diego Pav?n Jord?n*
*Finnish Museum of Natural History*
*PO BOX 17 *
*Helsinki. Finland*
*0445061210