Горизонтальные белые линии в гистограмме ggplot

#r #image #ggplot2

#r #изображение #ggplot2

Вопрос:

Когда я сохраняю график из R с помощью ggplot2 и geom_col() / или geom_bar(stat = 'identity') он выходит с некоторыми неприглядными горизонтальными белыми линиями.

Данные выглядят следующим образом:

 > head(mouse_track_data)
session site BM.pile ox.pile       type  mice skinks geckos 
1 dec_2018    1       1    1.10 control FALSE   TRUE  FALSE            
2 dec_2018    1       2    1.12 design1 FALSE  FALSE  FALSE           
3 dec_2018    1       3    1.11 control FALSE  FALSE  FALSE            
4 dec_2018    1       4    1.80 control FALSE  FALSE  FALSE            
5 dec_2018    1       5    1.60 design1 FALSE  FALSE  FALSE            
6 dec_2018    1       6    1.50 control FALSE  FALSE  FALSE            
  

Вот мой код:

 ggplot(data = mouse_track_data, aes(x = session, y = as.numeric(mice), fill = type))   
  geom_bar(stat='identity')  
  theme_classic()  
  theme(text = element_text(size=15),
        axis.text.x = element_text(angle = 45, hjust = 1))  
  xlab("Tracking session")  
  ylab("Number of tunnels with mouse tracks")  
  theme(axis.title.y = element_text(margin = margin(t = 0, r = 7, b = 0, l = 0)))  
  theme(axis.title.y = element_text(margin = margin(t = 0, r = 7, b = 0, l = 0)))   
  theme(legend.title = element_blank(), legend.position = c(-2, -2))  
  scale_fill_manual(values = c("control" = "#37a1c1", "design1" = "#9ce2cb", "design2" = "#445a9c"),
                    labels = c(" Control", " Single grade", " Mixed grade"))  
  scale_x_discrete(labels = c('Dec 2019', "April 2019", "Nov 2019", "March 2020"))  
  scale_y_continuous(breaks=seq(0, 50, 10), limits = c(0,52), expand = c(0,0))  
  theme(axis.line = element_blank())
  

С помощью этого или с помощью geom_col() при экспорте в формате ESP или PDF я получаю фигуру, которая выглядит следующим образом:

график с использованием EPS

С тонкими белыми линиями, проходящими через все столбцы. Я предполагаю, что это как-то связано с подсчетом каждой точки данных и последующим их накоплением?

Если я выполняю код, у geom_bar() него нет белых линий, но он не отображает данные так, как я хочу.

Комментарии:

1. В будущем, пожалуйста, предоставьте полностью воспроизводимый пример и удалите все аспекты графика, которые не имеют отношения к вашему вопросу. Например, весь код темы не имеет значения. Смотрите Мой ответ для примера минимального воспроизводимого примера.

Ответ №1:

При использовании geom_col() вы получаете один сегмент столбца на значение данных, и это создает ваши белые линии. Следующий пример показывает это в преувеличенной манере.

 library(tidyverse)

mtcars %>%
  mutate(cyl = factor(cyl), am = factor(am)) %>%
  ggplot(aes(x = cyl, y = 1, fill = am))  
  geom_col(color = "white")
  

Самый простой обходной путь — агрегировать вручную, например, с group_by() помощью и summarize() :

 mtcars %>%
  mutate(cyl = factor(cyl), am = factor(am)) %>%
  group_by(cyl, am) %>%
  summarize(count = n()) %>%
  ggplot(aes(x = cyl, y = count, fill = am))  
  geom_col(color = "white")
#> `summarise()` regrouping output by 'cyl' (override with `.groups` argument)
  

Создано 2020-09-26 пакетом reprex (версия 0.3.0)

Примечание: geom_col() совпадает с geom_bar(stat = "identity") .

Ответ №2:

Вы также можете просто добавить ту же переменную в color аргумент aes . Таким образом, ваш aes вызов становится:

aes(x = session, y = as.numeric(mice), fill = type, color = type))

У вас также должны быть одинаковые шкалы заливки и цвета, поэтому добавьте:

scale_color_manual(values = c("control" = "#37a1c1", "design1" = "#9ce2cb", "design2" = "#445a9c"), labels = c(" Control", " Single grade", " Mixed grade"))

ggplot2 использует fill аргумент для заполнения столбцов / столбцов и color аргумент для окрашивания контура столбца / столбца. Если вы не укажете цвет контура, вы можете получить белые линии, как вы заметили. Указание одинаковых цветов контура и заливки позволяет избежать проблемы, которую вы видели. Предварительная агрегация, как предложил Клаус Уилке, помогает в некоторых случаях, но не всегда. Например, если у вас есть тысячи цветов заливки, вы все равно получите белые линии, предварительно агрегированные или нет.