我有一个数据框,其中列出了具有多个变量的个人,这些变量的总和为1。
head(data)
name var1 var2 var3 var4 var5 var6
1 Individual1 0.00000000 0.16306533 0.000000000 0.08793970 0.000000000 0.7489950
2 Individual2 0.13739632 0.03606203 0.000000000 0.02740714 0.000000000 0.7991345
3 Individual3 0.00000000 0.00000000 0.000000000 0.03278689 0.000000000 0.9672131
4 Individual4 0.09302326 0.00000000 0.000000000 0.02325581 0.000000000 0.8837209
5 Individual5 0.16761169 0.09765373 0.004633884 0.06131587 0.003519406 0.6652654
6 Individual6 0.14689943 0.25081479 0.008559214 0.05957384 0.003552058 0.5306007
我想使用水平堆积条形图来显示每行中这些变量的分布。例如,一个人:
data <- data %>% melt()
data %>% filter(name=="Individual1") %>%
ggplot(aes(name, value, fill = variable)) +
geom_bar(stat="identity") +
coord_flip() +
scale_fill_manual(values=c("#FDD835", "#039BE5", "#5C6BC0", "#FF5722", "#66BB6A", "#000000"))
我想为每一行生成一个图形,并将其中一些显示在具有2列的网格中,其中个人的名称在栏的顶部,图例在网格的底部
对于网格部分,我尝试使用gridExtra
,但是由于名称显示在图形的左侧,因此条形未对齐。
编辑:dc37的可复制示例:
structure(list(name = c("Individual1", "Individual2", "Individual3",
"Individual4", "Individual5", "Individual6"), var1 = c(0, 0.13739632,
0, 0.09302326, 0.16761169, 0.14689943), var2 = c(0.16306533,
0.03606203, 0, 0, 0.09765373, 0.25081479), var3 = c(0, 0, 0,
0, 0.004633884, 0.008559214), var4 = c(0.0879397, 0.02740714,
0.03278689, 0.02325581, 0.06131587, 0.05957384), var5 = c(0,
0, 0, 0, 0.003519406, 0.003552058), var6 = c(0.748995, 0.7991345,
0.9672131, 0.8837209, 0.6652654, 0.5306007)), row.names = c(NA,
-6L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x562d71683610>)
答案 0 :(得分:2)
也许您可以使用facet_rep_wrap
包中的lemon
函数来为每个由两列组成的个人组织一个图,并在其顶部显示名称:
library(tidyr)
library(dplyr)
library(ggplot2)
library(lemon)
df %>% pivot_longer(-name, names_to = "var", values_to = "val") %>%
ggplot(aes(x = name, y = val, fill = var))+
geom_col()+
coord_flip() +
scale_fill_manual(values=c("#FDD835", "#039BE5", "#5C6BC0", "#FF5722", "#66BB6A", "#000000"))+
facet_rep_wrap(~name, scales = "free_y", ncol = 2, repeat.tick.labels = FALSE)+
theme(legend.position = "bottom",
axis.text.y = element_blank(),
axis.title.y = element_blank())
它看起来像您想要得到的吗?
可复制的示例
structure(list(name = c("Individual1", "Individual2", "Individual3",
"Individual4", "Individual5", "Individual6"), var1 = c(0, 0.13739632,
0, 0.09302326, 0.16761169, 0.14689943), var2 = c(0.16306533,
0.03606203, 0, 0, 0.09765373, 0.25081479), var3 = c(0, 0, 0,
0, 0.004633884, 0.008559214), var4 = c(0.0879397, 0.02740714,
0.03278689, 0.02325581, 0.06131587, 0.05957384), var5 = c(0,
0, 0, 0, 0.003519406, 0.003552058), var6 = c(0.748995, 0.7991345,
0.9672131, 0.8837209, 0.6652654, 0.5306007)), row.names = c(NA,
-6L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x562d71683610>)