【问题标题】:Custom scatterplot matrix using facet_grid in ggplot2使用 ggplot2 中的 facet_grid 自定义散点图矩阵
【发布时间】:2014-07-24 03:45:44
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • 你看过ggpairsGGally吗?看起来你想要的大部分东西都可以用这个函数很容易地完成,你只需要重塑你的数据集(比如dcast(dat, Control ~ measure),如果你使用reshape2)。

标签: r ggplot2 statistics


【解决方案1】:

我不知道将面板条(标签)移动到底部或左侧的方法。此外,无法单独格式化各个面板(例如,仅关闭一个方面的刻度线)。因此,如果您真的需要这些功能,您可能必须使用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)

它的主要特点是在对geom_point(...) 的调用中使用subset=.(as.numeric(H)&lt;as.numeric(V))。这对数据集进行了子集化,因此您仅在满足条件时才获得点层,例如在is.numeric(H)&lt;is.numeric(V) 的方面。这是可行的,因为我将 HV 列保留为因子,而对因子进行操作的 is.numeric(...) 返回级别,而不是名称。

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

【讨论】:

  • 谢谢。我转向在 Python 中使用 matplotlib 以获得我所追求的全部灵活性。抱歉,如果这对专门使用 R 的人没有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 2014-11-09
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多