【问题标题】:Assigning individual high and low fill values using geom_tile() & facet_wrap()使用 geom_tile() 和 facet_wrap() 分配单独的高低填充值
【发布时间】:2016-02-27 17:46:38
【问题描述】:

我正在使用geom_tile() 在 ggplot 中绘制几个矩阵。我使用颜色来表示值变量(即填充)。所有数据都在一个数据框中。我试图让填充中的颜色范围针对绘图的每个元素/矩阵进行唯一缩放。目前使用facet_wrap(),它会在所有地块中找到最高值并将其分配为“高”值。同样,它会找到“低”值的最小值。

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

这里是一些示例数据:

图书馆(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)

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

【问题讨论】:

  • 您可以创建三个单独的图并使用 gridExtra/gridArrange 将它们组合起来。 facet_...地块有一个图例/填充比例。

标签: r ggplot2


【解决方案1】:

在不创建“范围”变量和容纳多个图的约束下,这里是(开始)一个解决方案。它不使用刻面,因为刻面共享颜色/填充/...-scales。我发现 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))

【讨论】:

    猜你喜欢
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多