Plotting 3d point cloud coordinates in three panels

I'd like to plot a set of 3d point coordinates (x,y,z) as three 2d scatter plot panels in an "orthogonal view":

   
xy zy
xz

As a minimal example, let's consider the following data frame:

x <- c(0.9, 1.1, 1.0)
y <- c(2.0, 1.9, 2.1)
z <- c(3.1, 2.9, 3.0)

df <- data.frame(x,y,z)

Now, I'd like to create three plots, such as:

p1 <- ggplot(df, aes(x=x, y=y)) +
+ geom_point() +
+ theme_minimal()

p2 <- ggplot(df, aes(x=z, y=y)) +
+ geom_point() +
+ theme_minimal()

p3 <- ggplot(df, aes(x=x, y=z)) +
+ geom_point() +
+ theme_minimal()

... and arrange them in a way that the x and y axes align.
Is that something I can do using facets, and if so, how?

Hi and welcome,

I've actually been playing with something along these lines myself recenlty (a customised pairs plot in my case), and I'd suggest using GGally::ggmatrix to create your array of plots:

x <- c(0.9, 1.1, 1.0)
y <- c(2.0, 1.9, 2.1)
z <- c(3.1, 2.9, 3.0)
df <- data.frame(x,y,z)

# Contains ggmatrix function...
library(GGally)
#> Loading required package: ggplot2

xy <- ggplot(df)+geom_point(aes(x=x,y=y))
zy <- ggplot(df)+geom_point(aes(x=z,y=y))
xz <- ggplot(df)+geom_point(aes(x=x,y=z))

mm <- ggmatrix(list(xy,zy,xz,NULL),nrow=2,ncol=2)
mm

Created on 2019-04-04 by the reprex package (v0.2.1)

Ron.

1 Like

If you wish to align different plots then there are packages like cowplot, lemon and patchwork.

An alternative to ron's solution would be to use ggplot2's facets:

library(tidyverse)

x <- c(0.9, 1.1, 1.0)
y <- c(2.0, 1.9, 2.1)
z <- c(3.1, 2.9, 3.0)

df <- data.frame(x,y,z)

df <- bind_rows(
  df %>% select(axis1 = x, axis2 = y) %>% mutate(axes = "xy"), 
  df %>% select(axis1 = x, axis2 = z) %>% mutate(axes = "xz"), 
  df %>% select(axis1 = y, axis2 = z) %>% mutate(axes = "yz")
)

p <- ggplot(df, aes(x = axis1, y = axis2)) + 
  geom_point() + 
  facet_wrap(vars(axes), scales = "free")

You can play with the scales argument to suit your requirements.

1 Like

Building on Martin's answer you can arrange the facets this way

df <- df %>% mutate(axes = factor(axes, levels = c("xy", "yz", "xz")))

ggplot(df, aes(x = axis1, y = axis2)) +
    geom_point() +
    facet_wrap(vars(axes), scales = "free", ncol = 2)

1 Like

I ended up using the multiplot function described here:

... mainly for the reason that it allows to set a layout adjusting the relative size of the xy plot and the z axes of the other two plots.

See here for an example usage:

I noticed that this function (multiplot) apparently proliferated into a few different R packages, and wondered if there is a specific reason why it's not integrated centrally in one of the ggplot or gg* packages...


I also figured that another option to achieve this combined plot would be the patchwork package by @thomasp85:

... but I refrained from using it just now in a workflow I'm going to share, because it's not yet deployed to CRAN, and requires installation from GitHub. Are there any plans to put it on CRAN soon?

If your question's been answered (even if by you), would you mind choosing a solution? (See FAQ below for how).

Having questions checked as resolved makes it a bit easier to navigate the site visually and see which threads still need help.

Thanks

2 Likes

patchwork will hopefully get on CRAN sometimes this year...

1 Like

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.

If you have a query related to it or one of the replies, start a new topic and refer back with a link.