使用geom_hex以编程方式查找填充范围

时间:2017-01-10 06:57:19

标签: r ggplot2

所以我做了两个六角网格图,我想给颜色填充相同的范围,这样任何给定的颜色在两个图上都意味着相同的东西。然而,要设置范围,我必须手动输入我看到两个图之后的上限。我希望能够以编程方式在两个(或更多)图之间的任何十六进制网格中获取最大(和最小)计数,并将其设置为范围而不是手动执行。

我将代码缩减为只生成一个十六进制网格图并删除了我的自定义主题。数据来自拉赫曼

library(Lahman)
library(tidyverse)
library(viridis)

gg_base_runs <- ggplot(Teams, aes(y = R)) +
  scale_fill_viridis(begin = 0, end = .9, option = "C", limit = range(c(1,150))) +
  coord_cartesian(xlim = c(0,1750)) +
  labs(y = "Runs")

(gg_runs_BB_hex <- gg_base_runs + 
  aes(x = BB) + 
  labs(x = "Walks") +
  geom_hex())

Current plot

1 个答案:

答案 0 :(得分:1)

在这种情况下,我通常会计算ggplot之外的计数值,以便找到计数范围。但在这种情况下,使用ggplot_build直接从每个绘图对象中提取计数值可能更容易。一旦我们得到每个图的计数,我们就可以找到所有图的计数范围。然后,可以使用此范围为scale_fill_viridis中的所有图设置相同的限制。这是一个例子:

library(ggplot2)
library(Lahman)
library(tidyverse)
library(viridis)

首先,我们在不调用scale_fill_viridis的情况下重新创建你的情节:

gg_base_runs <- ggplot(Teams, aes(y = R)) +
  coord_cartesian(xlim = c(0,1750)) +
  labs(y = "Runs")

(gg_runs_BB_hex <- gg_base_runs + 
    aes(x = BB) + 
    labs(x = "Walks") +
    geom_hex())

我们还要创建第二个图,以便我们可以使用另一个图:

set.seed(49)
df = data.frame(x=runif(10000), y=runif(10000))
gg1 = ggplot(df, aes(x,y)) + geom_hex(bins=5)

现在让我们获取两个图中的hexbin计数范围

count.range = range(lapply(list(gg1, gg_runs_BB_hex), function(p){
  ggplot_build(p)$data[[1]]$count
}))

然后我们可以将这个范围应用于两个图:

plot.list = lapply(list(gg1, gg_runs_BB_hex), function(p) {
  p + scale_fill_viridis(begin = 0, end = .9, option = "C", limits = count.range)
})

以下是这些情节:

gridExtra::grid.arrange(grobs=plot.list, ncol=2)

enter image description here