使用ggplot2中的facet_grid自定义散点图矩阵

时间:2014-07-24 03:45:44

标签: r ggplot2 statistics

我正在尝试使用facet_grid在ggplot2中编写自定义散点图矩阵函数。我的数据有两个分类变量和一个数字变量。

我想根据其中一个分类变量进行分面(制作散点图行/列),并根据其他分类更改绘图符号。

我这样做是首先构建一个更大的数据集,其中包含我正在创建散点图面板的分类变量的所有组合(combs)。

我的问题是:

  • 如何使用geom_rect使facet_grid中的对角线和上面板变白(我到目前为止只能使中间的黑色)?
  • 如何将小平面的标题分别移到左下角?
  • 如何删除左上角和右下角的刻度轴和标签?

提前致谢。

require(ggplot2)

# Data
nC <- 5
nM <- 4

dat <- data.frame(
    Control = rep(LETTERS[1:nC], nM), 
    measure = rep(letters[1:nM], each = nC), 
    value = runif(nC*nM))

# Change factors to characters
dat <- within(dat, {
    Control <- as.character(Control)
    measure <- as.character(measure)
})
# Check, lapply(dat, class)

# Define scatterplot() function
scatterplotmatrix <- function(data,...){

    controls <- with(data, unique(Control))
    measures <- with(data, unique(measure))
    combs <- expand.grid(1:length(controls), 1:length(measures), 1:length(measures))

    # Add columns for values
    combs$value1 = 1
    combs$value2 = 0

    for ( i in 1:NROW(combs)){
        combs[i, "value1"] <- subset(data, subset = Control==controls[combs[i,1]] & measure == measures[combs[i,2]], select = value)
        combs[i, "value2"] <- subset(data, subset = Control==controls[combs[i,1]] & measure == measures[combs[i,3]], select = value)
    }

    for ( i in 1:NROW(combs)){
        combs[i,"Control"] <- controls[combs[i,1]]
        combs[i,"Measure1"] <- measures[combs[i,2]]
        combs[i,"Measure2"] <- measures[combs[i,3]]
    }

    # Final pairs plot
    plt <- ggplot(combs, aes(x = value1, y = value2, shape = Control)) + 
    geom_point(size = 8, colour = "#F8766D") + 
    facet_grid(Measure2 ~ Measure1) + 
    ylab("") + 
    xlab("") + 
    scale_x_continuous(breaks = c(0,0.5,1), labels = c("0", "0.5", "1"), limits = c(-0.05, 1.05)) + 
    scale_y_continuous(breaks = c(0,0.5,1), labels = c("0", "0.5", "1"), limits = c(-0.05, 1.05)) +
    geom_rect(data = subset(combs, subset = Measure1 == Measure2), colour='white', xmin = -Inf, xmax = Inf,ymin = -Inf,ymax = Inf) 

    return(plt)
}

# Call
plt1 <- scatterplotmatrix(dat)
plt1

1 个答案:

答案 0 :(得分:2)

我不知道将面板条(标签)移动到底部或左侧的方法。此外,不可能单独格式化各个面板(例如,仅关闭一个面的刻度线)。因此,如果您确实需要这些功能,则可能必须使用除ggplot之外的其他内容。你应该真正研究GGally,虽然我从来没有取得太大的成功。

至于将一些面板留空,这是一种方法。

nC <- 5; nM <- 4
set.seed(1)     # for reproducible example
dat <- data.frame(Control = rep(LETTERS[1:nC], nM), 
                  measure = rep(letters[1:nM], each = nC),
                  value = runif(nC*nM))

scatterplotmatrix <- function(data,...){
  require(ggplot2)
  require(data.table)
  require(plyr)      # for .(...)
  DT <- data.table(data,key="Control")
  gg <- DT[DT,allow.cartesian=T]
  setnames(gg,c("Control","H","x","V","y"))
  fmt <- function(x) format(x,nsmall=1)
  plt <- ggplot(gg, aes(x,y,shape = Control)) + 
    geom_point(subset=.(as.numeric(H)<as.numeric(V)),size=5, colour="#F8766D") + 
    facet_grid(V ~ H) + 
    ylab("") + xlab("") + 
    scale_x_continuous(breaks=c(0,0.5,1), labels=fmt, limits=c(-0.05, 1.05)) + 
    scale_y_continuous(breaks=c(0,0.5,1), labels=fmt, limits=c(-0.05, 1.05))   
  return(plt)
}
scatterplotmatrix(dat)

这样做的主要特点是在subset=.(as.numeric(H)<as.numeric(V))的调用中使用了geom_point(...)。这会对数据集进行子集,以便在满足条件时仅获得点图层,例如,在is.numeric(H)<is.numeric(V)的方面。这是有效的,因为我已将HV列作为因子,is.numeric(...)对因子进行操作会返回级别,而不是名称。

其余的只是一种更紧凑(更快)的方式来创建你所谓的comb