每行生成一个条形图并在网格中对齐条形

时间:2020-02-12 19:10:59

标签: r ggplot2

我有一个数据框,其中列出了具有多个变量的个人,这些变量的总和为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>)

1 个答案:

答案 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())

docker_logging_configure

它看起来像您想要得到的吗?

可复制的示例

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>)