Как удалить фон 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, as
ggplot2continues to improve, we will see options like
position_nudge () `получает дополнительную функциональность для более простого решения этой проблемы!