#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 я получаю фигуру, которая выглядит следующим образом:
С тонкими белыми линиями, проходящими через все столбцы. Я предполагаю, что это как-то связано с подсчетом каждой точки данных и последующим их накоплением?
Если я выполняю код, у 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
аргумент для окрашивания контура столбца / столбца. Если вы не укажете цвет контура, вы можете получить белые линии, как вы заметили. Указание одинаковых цветов контура и заливки позволяет избежать проблемы, которую вы видели. Предварительная агрегация, как предложил Клаус Уилке, помогает в некоторых случаях, но не всегда. Например, если у вас есть тысячи цветов заливки, вы все равно получите белые линии, предварительно агрегированные или нет.