创建一个比率热力图。

3

大家好!我是新手想要创建一个热图。

有一个数据集,包含以下列:

  • X:x坐标
  • Y:y坐标
  • Pet_type:宠物类型(猫,狗,仓鼠等)
  • Owner_type:所有者类型(成年男性,成年女性,孩子)

小数据集:

所有者 宠物 X Y
男性 27.793 88.2128
男性 仓鼠 37.7177 87.9776
女性 24.4547 87.3016
孩子 36.464 84.9169
孩子 29.4175 84.5433
女性 蜥蜴 37.9588 83.9029
男性 豚鼠 44.8986 82.7822
孩子 26.6216 82.0757
男性 仓鼠 46.2332 81.9817
男性 31.9716 81.7507
女性 22.8606 80.9761
孩子 29.744 80.7988
孩子 蜥蜴 32.2393 80.35
女性 豚鼠 38.92 78.8604
男性 39.42 78.3604
孩子 仓鼠 32.2632 87.8267

创建一个热力图以显示在该特定bin中,一个特定宠物与所有宠物的比率。例如:我想创建一个猫密度的热力图,如果bin中有20只宠物,其中10只是猫,则该bin的值为0.5或50%,等等。

我正在使用ggplot,目前我已经可以看到每个bin中总宠物的数量。

在将表格提供给ggplot之前,我应该进行什么样的操作?

df %>% 
  ggplot(aes(X, Y))+
  geom_bin_2d(bins=15)

我目前的进展

我正在努力理解如何创建一个语句来看到所有箱中猫与所有宠物的比率。

所以,如果有人能帮我解决这个问题(可能很简单),我会非常感激。


4
欢迎来到SO!请考虑发布一个可复制的示例。具体方法请参考此链接:https://dev59.com/eG025IYBdhLWcg3whGSx。 - medium-dimensional
2
除了尝试提供可重现的示例之外,我认为一般来说最好的方法是首先计算要绘制的值(箱中宠物比例),以整洁的格式获得结果,然后再考虑绘图。 - yoland
@yoland 我添加了一个小数据集样本,在 ggplot 之前需要哪些步骤? - matissb
1个回答

0

有许多方法可以进行二维分箱。其中一种选择是使用 {ggplot2} 让它为您创建箱子,然后将其归一化到总计数并重新绘制。在这里,您首先使用原始计数构建了图形,然后使用 ggplot2::ggplot_build() 提取出计算的箱子,并执行标准的 group_by() %>% mutate(fract = x/sum(x)。然后您可以重新绘制。

library(tidyverse)

n <- 5000

d <- tibble(x = rnorm(n),
            y = rnorm(n),
            pet = fct_infreq(sample(
              c("cat", "dog", "fish", "bird"), n, T, prob = c(4, 3, 2, 1)
            )))
p <- d %>%
  ggplot(aes(x, y)) +
  geom_bin_2d(aes(fill = after_stat(count))) +
  facet_wrap( ~ pet)

# original plot of count per animal per bin
p

# get underlying data
e <- ggplot_build(p)$data[[1]]

# normalize and then re-plot
e %>% 
  mutate(pet = fct_recode(PANEL, cat = "1", dog = "2", fish = "3", bird = "4")) %>% 
  group_by(xbin, ybin) %>% 
  mutate(fract = count/sum(count)) %>% 
  ggplot(aes(xmin, ymin)) +
  geom_tile(aes(fill = fract)) +
  facet_wrap(~pet)

使用reprex v2.0.2于2022-11-09创建


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接