Фасетная сетка по фактору и продолжительности времени - PullRequest
0 голосов
/ 12 ноября 2019

Я пытаюсь создать ggplot, который показывает период времени, в течение которого птицы каждый день летали над участком в ответ на одну из четырех обработок, сгруппированных по блокам. Есть 6 блоков. Каждое лечение проводилось в разные дни в течение двух часов.

Первая проблема заключается в том, что при использовании facet_grid все точки данных для каждого блока группируются по первой дате каждого блока, а не распределяются по четырем дням внутри блока.

* 1005Во-вторых, несмотря на то, что я читал различные учебные пособия, я не смог понять, как справляться с продолжительностью времени (переменная = Total.Time), то есть минут и секунд, в течение которых птицы присутствовали. Я хотел бы использовать переменную Total.Time_mins, чтобы показать общее время (минуты и секунды), затраченное на поиск по сайту. Шкала явно отключена, так как разница между 15 минутами и 2 секундами должна быть заметно больше. Данные времени в электронной таблице были введены в формате ЧЧ: ММ: СС.

Я приложил копию графика, на котором показаны соответствующие проблемы:

plot

Пример данных приведен ниже в созданных переменных, помеченных как Date, Total.Time_mins и Treatment

Dates <- as.Date(c("0019-10-07", "0019-10-08", "0019-10-09", "0019-10-10", "0019-10-11", "0019-10-12", "0019-10-13", "0019-10-14", "0019-10-14", "0019-10-15","0019-10-16", "0019-10-17"))
Total.Time <- c("0:02:27", "0:00:16","0:00:22", "0:00:03", "0:00:00", "0:00:20", "0:01:32", "0:09:11", "0:00:30", "0:07:26", "0:00:59", "0:14:13")
Treat <- c("Playback", "Control", "Decoys & Playback", "Decoys", "Control", "Decoys", "Playback", "Decoys & Playback", "Decoys", "Playback", "Control", "Decoys & Playback")
Blocks <- c("1","1","1","1","2","2","2","2","3","3","3","3")
Data1 <- data.frame(Dates, Total.Time, Treat, Blocks)

Вот код, который я создал до сих пор.

[names(Data)
 \[1\] "Dates"                 "Blocks"                "Treat"            "Observation"          "Total.Time"     
 \[6\] "Time"                 "Max_Birds"            "Landing"              "Wind_Speed"           "Beaufort_Force_Scale"
\[11\] "Wind_Direction" 

# Convert the date information into R's date format.  R will automatically treat these dates as numeric in our analyses.
Data$Date <- as.Date(Data$Date, format = "%d/%m/%Y")

# Create GGPlot of time spent prospecting over site
p = ggplot(Data1, aes(Dates, Total.Time, fill=Treat)) + geom_bar(stat = "identity") 
p = p + facet_grid(.~ Blocks)
p = p + scale_fill_grey(start=0.8, end=0.0)
p = p + theme(panel.background = element_blank())
p = p + theme(axis.text.x=element_text(size=16, vjust=0.6),  
              axis.title.x=element_text(face="bold", size=16, vjust=-6),
              axis.title.y=element_text(face="bold", size=16),
              axis.text.y=element_text(size=16), 
              legend.text = element_text(size=12), 
              axis.line=element_line())
p = p + theme(axis.text.x=element_text(size=16, vjust=0.6)) 
#p = p + scale_x_date(date_labels="%d %b", date_breaks = "4 day", breaks = 4)
p = p + theme(axis.text.x = element_text(face="bold", size=10, angle=90))
p

1 Ответ

0 голосов
/ 13 ноября 2019

ggplot имеет scale_y_time, которые работают с объектами класса hms из пакета hms. Если вы преобразуетесь в этот класс, он будет использоваться автоматически.

Data1$total_time_hms = hms::as_hms(as.character(Data1$Total.Time))

ggplot(Data1, aes(Dates, total_time_hms, fill=Treat)) +
  geom_col()  +
  facet_grid(. ~ Blocks) +
  scale_fill_grey(start=0.8, end=0.0) +
  scale_x_date(date_labels="%d %b", date_breaks = "4 day", breaks = 4)

enter image description here

Я также

  • удалил всепараметры theme, так как они казались не связанными с вопросом
  • , переключились на geom_col вместо geom_bar(stat = "identity")
  • , не понимаю, что вы имеете в виду "все точки данных длякаждый блок сгруппирован по первой дате каждого блока, а не распределен по четырем дням внутри блока. " (Возможно, вам не нужна полная шкала для каждой оси x? Вы можете заменить свой facet_grid с facet_wrap(~ Blocks, scales = "free_x") ... но так как ваши данные образца имеют 4 дня на блок, и вы явно запрашиваете разрывы на оси каждые 4 дня, столбцы будут сгруппированы вокруг одной оси / разрыва / метки)
...