Я хочу составить гистограмму, где переменная отклика (изменение веса) измеряется в течение периодов времени различной длины, определяемых начальным и конечным датами. Ширина стержней должна соответствовать длине периода. Небольшой пример моих данных:Штриховой график с шириной переменной ширины в виде диапазонов дат по оси x
wtchange.data <- structure(list(start.date = structure(1:3, .Label = c("2015-04-01",
"2015-04-15", "2015-04-30"), class = "factor"), end.date = structure(1:3, .Label = c("2015-04-15",
"2015-04-30", "2015-05-30"), class = "factor"), wtchange = c(5L,
10L, 15L), se = c(1.2, 2.5, 0.8)), .Names = c("start.date", "end.date",
"wtchange", "se"), class = "data.frame", row.names = c(NA, -3L
))
wtchange.data
# start.date end.date wtchange se
# 1 2015-04-01 2015-04-15 5 1.2
# 2 2015-04-15 2015-04-30 10 2.5
# 3 2015-04-30 2015-05-30 15 0.8
wtchange.data$start.date <- as.Date(wtchange.data$start.date)
wtchange.data$end.date <- as.Date(wtchange.data$end.date)
Попытка использовать geom_bar
:
library(ggplot2)
ggplot(wtchange.data, aes(x = start.date, y = wtchange)) +
geom_bar(stat = "identity", color = "black") +
geom_errorbar(aes(ymin = wtchange-se, ymax = wtchange+se), width = 1)
(не допускаются> 2 ссылки с < 10 репутации, так может, к сожалению, не покажет первый участок)
Основная проблема заключается в том, что при определении эстетики области графика (x = start.date, y = wtchange
) я могу использовать только одну переменную (start.date в этом примере) для оси x, но мне действительно нужно чтобы как-то использовать как start.date, так и end.date, чтобы разграничить ширину полосы, соответствующую каждому периоду. График должен выглядеть следующим образом (нарисованный в Paint):
Вторичная проблема состоит в том, что стержни должны касаться без пробелов, но я не уверен, если это вообще возможно, учитывая, что стержни должны быть разной ширины, поэтому вы не можете установить ширину полосы для всех баров. Можно ли установить ширину для каждого бара вручную?
Edit: Спасибо Хенрика за ссылки. Я сделал некоторый дальнейший прогресс. I рассчитываются середины даты для центрирования полосы по адресу:
wtchange.data$date.midpoint <- wtchange.data$start.date +
(wtchange.data$end.date - wtchange.data$start.date)/2
И затем вычисленные длины периодов для использования в качестве штриховой ширины:
wtchange.data$period.length <- wtchange.data$end.date - wtchange.data$start.date
Обновленного код графа Сейчас:
ggplot(wtchange.data, aes(x = date.midpoint, y = wtchange)) +
geom_bar(stat = "identity", color = "black", width = wtchange.data$period.length) +
geom_errorbar(aes(ymin = wtchange-se, ymax = wtchange+se), width = 1)
Единственная проблема, остающаяся i что все еще есть небольшой промежуток между барами в одном месте. Думаю, это связано с тем, как расписание разницы между датами R раундов до ближайшего числа дней?