У меня есть данные x, y, z с категориальными переменными, которые облегчают аспект. Я хочу включить контурные линии из всех граней, кроме первой, и отбросить остальные данные. Один из способов визуализировать процесс — фасетировать данные и мысленно перемещать контуры от других фасетов к первому.
MWE:
library(ggplot2)
library(dplyr)
data(volcano)
nx <- 87; ny <- 61
vdat <- data_frame(w=0L, x=rep(seq_len(nx), ny), y=rep(seq_len(ny), each=nx), z=c(volcano))
vdat <- bind_rows(vdat,
mutate(vdat, w=1L, x=x+4, y=y+4, z=z-20),
mutate(vdat, w=2L, x=x+8, y=y+8, z=z-40))
ggplot(vdat, aes(x, y, fill=z)) +
geom_tile() +
facet_wrap(~ w, nrow=1) +
geom_contour(aes(z=z), color='white', breaks=c(-Inf,110,Inf))
В каждом аспекте у меня есть:
- грань 0: X,Y,Z для
w==0L
, контур дляw==0L
- фасет 1: X,Y,Z для
w==1L
, контур дляw==1L
- грань 2: X,Y,Z для
w==2L
, контур дляw==2L
То, что я хотел бы иметь, - это одна панель, эффективно:
- X,Y,Z для
w==0L
, контур для всех значений категорииw
(Простите мои поспешные навыки работы с GIMP. В реальных данных контуры, скорее всего, не будут перекрываться, но я не думаю, что это будет проблемой.)
Реальные данные имеют разные значения (и градиенты) z
для одной и той же системы X, Y, поэтому в остальном контур совместим с первой гранью. Однако он все еще «другой», поэтому я не могу смоделировать контуры с одними данными w==0L
.
Я предполагаю, что может быть несколько способов сделать это:
- формировать данные "правильно" с первого раза, сообщая
ggplot
, как тянуть контуры, но укладывать их на один график (например, используя разныеdata=
для определенных слоев); - сформируйте граненый график, извлеките контуры из других граней, примените их к первой и отбросьте другие грани (возможно, используя
grid
и/илиgtable
); или, возможно, - (сам математически вычисляю контуры и добавляю их как независимые линии; я надеялся повторно использовать усилия
ggplot2
, чтобы избежать этого...).