Гистограмма ggplot2 с линиями внутри столбцов

Я делаю сюжет, в котором у меня есть сетка 3x3, полученная из facet_wrap. На восьми из девяти графиков используется 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")

введите здесь описание изображения

Теперь к моему вопросу: как мне избавиться от этих линий внутри баров? Я просто хочу, чтобы он был белым с черными рамками. Я много экспериментировал с различными конфигурациями, и мне удалось избавиться от линий, но за счет завинчивания грани. Я почти уверен, что это связано со статистикой, но я в затруднении, пытаясь это исправить. Какие-либо предложения?


person hejseb    schedule 24.05.2017    source источник
comment
Вы действительно хотите использовать фасет? Поскольку оси действительно разные, было бы проще сделать 2 графика отдельно и построить их вместе, используя, например. `библиотека (коровник)'   -  person FlorianGD    schedule 24.05.2017
comment
@FlorianGD Это позволяет легко собрать все сюжеты вместе с общими названиями и всем остальным. Все они также имеют одну и ту же ось x. Но, возможно, мне нужно проверить cowplot.   -  person hejseb    schedule 24.05.2017
comment
черные полосы появляются потому, что он автоматически складывает значения из tib$value. Вы можете использовать position_dodge или первое среднее значение за год. Важно знать, что вы хотите получить в первую очередь, соотношение ценностей?   -  person timfaber    schedule 24.05.2017
comment
@timfaber Я хочу, чтобы сюжет, который я включил, но без границ внутри полос.   -  person hejseb    schedule 24.05.2017


Ответы (2)


Я бы предложил обобщить данные в гистограмме:

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")
person CMichael    schedule 24.05.2017

Я не уверен, что это хороший способ представления данных, когда оси Y разных панелей представляют очень разные вещи, но примите во внимание, что ваш пример может не соответствовать вашему фактическому варианту использования. Создание отдельных графиков, а затем использование gridExtra::grid.arrange или cowplot::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.

person Richard Telford    schedule 24.05.2017
comment
Я обязательно посмотрю на cowplot (раньше я использовал gridExtra, но подумал, что это немного сложно для моей цели, тем более, что я мог сделать график с границами). (CMichael был на пару минут быстрее, поэтому я принял их ответ.) - person hejseb; 24.05.2017
comment
Нравится, что dplyr дает почти такой же код от независимых программистов. - person CMichael; 24.05.2017