r - 按因子和持续时间划分的分面网格
问题描述
我正在尝试制作一个 ggplot,它显示鸟类每天在一个场地上飞行的时间段,以响应按 Block 分组的四种治疗方法之一。有6个街区。在两小时的时间段内,在不同的一天进行每种治疗。
第一个问题是,在使用 时facet_grid
,每个 Block 的所有数据点都在每个 Block 的第一个日期分组,而不是分散在 Block 内的四天内。
其次,尽管阅读了各种教程,但我一直无法弄清楚如何处理持续时间(变量 = Total.Time),即鸟类出现的分钟和秒。我想使用 Total.Time_mins 变量来显示在网站上进行勘探的总时间(分钟和秒)。因为 15 分钟和 2 秒之间的差异应该明显更大,所以刻度显然是关闭的。电子表格中的时间数据输入为 HH:MM:SS。
我附上了图表的副本,其中显示了各自的问题:
下面在标记为 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
解决方案
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)
我也
- 删除了所有
theme
选项,因为它们似乎与问题无关 - 切换到
geom_col
而不是geom_bar(stat = "identity")
- 看不到您所说的“每个区块的所有数据点都在每个区块的第一个日期分组,而不是分布在区块内的四天内”。(也许您不希望每个 x 轴上的全刻度?您可以将您的替换
facet_grid
为facet_wrap(~ Blocks, scales = "free_x")
... 但由于您的示例数据每个块有 4 天,并且您明确要求每 4 天在轴上休息一次,条形图将围绕单个轴中断/标签聚集)
推荐阅读
- python - 有没有办法删除索引标签跨行更改的行
- java - 从命令行执行 Java Swing GUI 应用程序 - CMD
- nginx - epoll_wait() 报告客户端过早关闭连接,因此上游连接在向上游发送请求时也关闭
- mongodb - mongodb图像在mac上的docker容器上运行问题
- c# - 记录 WCF 超时服务器端
- python - 在 Python 中比较每月的销售额?
- apache-spark - 如何删除由 Spark Structured Streaming 创建的旧数据?
- .net - 找不到配置管理器
- sql-server - 递归 cte 查询 | 创建多个编号的行 | Sql-服务器
- c# - 返回 ok() 后,Asp 核心 web-api 会话为空