平成28年10月21日鳥取県中部の地震03

ggmap , xts , gganimate パッケージ

(前の記事)
気象庁震源リスト03(熊本地震と新潟県中越地震)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
library(ggmap)
#
eqdata<-read.table(text="",col.names=c("time", "longitude", "latitude", "depth", "mag"))
ymd<-seq(as.Date("2016-10-21"),as.Date("2016-10-21"), by="1 day")
for (i in 1:length(ymd)){
date<-gsub("-","",ymd[i])
#ウェブスクレイピング
url<-paste0("http://www.data.jma.go.jp/svd/eqev/data/daily_map/",date,".html")
#
doc<-readLines(url,encoding ="UTF-8")
kensaku<-paste0(substr(date,1,4)," ",gsub("\\<0"," ",substr(date,5,6))," ",gsub("\\<0"," ",substr(date,7,8)))
#
x<-doc[grep(paste0("\\<",kensaku),doc)]
#全角文字 ° が入っているので半角スペース2つに変換する
x<-gsub("°", " ",x)
time<-paste0(substr(x,1,4),"-",substr(x,6,7),"-",substr(x,9,10)," ",substr(x,12,16),":",substr(x,18,21))
#
#南緯、西経の場合も考慮に入れると
latitude = as.numeric(paste0(substr(x,23,23),as.character(as.numeric(substr(x,24,25))+as.numeric(substr(x,28,29))/60+as.numeric(substr(x,31,31))/600)))
longitude = as.numeric(paste0(substr(x,34,34),as.character(as.numeric(substr(x,35,37))+as.numeric(substr(x,40,41))/60+as.numeric(substr(x,43,43))/600)))
depth<-as.numeric(substr(x,48,50))
mag<-as.numeric(substr(x,55,58))
eq<-data.frame(time,longitude,latitude,depth,mag)
eqdata<-rbind(eqdata,subset(eq,mag>=-4))
}
#
#重複した行を取り除く
eqdata<-unique(eqdata)
#head(eqdata) ; tail(eqdata)
#save(eqdata,file="eqdata20160414_0502.RData")
#load("eqdata20160414_0502.RData")
#
#震源の深さ
# depth<10km
eqdata1<-subset(eqdata,depth<10)
eqdata1$depth_rank<-" 10km 未満"
eqdata1$col<-"red"
# 10<=depth<20
eqdata2<-subset(eqdata,depth>=10 & depth<20)
eqdata2$depth_rank<-" 10km以上20km未満"
eqdata2$col<-"orange"
# 20<=depth<40
eqdata3<-subset(eqdata,depth>=20 & depth<40)
eqdata3$depth_rank<-" 20km以上40km未満"
eqdata3$col<-"gold4"
# 40<=depth<80
eqdata4<-subset(eqdata,depth>=40 & depth<80)
eqdata4$depth_rank<-" 40km以上80km未満"
eqdata4$col<-"green"
# 80<=depth<150
eqdata5<-subset(eqdata,depth>=80 & depth<150)
eqdata5$depth_rank<-" 80km以上150km未満"
eqdata5$col<-"blue"
# 150<=depth
eqdata6<-subset(eqdata,depth>=150)
eqdata6$depth_rank<-"150km以上"
eqdata6$col<-"purple"
#
eq<-rbind(eqdata1,eqdata2,eqdata3,eqdata4,eqdata5,eqdata6)
#並べ替え:マグニチュードの昇順
sortlist <- order(eq$mag)
eq<- eq[sortlist,]
##
#mag>=1の地震を抽出
subeq<-subset(eq,mag>=1)
#mag<1
mag1und<-subset(eq,mag<1)
#最大マグニチュードの地震の震源を地図の中心にする。
subset(eqdata,mag==max(eqdata$mag))
#
#par(family = "TakaoExMincho")
#最大マグニチュードの地震の震源を地図の中心にする場合(1つしか該当する地震がないとき)
gmap <- get_map(c(lon = subset(eqdata,mag==max(eqdata$mag))$longitude,subset(eqdata,mag==max(eqdata$mag))$latitude),zoom = 9, maptype = "terrain")
#
attr(gmap,"b")
# ll.lat ll.lon ur.lat ur.lon
#1 34.6591 132.9775 36.0923 134.7353
#
p<-ggmap(gmap)+
#mag>=1の地震をプロット
geom_point(data=subeq, aes(x=longitude, y=latitude,fill=depth_rank,size=mag),alpha=0.8,shape=21,color="gray20")+
#プロットする色を指定したい場合
scale_fill_manual(values=c("red","orange","gold4","green","blue","purple"),
breaks = c(" 10km 未満"," 10km以上20km未満"," 20km以上40km未満"," 40km以上80km未満"," 80km以上150km未満","150km以上"))+
#プロットする大きさの範囲を指定したい場合
scale_size(breaks=c(1,3,5,7),range = c(1,10)) +
labs(title=paste0(ymd[1],"~",ymd[length(ymd)]," 地震 (mag>=1)"))
#
#png("eq20161021_01.png",width=1000,height=800)
p
#dev.off()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
gmap <- get_map(c(lon = subset(eqdata,mag==max(eqdata$mag))$longitude,subset(eqdata,mag==max(eqdata$mag))$latitude),zoom = 12, maptype = "terrain")
#
attr(gmap,"b")
# ll.lat ll.lon ur.lat ur.lon
#1 35.29024 133.7453 35.46939 133.965
#
p<-ggmap(gmap)+
#mag>=1の地震をプロット
geom_point(data=subeq, aes(x=longitude, y=latitude,fill=depth_rank,size=mag),alpha=0.8,shape=21,color="gray20")+
#プロットする色を指定したい場合
scale_fill_manual(values=c("red","orange","gold4","green","blue","purple"),
breaks = c(" 10km 未満"," 10km以上20km未満"," 20km以上40km未満"," 40km以上80km未満"," 80km以上150km未満","150km以上"))+
#プロットする大きさの範囲を指定したい場合
scale_size(breaks=c(1,3,5,7),range = c(1,10)) +
labs(title=paste0(ymd[1],"~",ymd[length(ymd)]," 地震 (mag>=1)"))
#
#png("eq20161021_02.png",width=1000,height=800)
p
#dev.off()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
gmap <- get_map(c(lon = subset(eqdata,mag==max(eqdata$mag))$longitude,subset(eqdata,mag==max(eqdata$mag))$latitude),zoom = 11, maptype = "terrain")
#
attr(gmap,"b")
# ll.lat ll.lon ur.lat ur.lon
#1 35.20037 133.6356 35.55867 134.0751
#
p<-ggmap(gmap)+
#mag>=1の地震をプロット
geom_point(data=subeq, aes(x=longitude, y=latitude,fill=depth_rank,size=mag),alpha=0.8,shape=21,color="gray20")+
#プロットする色を指定したい場合
scale_fill_manual(values=c("red","orange","gold4","green","blue","purple"),
breaks = c(" 10km 未満"," 10km以上20km未満"," 20km以上40km未満"," 40km以上80km未満"," 80km以上150km未満","150km以上"))+
#プロットする大きさの範囲を指定したい場合
scale_size(breaks=c(1,3,5,7),range = c(1,10)) +
labs(title=paste0(ymd[1],"~",ymd[length(ymd)]," 地震 (mag>=1)"))
#
#png("eq20161021_03.png",width=1000,height=800)
p
#dev.off()

アニメーション

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
library(ggplot2)
#devtools::install_github("dgrtwo/gganimate")
library(gganimate)
library(xts)
#
# 1時間ごと
# 1時間ごとにプロットする準備
eq$period<-substring(eq$time,1,13)
#プロットする期間を抽出する場合
#時間単位で取り出す場合 xts(eq[,-1], as.POSIXct(eq$time)) とする
eq.xts<-xts(eq[,-1], as.POSIXct(eq$time))
#
subeq<-data.frame(coredata(eq.xts["2016-10-21 12:00::2016-10-21 23:59"]),stringsAsFactors = F)
#str(subeq)
#文字列になってしまったところをnumericに変換
subeq<-transform(subeq,longitude = as.numeric(longitude),latitude= as.numeric(latitude),depth= as.numeric(depth),mag= as.numeric(mag))
#マグニチュードの昇順に並べ替え
sortlist <- order(subeq$mag)
subeq<- subeq[sortlist,]
#
gmap <- get_map(c(lon = subset(eqdata,mag==max(eqdata$mag))$longitude,subset(eqdata,mag==max(eqdata$mag))$latitude),zoom = 11, maptype = "terrain")
attr(gmap,"b")
# ll.lat ll.lon ur.lat ur.lon
#1 35.20037 133.6356 35.55867 134.0751
#
### マグニチュード1以上の地震をプロット
#
lon1=c(attr(gmap,"b")$ll.lon,attr(gmap,"b")$ur.lon)
lat1=c(attr(gmap,"b")$ll.lat,attr(gmap,"b")$ur.lat)
#
p<-ggmap(gmap)+
#指定した範囲きっかりに描画
coord_cartesian(xlim=c(lon1[1],lon1[2]),ylim=c(lat1[1],lat1[2])) +
geom_point(data=subeq, aes(x=longitude, y=latitude,fill=depth_rank,size=mag, frame =period),alpha=0.8,shape=21,color="black")+
#プロットする色を指定したい場合
scale_fill_manual(values=c("red","orange","gold4","green","blue","purple"),
breaks = c(" 10km 未満"," 10km以上20km未満"," 20km以上40km未満"," 40km以上80km未満"," 80km以上150km未満","150km以上"))+
#プロットする大きさの範囲を指定したい場合
scale_size(breaks=c(1,3,5,7),range = c(1,10))+
guides(fill=FALSE , size=FALSE)
#
gg_animate(p,"tottori20161021.gif", interval = 1.5)