绘制不同结果变量(R)的多个条形图的更简洁方法

时间:2018-09-03 20:44:42

标签: r ggplot2

我想知道是否有更好的方法来产生4个以网格形式排列的不同结果变量的条形图:

这是我使用的代码:

library(cowplot)

bar1 <- ggplot(data = subset(data, !is.na(MHQ_Heading_Male_Quartile))) +
  geom_bar(mapping = aes(x = MHQ_Heading_Male_Quartile))
bar2 <- ggplot(data = subset(data, !is.na(AHQ_Heading_Male_Quartile))) +
  geom_bar(mapping = aes(x = AHQ_Heading_Male_Quartile))
bar3 <- ggplot(data = subset(data, !is.na(MHQ_Heading_Female_Quartile))) +
  geom_bar(mapping = aes(x = MHQ_Heading_Female_Quartile))
bar4 <- ggplot(data = subset(data, !is.na(AHQ_Heading_Female_Quartile))) +
  geom_bar(mapping = aes(x = AHQ_Heading_Female_Quartile))

plot_grid(bar1, bar2, bar3, bar4, ncol = 2)

但是,有很多重复的代码-是否有一些函数或方法用ggplot2在更少的行中创建相同的图?

3 个答案:

答案 0 :(得分:3)

我将相关列从宽转换为长(以"_Quartile"结尾的列),然后使用facet_wrap在带有scales = "free"的2x2网格中显示4个图。

类似这样的东西:

data %>%
    gather(key, value, ends_with("Quartile")) %>%
    filter(!is.na(value)) %>%
    ggplot(aes(value)) +
    geom_bar() +
    facet_wrap(~ key, scales = "free", ncol = 2, nrow = 2)

enter image description here

答案 1 :(得分:1)

如前所述,您需要使用dplyr收集(或调整包装形状)使其长格式,然后对此进行分面。

`data %>%
  select( MHQ_Heading_Male_Quartile, AHQ_Heading_Male_Quartile, MHQ_Heading_Female_Quartile, AHQ_Heading_Female_Quartile) %>%
  gather("Type", "Range", MHQ_Heading_Male_Quartile:AHQ_Heading_Female_Quartile) %>%
  filter(!is.na(Range)) %>%
  ggplot(aes(x=Range)) + 
  geom_bar() + 
  facet_wrap(~Type, scales="free")`

我将留给您清理图表,但这是基本前提。

答案 2 :(得分:1)

提取要显示在nms中的列名,然后对于每个列名使用qplot创建一个ggplot对象,以便bars是此类对象的列表。然后在其上运行plot_grid

nms <- grep("Quartile", names(data), value = TRUE)
bars <- lapply(nms, function(nm) qplot(na.omit(data[[nm]]), xlab = nm))
do.call("plot_grid", bars)

screenshot