Как удалить фон ggplot2 и обрезать поля вокруг geom_col

Я хочу сделать "график времени", используя столбчатую диаграмму с накоплением. То, что я хочу сделать, это удалить весь фон, чтобы у меня была только панель и больше ничего. Я застрял на белом фоне графика.

Вот минимальный пример:

mytheme <-  theme(
        axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank(),
        axis.title.y=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        #panel.background = element_blank()
)

Name <- c("One", "Two", "Three", "Four")
value <- c(2, 5, 7, 8)

df <-  data.frame(Name, value)

ggplot(df)+
  aes(x= "Name", y = value,  fill = Name) +
  geom_col(width = .1, show.legend = FALSE) + 
  xlab("") + ylab("") +
  coord_flip() +
  mytheme

давая мне бар, но на большом фоне показано здесь,

(Я закомментировал panel.background просто чтобы показать степень фона. Я хочу "обрезать" этот белый фон, чтобы у меня была только полоса или немного места вокруг полосы. Помогите пожалуйста.

Обновить

После предложения @Gregor я изменил код ggplot следующее:

ggplot(df)+
  aes(x= "Name", y = value,  fill = Name) +
  geom_col(width = .1, show.legend = FALSE) + 
  xlab("") + ylab("") +
  coord_flip(expand = FALSE) +
  mytheme

В результате получается очень широкая полоса (высокая на странице, потому что я использовал ordin_flip):

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

Все, что мне нужно сделать сейчас, это уменьшить высоту (как видно на картинке), чтобы сделать ее больше похожей на мою оригинальную полосу. Как я могу это изменить?

Решение

Я наконец нашел простое решение. Как я использую R Markdown, Я использовал:

```{r, ..., fig.width=4, fig.height=.3}

в преамбуле к врезанной фигуре. Не лучшее решение, но оно работает. Спасибо всем.

1 ответ

Это очень интересный вопрос. Вот один из подходов к этому: вместо использования вертикального столбчатого графика и последующего его горизонтального переворота мы можем просто создать "обычный" линейный график, где столбцы располагаются рядом друг с другом и имеют одинаковую высоту, но каждый столбец имеет переменная ширина, которая равна продолжительности желаемых интервалов времени. Мы можем "обрезать" фон, используя coord_fixed(expand = FALSE),

Вероятно, будет лучше, если мы прямо укажем положение оси X для ggplot(), чтобы мы могли использовать их для размещения наших меток (более подробно об этом позже) - как расположить интервалы для вашей временной шкалы:

Пусть Xi обозначает расстояние (вдоль оси x) от начала координат до центра каждого временного интервала i. Для каждого интервала iXi является суммой длин предыдущих интервалов времени X0: Xi - 1 плюс половина длины Xi. Мы можем иметь R автоматически генерировать эти значения для нас, добавив столбец, который использует накопленную накопленную сумму, как вы увидите ниже.

я ушел panel.background = element_blank() закомментировано, так что вы можете подтвердить, что мы действительно получаем "только график", без фона.

Код:

library("tidyverse")

mytheme <-  theme(
  axis.title.x=element_blank(),
  axis.text.x=element_blank(),
  axis.ticks.x=element_blank(),
  axis.title.y=element_blank(),
  axis.text.y=element_blank(),
  axis.ticks.y=element_blank(),
  panel.grid.major = element_blank(),
  panel.grid.minor = element_blank(),
  #panel.background = element_blank()
)

Name <- c("One", "Two", "Three", "Four")
Value <- c(2, 5, 7, 8)

df <-  data.frame(Name, Value) %>%
  mutate(Name = factor(Name, levels = Name),
         xPos = cumsum(lag(Value, default = 0)) + Value/2) # calculate interval position

ggplot(data = df, aes(x = xPos, y = 1, width = Value, fill = Name)) +
  geom_col(position = "identity",
           show.legend = FALSE) +
  geom_text(aes(label = Name),
            position = position_fill(vjust = 0.5)) +
  coord_fixed(expand = FALSE) + # crop background around geom_col()
  mytheme

Выход:

График времени

Почему это работает:

По состоянию на ggplot2 версии 3.1.0, мы изначально оказались между молотом и наковальней: если мы решим использовать coord_flip() мы можем получить горизонтальную временную шкалу, но мы не можем (легко) изменить размеры нашей области построения, чтобы получить нужные размеры. Если мы вместо этого используем coord_fixed(expand = FALSE)у нас есть желаемые поля для построения, но мы не можем легко сделать горизонтальный "стек" баров, так как coord_fixed() несовместимо с coord_flip(),

Есть интересный аргумент под названием position_dodge2() что вы можете использовать с geom_col() размещать стержни переменной ширины рядом друг с другом. Если вы установите padding = 0, вы можете получить график, который выглядит очень похоже на то, что вы видите выше, но фактические "x-координаты" каждого интервала начнутся с левого края каждого столбца, в отличие от центра.

Это делает центрирование текстовых меток очень трудным, так как нам нужно будет отрегулировать их расположение в зависимости от ширины каждого интервала, но ggplot2 варианты, такие как position_nudge ()only allow us to adjust *all* of the labels by some constant amount. Consequently, we specify the center of each time interval directly. Hopefully, asggplot2continues to improve, we will see options likeposition_nudge () `получает дополнительную функциональность для более простого решения этой проблемы!

Другие вопросы по тегам