【问题标题】:ggplot2 bar chart with lines inside barsggplot2 条形图,条内有线条
【发布时间】:2017-10-24 11:47:31
【问题描述】:

我正在绘制一个从facet_wrap 获得的 3x3 网格。九个地块中有八个使用geom_violin,而其余地块使用geom_bar。在网站上找到一些有用的答案后,我得到了这一切。我遇到的问题是,当我为条形图使用fill = "white, color = "black" 时,它会在条形图内部 绘制这些线。

这里是一些示例代码和图。

library(tidyverse)
n <- 100
tib <- tibble(value = c(rnorm(n, mean = 100, sd = 10), rbinom(n, size = 1, prob = (1:4)/4)),
              variable = rep(c("IQ", "Sex"), each = n),
              year = factor(rep(2012:2015, n/2)))
ggplot(tib, aes(x = year, y = value)) + 
  facet_wrap(~variable, scales = "free_y") +
  geom_violin(data = filter(tib, variable == "IQ")) +
  geom_bar(data = filter(tib, variable == "Sex"), stat = "identity", 
           color = "black", fill = "white")

现在我的问题是:如何消除条内的这些线条?我只希望它是带有黑色边框的白色。我一直在尝试各种配置,我可以设法摆脱线条,但代价是搞砸了刻面。我相当肯定这与统计数据有关,但我在试图修复它时不知所措。有什么建议吗?

【问题讨论】:

  • 您真的要使用构面吗?由于轴确实不同,因此单独制作两个图会更容易,并使用例如将它们绘制在一起。 `库(cowplot)'
  • @FlorianGD 它可以很容易地把所有的情节放在一起,有共同的标题和一切。它们也都共享相同的 x 轴。但也许我需要查看cowplot
  • 出现黑条是因为它会自动堆叠来自 tib$value 的值。您可以使用 position_dodge 或每年的第一个平均值。重要的是要知道你想先得到什么,价值的比例?
  • @timfaber 我想要我包含的情节,但没有条形内的边框。

标签: r ggplot2 violin-plot


【解决方案1】:

我建议在条形图中总结数据:

ggplot(tib, aes(x = year, y = value)) + 
  facet_wrap(~variable, scales = "free_y") +
  geom_violin(data = filter(tib, variable == "IQ")) +
  geom_bar(data = tib %>%
             group_by(year,variable) %>%
             summarise(value=sum(value)) %>%
             filter(variable == "Sex"),
           stat = "identity", 
           color = "black",
           fill = "white")

【讨论】:

    【解决方案2】:

    我不确定这是表示数据的好方法,不同面板的 y 轴表示非常不同的事物,但请接受您的示例可能与您的实际用例不匹配。制作单独的图,然后使用gridExtra::grid.arrangecowplot::plot_grid 可能是更好的解决方案。

    但如果你想这样做

    ggplot(tib, aes(x = year, y = value)) + 
      facet_wrap(~variable, scales = "free_y") +
      geom_violin(data = filter(tib, variable == "IQ")) +
      geom_col(data = filter(tib, variable == "Sex") %>%
                      group_by(year, variable) %>% 
                      summarise(value = sum(value)), 
        fill = "white", colour = "black")
    

    使用geom_col 而不是geom_bar 所以我不需要使用stat = identity

    【讨论】:

    • 我一定会研究cowplot(我之前使用过gridExtra,但我认为这对于我的目标来说有点复杂——尤其是因为我可以用边框来绘制)。 (CMichael 快了几分钟,所以我接受了他们的回答。)
    • 喜欢 dplyr 如何从独立编码人员那里生成几乎相同的代码。