gpt4 book ai didi

r - 在 geom_tile 中按面拆分重叠的图 block

转载 作者:行者123 更新时间:2023-12-05 01:53:14 34 4
gpt4 key购买 nike

我堆叠了一个数据框,它显示 group 中每个 idvalue:

df <- tibble::tibble(id = c(LETTERS[1:6], LETTERS[1:5]),
value = c(paste0("V", 1:6), paste0("V", 1:5)),
group = c(rep("group_1", 6), rep("group_2", 5)))

df
#> # A tibble: 11 x 3
#> id value group
#> <chr> <chr> <chr>
#> 1 A V1 group_1
#> 2 B V2 group_1
#> 3 C V3 group_1
#> 4 D V4 group_1
#> 5 E V5 group_1
#> 6 F V6 group_1
#> 7 A V1 group_2
#> 8 B V2 group_2
#> 9 C V3 group_2
#> 10 D V4 group_2
#> 11 E V5 group_2

我想创建一个热图,显示 group 中每个 id (y) 的每个 value (x) 的“可用性” (填写):

ggplot(df, aes(x = id, y = value, fill = group)) + 
geom_tile()

enter image description here

问题是 fill 重叠:我只能看到 F/V6 仅在 group_1 中(而不在 group_2 中).但是,对于 ID A 到 E,值 V1 到 V5 在两个 组中都可用,因此 group_2 的颜色在 group_1 之上, 使它们看起来只在 group_2 中可用。

如果我使用facet_wrap(),可用性会更明显:

ggplot(df, aes(x = id, y = value, fill = group)) + 
geom_tile() +
facet_wrap("group")

enter image description here

但是,在我的真实设置中,热图非常大,因此很难比较哪些值在哪个组中可用。

如果值在两个组中都可用,是否可以将每个图 block 分成两半,如果只在一个组中存在,是否可以将其保持完整?所以在上面的第一个图中,蓝色方 block 将被分成两半(同时显示蓝色和红色),而红色方 block 将保持原样。


更新

感谢 stefan 关于使用 position = "dodge" 的出色提示。但是,我注意到我的问题实际上比我上面的 reprex 复杂一点:每个 value 可能出现在每个 group 的多个 id 中。当使用 position = "dodge" 时,ggplot2 然后将每个 id “列”“划分”为与每个 value 出现次数一样多的部分在此 id 中:


df <- tibble::tibble(id = c("A", "A", "A", "B", "B", "C", "C", "C", "A", "A", "B", "B", "C", "C"),
value = c("V1", "V2", "V3", "V1", "V3", "V1", "V2", "V4", "V1", "V2", "V1", "V3", "V1", "V4"),
group = c(rep("group_1", 8), rep("group_2", 6)))

df
#> # A tibble: 14 x 3
#> id value group
#> <chr> <chr> <chr>
#> 1 A V1 group_1
#> 2 A V2 group_1
#> 3 A V3 group_1
#> 4 B V1 group_1
#> 5 B V3 group_1
#> 6 C V1 group_1
#> 7 C V2 group_1
#> 8 C V4 group_1
#> 9 A V1 group_2
#> 10 A V2 group_2
#> 11 B V1 group_2
#> 12 B V3 group_2
#> 13 C V1 group_2
#> 14 C V4 group_2

ggplot(df, aes(x = id, y = value, fill = group)) +
geom_tile(position = "dodge")

您可以看到,在“A 列”中,三个图 block 并排放置,将可用空间一分为三。我想要实现的是将“A 列”中的这三对图 block 绘制在彼此之上,以便它们对齐,使用分配给每个值的“A 列”的整个可用空间。

enter image description here

最佳答案

一种选择是使用position="dodge":

library(ggplot2)

ggplot(df, aes(x = id, y = value, fill = group)) +
geom_tile(position = "dodge")


更新

你可以尝试在 group aes 上映射组:

ggplot(df, aes(x = id, y = value, fill = group, group = group)) + 
geom_tile(position = "dodge", color = "black") # adding 'color' for borders

enter image description here

关于r - 在 geom_tile 中按面拆分重叠的图 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71147521/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com