r - 在 R 中使用 ggplot 绘制直方图的多面图
问题描述
我有以下四列数据:年、月、日、降雨。
dat <- structure(list(Year = c(1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L,
1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L, 1979L), Month = c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L,
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L,
4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,
5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L,
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L,
6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L,
7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L,
7L, 7L, 7L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L,
8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L,
8L, 8L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L,
9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L, 9L,
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L,
10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L, 10L,
10L, 10L, 10L, 10L, 10L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L,
11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L,
11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 11L, 12L, 12L, 12L, 12L,
12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L,
12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L, 12L,
12L), Day = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L,
13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L,
26L, 27L, 28L, 29L, 30L, 31L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L,
9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L,
22L, 23L, 24L, 25L, 26L, 27L, 28L, 1L, 2L, 3L, 4L, 5L, 6L, 7L,
8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L,
21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 1L, 2L,
3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L,
17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L,
30L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L,
14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L,
27L, 28L, 29L, 30L, 31L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L,
10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L,
23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 1L, 2L, 3L, 4L, 5L, 6L,
7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L,
20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 1L,
2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L,
16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L,
29L, 30L, 31L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L,
12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L,
25L, 26L, 27L, 28L, 29L, 30L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L,
9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L,
22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L, 31L, 1L, 2L, 3L,
4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L,
18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L, 29L, 30L,
1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L,
15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L,
28L, 29L, 30L, 31L), Rainfall = c(1, 35.5, 20.3, 2.5, 32, 66.8,
0, 0, 1.8, 0, 5.3, 0, 0, 0, 11.7, 40.4, 45.7, 15.3, 21.6, 10.5,
26.2, 54.1, 1.5, 26.9, 39.4, 21.6, 1.3, 95.6, 10.2, 0, 5.1, 0,
4.1, 2.9, 0, 0.5, 2.1, 15.7, 14.2, 28.7, 134.2, 26.3, 0, 0, 0,
2.3, 0, 2.8, 0.3, 0.8, 0, 0, 1.8, 0, 0, 0.8, 0, 0, 3.3, 13.6,
32.9, 47.7, 1.8, 78.8, 27.1, 0, 0, 45.5, 2, 1.4, 0, 0.5, 0, 0,
19.8, 11.4, 8.7, 0, 0, 0, 4.8, 0, 2.5, 10.5, 24.7, 0.8, 10.4,
6.9, 13, 0, 0, 0, 3.1, 2.8, 23.9, 2.8, 0, 1.8, 7.4, 29.8, 0.5,
0, 0, 27, 16.5, 0, 6.9, 0, 0, 0, 0, 6.6, 0.6, 1.3, 0, 0, 9.7,
2, 15.3, 6.4, 11.1, 0.5, 16.8, 1.5, 0, 2.3, 1.3, 0, 3.6, 95.5,
3.4, 1.3, 35.3, 0, 1.3, 1.8, 0, 0, 0, 36.3, 0, 6.1, 1.8, 0, 4.8,
0, 0, 0, 0, 0, 0, 0, 0, 2.3, 5.9, 52.1, 2.5, 3.8, 15.7, 0, 7.9,
8.9, 0, 0, 5.6, 0, 26.2, 9.1, 22.6, 1.8, 17.5, 68.1, 0, 2.3,
3.1, 9.7, 105.9, 30.7, 3.8, 0, 31.2, 11.7, 0, 0, 18.8, 6.3, 3.6,
0, 0, 0, 0, 43.3, 0.5, 1.3, 49.3, 1, 0, 0, 0, 4.3, 6.4, 5.4,
0.3, 64.8, 0, 0, 0, 0, 0, 0, 38.1, 0, 8.4, 0, 0, 3.3, 0, 4.4,
1.6, 0, 0, 7.4, 0, 0.5, 0, 0, 0, 0.8, 1.5, 3.3, 0, 0, 0, 2, 0,
0, 6.4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36.6, 45.2, 13.9, 5.1,
0, 0, 0, 1.8, 0, 0, 1.3, 0, 0, 0.5, 0, 0, 0, 2.3, 0, 0, 0, 25.7,
0, 3.6, 0.3, 0, 0, 0, 0, 0, 19.1, 22.1, 24.2, 0.5, 5.1, 0, 0,
0, 0, 0, 0, 2.3, 0, 0, 1.5, 11.5, 21.3, 28.2, 67.8, 55.7, 25.3,
2.3, 27.5, 0, 0, 14.2, 10.4, 12.7, 14.7, 9.7, 1.8, 0, 0, 0, 0,
0, 14.5, 0.5, 10.6, 0.5, 2, 1.5, 7.4, 14.3, 15.2, 0, 37.1, 18.3,
0.5, 3.3, 4.9, 68.6, 1.5, 0, 4.1, 20.1, 25.3, 23.9, 6.3, 26.2,
50.8, 15, 1.1, 44.2, 1.5, 0, 0, 0, 0, 14.5, 24.4, 0, 39.1, 151.7,
26.4, 1, 3.6, 2.5, 0, 1.3, 4.1, 7.1, 1.8, 7.6, 84.7, 1.5, 0)), row.names = c(NA,
365L), class = "data.frame")
这只是数据的一个子集。我将把它应用到我 1979-2017 年的数据中。
我想绘制超过每月 95% 的降雨“持续时间”的直方图。所以x轴是持续时间,y轴是频率。我正在使用 rle() 函数来执行此操作。
我有以下脚本:
library(dplyr)
dat2 <- jan %>%
group_by(Year,Month) %>%
mutate(extreme = Rainfall > quantile(Rainfall,0.95,na.rm=TRUE))
result <- rle(dat2$extreme)
hist(result$lengths[result$values],breaks = c(0:5), xlab = "Length of extreme events", main = "")
我每月通过首先过滤直方图来手动提取直方图,如下所示:
jan <- dat[which(dat$Year==1),]
然后在“jan”上应用上面的脚本。
我想知道在 R 中是否有更有效的方法来做到这一点?
请注意,第 95 个百分位数是针对 1979-2017 年的同一个月计算的。例如,1979-2017 年所有 1 月的第 95 个百分位。
基本上我想要两个具有 3 x 2 结构的地块。
情节1:
第 1 行:一月至三月
第 2 行:4 月至 6 月
情节2:
第 1 行:7 月至 9 月
第 2 行:10 月至 12 月
这是情节 1 的示例输出。
有关如何执行此 R 的任何建议?我会很感激任何帮助。
解决方案
我会建议一种facet
方法。我重新使用了您的代码并计算了所需的极端变量,以便过滤新的数据帧。由于您的月份是数字的,因此您可以拆分cut()
并使用 for facets。这里的代码:
library(tidyverse)
dat2 <- dat %>%
group_by(Year,Month) %>%
mutate(extreme = Rainfall > quantile(Rainfall,0.95,na.rm=TRUE))
#Plot
dat3 <- dat2 %>% filter(extreme==T) %>% mutate(MonthC=cut(Month,breaks=c(1,3,6,9,12),include.lowest = T,
dig.lab = 10,right = T))
#Code
ggplot(dat3,aes(x=Rainfall))+
geom_histogram(fill='cyan3',color='black')+
facet_wrap(.~MonthC,ncol = 1)+
theme_bw()
输出:
使用此代码,您可以按月获得一个矩阵:
#Plot
dat3 <- dat2 %>% filter(extreme==T)
#Code
ggplot(dat3,aes(x=Rainfall))+
geom_histogram(fill='cyan3',color='black')+
facet_wrap(.~factor(Month),ncol = 4)+
theme_bw()
输出:
更新:我添加了一个函数来申请每个月的函数rle()
,然后绘制:
#Data
dat2 <- dat %>%
group_by(Year,Month) %>%
mutate(extreme = Rainfall > quantile(Rainfall,0.95,na.rm=TRUE))
#Plot
LS <- split(dat2,dat2$Month)
#Process
myfun <- function(x)
{
v1 <- x$extreme
result <- rle(v1)
v2 <- result$lengths[result$values]
#New dataframe
df <- data.frame(Month=rep(unique(x$Month),length(v2)),v2)
return(df)
}
#Apply
LS2 <- lapply(LS,myfun)
#Bind
ndf <- do.call(rbind,LS2)
#Code
ggplot(ndf,aes(x=v2))+
geom_histogram(fill='cyan3',color='black')+
facet_wrap(.~factor(Month),ncol = 4)+
theme_bw()
输出:
推荐阅读
- android - 显示 BottomSheetDIalogFragment 时如何禁用应用程序的调光?
- python - 将 df 重新采样到更小的时间步并平均计数
- java - SyntaxError:无法在“文档”上执行“评估”错误,将参数作为 xpath 传递?
- c# - 确保在编译时我的项目的使用者不需要我的项目的 PackageReference
- sql-server - 使用 SQL Server 2012 查找两条 SQL 记录之间的时间延迟
- javascript - 获取用户头像并在频道中发送
- python-3.x - _tkinter.TclError:无法连接以显示“127.0.0.1:0.0”
- firebase - Firebase Functions:了解 Firebase CLI 部署的新版本号
- doxygen - 我可以在 url/ 在线存储库上运行 doxygen 吗?
- javascript - 关闭浏览器后如何删除本地存储项?