4

我有 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 for ,分类w==0L的所有值的轮廓w

在此处输入图像描述

(原谅我草率的 GIMP 技能。在真实数据中,轮廓可能不会重叠,但我认为这不是问题。)

z对于相同的 X、Y 系统,真实数据具有不同的值(和梯度) ,因此轮廓与第一个面兼容。然而,它仍然是“不同的”,所以我不能用单个w==0L数据来模拟轮廓。

我想可能有几种方法可以做到这一点:

  • 第一次“正确”形成数据,告知ggplot如何拉动轮廓但将它们放在单个图上(例如,data=对某些层使用不同的);
  • 形成多面图,从其他方面提取轮廓,将它们应用于第一个方面,并丢弃其他方面(可能使用grid和/或gtable);也许
  • (我自己数学计算轮廓并将它们添加为独立的线;我希望重新使用ggplot2' 的努力来避免这种情况......)。
4

1 回答 1

3

它不太适合图形的语法,但您可以geom_contour为每个数据子集添加一个调用。一种快速的方法是将此类调用的列表添加到图形中,您可以通过lapply对拆分数据进行 ing 快速生成该列表:

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))
    })

于 2018-05-03T01:01:34.697 回答