使用geom_tile()&分配单独的高填充值和低填充值。 facet_wrap()

时间:2015-11-25 03:27:11

标签: r ggplot2

我正在使用geom_tile()在ggplot中绘制几个矩阵。我使用颜色来表示值变量(即填充)。所有数据都在一个数据帧中。我试图获得填充中的颜色范围,以便为绘图的每个元素/ marix唯一地缩放。目前使用facet_wrap(),它会在所有图表中找到最高值,并将其指定为“' high'值。同样,它找到了“低”的最低值。值。

我已尝试在scales='free'中使用facet_wrap(),但这不符合逻辑(并且不起作用)。基本上我希望它根据每个组中的最高和最低值为填充分配高值和低值。我不想单独制作每个情节,因为我有几十个情节。

以下是一些示例数据:

库(GGPLOT2) set.seed(110)

dfA <- data.frame(Var1=rep(LETTERS[1:5],5), Var2=rep(LETTERS[1:5],each=5), Value=sample(1:30, replace=T, 25), Group="A")
dfB <- data.frame(Var1=rep(LETTERS[1:5],5), Var2=rep(LETTERS[1:5],each=5), Value=sample(15:60, replace=T, 25), Group="B")
dfC <- data.frame(Var1=rep(LETTERS[1:5],5), Var2=rep(LETTERS[1:5],each=5), Value=sample(1:99, replace=T, 25), Group="C")
dfX <- rbind(dfA,dfB,dfC)

在这里,我使用facet_wrap()绘制三个平铺图:

ggplot(dfX, aes(Var1, Var2, fill = Value)) + 
  geom_tile(colour="white", size=1.75, stat="identity") + 
  scale_fill_gradient(low = "white", high = "red") +
  geom_text(data=dfX, aes(Var1, Var2, label = Value), color="black", size=rel(5)) +
  facet_wrap(~Group)

enter image description here

上述图不理想,因为前两个矩阵应具有与最终矩阵相同的填充比例,即使它们的数量分布在范围内较低。理想情况下,我希望解决方案不仅仅是将每个组的数据调整到0到1之间,例如使用公式zi=xi−min(x) / max(x)−min(x)

1 个答案:

答案 0 :(得分:2)

在不创造&#39;范围的限制范围内。变量和容纳多个图,这是(一个开始)的解决方案。它没有使用刻面,因为刻面共享颜色/填充/ ......比例。我发现了一个关于这个功能请求的hadley wickham的旧评论,并且它是非常不可能的,因为通过绘制单独的图表可以很容易地解决这个问题。 source

由于你的尺度因情节不同而且似乎不需要图例(因为所有值都在图中),我已经删除了所有图例。它可以根据需要用于多个绘图,只需编辑grid.arrange的参数即可。

library(gridExtra)
#create lots of plots by using lapply/split --> easily scalable to many plots 

myplots <- lapply(split(dfX, dfX$Group), function(x){
  p1 <- ggplot(x, aes(Var1, Var2, fill = Value)) + 
    geom_tile(colour="white", size=1.75, stat="identity") + 
    scale_fill_gradient(low = "white", high = "red") +
    geom_text(aes(Var1, Var2, label = Value), 
              color="black", size=rel(5)) +
    labs(title=unique(x$Group)) +
    theme(legend.position="none")
}
)

do.call(grid.arrange,c(myplots, ncol=3))

enter image description here