user191919
user191919

Reputation: 754

3D Data with ggplot

I have data in the following form:

x <- seq(from = 0.01,to = 1, by = 0.01)
y <- seq(from = 0.01,to = 1, by = 0.01)

xAxis <- x/(1+x*y)
yAxis <- x/(1+x*y)

z <- (0.9-xAxis)^2 + (0.5-yAxis)^2

df <- expand.grid(x,y)
xAxis <- df$Var1/(1+df$Var1*df$Var2)
yAxis <- df$Var2/(1+df$Var1*df$Var2)

df$x <- xAxis
df$y <- yAxis
df$z <- z

I would like to plot te (x,y,z) data as a surface and contour plots, possibily interpolating data to obtain as smooth a figure as possible.

Searching I reached the akima package which does the interpolation:

im <- with(df,interp(x,y,z))

I am having trouble plotting the data with this output. Ideally I would like to use ggplot2 since I want to add stuff to the original plot.

Thanks!

Upvotes: 0

Views: 2399

Answers (2)

Dave2e
Dave2e

Reputation: 24079

For contour plots, I use the "rgl" package. This allows real-time manipulation of the plot in order to have the best view.

library("rgl")

x <- seq(from = 0.01,to = 1, by = 0.01)
y <- seq(from = 0.01,to = 1, by = 0.01)

#z <- (0.9-xAxis)^2 + (0.5-yAxis)^2

df <- expand.grid(x,y)
xAxis <- df$Var1/(1+df$Var1*df$Var2)
yAxis <- df$Var2/(1+df$Var1*df$Var2)

df$z <- (0.9-xAxis)^2 + (0.5-yAxis)^2

surface3d(x=x, y=y, z=df$z, col="blue", back="lines")
title3d(xlab="x", zlab="z", ylab="y")
axes3d(tick="FALSE")

The rgl package is comparable to the ggplot2 package to customize the final plot. The 0.01 grid spacing is more than close enough for this type of smooth surface.

Upvotes: 0

Axeman
Axeman

Reputation: 35242

I'm a bit puzzled as to what you are looking for, but how about something like this?

im <- with(df, akima::interp(x, y, z, nx = 1000, ny = 1000))
df2 <- data.frame(expand.grid(x = im$x, y = im$y), z = c(im$z))

ggplot(df2, aes(x, y, fill = z)) + 
  geom_raster() + 
  viridis::scale_fill_viridis()

enter image description here

Upvotes: 2

Related Questions