переместить контур ggplot2 из других граней в основную - PullRequest
0 голосов
/ 03 мая 2018

У меня есть данные 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))

enter image description here

В каждом аспекте у меня есть:

  • фасет 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 категориальных

enter image description here

(Простите за мои поспешные навыки в GIMP. В реальных данных контуры, скорее всего, не будут пересекаться, но я не думаю, что это будет проблемой.)

Реальные данные имеют разные значения (и градиенты) z для одной и той же системы X, Y, поэтому в остальном контур совместим с первым фасетом. Тем не менее, он все еще «другой», поэтому я не могу смоделировать контуры с единственными w==0L данными.

Я думаю, что может быть несколько способов сделать это:

  • формирует данные «правильно» в первый раз, сообщая ggplot, как вычерчивать контуры, но укладывая их на одном графике (например, используя разные data= для определенных слоев);
  • формируют граненый график, извлекают контуры из других граней, применяют их к первому и отбрасывают другие фасеты (возможно, используя grid и / или gtable); или возможно
  • (математически рассчитать контуры самостоятельно и добавить их как независимые линии; я надеялся повторно использовать усилия ggplot2, чтобы избежать этого ...).

1 Ответ

0 голосов
/ 03 мая 2018

Это не очень точно соответствует грамматике графики, но вы можете просто добавить вызов geom_contour для каждого подмножества данных. Быстрый способ - добавить список таких вызовов на график, который вы можете быстро сгенерировать, набрав lapply по разделенным данным:

ggplot(vdat[vdat$w == 0, ], aes(x, y, z = z, fill = z)) +
    geom_tile() +
    lapply(split(vdat, vdat$w), function(dat){
        geom_contour(data = dat, color = 'white', breaks = c(-Inf, 110, Inf))
    })

Вы даже можете сделать легенду, если вам нужно:

ggplot(vdat[vdat$w == 0, ], aes(x, y, z = z, fill = z, color = factor(w))) +
    geom_raster() +
    lapply(split(vdat, vdat$w), function(dat){
        geom_contour(data = dat, breaks = c(-Inf, 110, Inf))
    })

...