I have a 3D dataset:
data = data.frame(
x = rep( c(0.1, 0.2, 0.3, 0.4, 0.5), each=5),
y = rep( c(1, 2, 3, 4, 5), 5)
)
data$z = runif(
25,
min = (data$x*data$y - 0.1 * (data$x*data$y)),
max = (data$x*data$y + 0.1 * (data$x*data$y))
)
data
str(data)
And I want to plot it, but the built-in-functions of R alwyas give the error
increasing 'x' and 'y' values expected
# ### 3D Plots ######################################################
# built-in function always give the error
# "increasing 'x' and 'y' values expected"
demo(image)
image(x = data$x, y = data$y, z = data$z)
demo(persp)
persp(data$x,data$y,data$z)
contour(data$x,data$y,data$z)
When I searched on the internet, I found that this message happens when combinations of X and Y values are not unique. But here they are unique.
I tried some other libraries and there it works without problems. But I don't like the default style of the plots (the built-in functions should fulfill my expectations).
# ### 3D Scatterplot ######################################################
# Nice plots without surface maps?
install.packages("scatterplot3d", dependencies = TRUE)
library(scatterplot3d)
scatterplot3d(x = data$x, y = data$y, z = data$z)
# ### 3D Scatterplot ######################################################
# Only to play around?
install.packages("rgl", dependencies = TRUE)
library(rgl)
plot3d(x = data$x, y = data$y, z = data$z)
lines3d(x = data$x, y = data$y, z = data$z)
surface3d(x = data$x, y = data$y, z = data$z)
Why are my datasets not accepted by the built-in functions?
Thanks for your help,
Sven
I think the following code is close to what you want
It gives data like this (note that
x
andy
are both increasing)and a graph like
Adding to the solutions of others, I'd like to suggest using the
plotly
package forR
, as this has worked well for me.Below, I'm using the reformatted dataset suggested above, from xyz-tripplets to axis vectors x and y and a matrix z:
The rendered surface can be rotated and scaled using the mouse. This works fairly well in RStudio.
You can also try it with the built-in
volcano
dataset fromR
:If you're working with "real" data for which the grid intervals and sequence cannot be guaranteed to be increasing or unique (hopefully the
(x,y,z)
combinations are unique at least, even if these triples are duplicated), I would recommend theakima
package for interpolating from an irregular grid to a regular one.Using your definition of
data
:And this should work not only with
image
but similar functions as well.Note that the default grid to which your data is mapped to by
akima::interp
is defined by 40 equal intervals spanning the range ofx
andy
values:But of course, this can be overridden by passing arguments
xo
andyo
toakima::interp
.I use the
lattice
package for almost everything I plot in R and it has a corresponing plot topersp
calledwireframe
. Letdata
be the way Sven defined it.Or how about this (modification of fig 6.3 in Deepanyan Sarkar's book):
Update: Plotting surfaces with OpenGL
Since this post continues to draw attention I want to add the OpenGL way to make 3-d plots too (as suggested by @tucson below). First we need to reformat the dataset from xyz-tripplets to axis vectors
x
andy
and a matrixz
.This image can be freely rotated and scaled using the mouse, or modified with additional commands, and when you are happy with it you save it using
rgl.snapshot
.Not sure why the code above did not work for the library
rgl
, but the following link has a great example with the same library. Run the code in R and you will obtain a beautiful 3d plot that you can turn around in all angles.http://statisticsr.blogspot.de/2008/10/some-r-functions.html