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

ggmap , mapdata , xts , ggplot2 , gganimate パッケージ

(データ)
気象庁 震源リスト
地震月報(カタログ編)

日本の地震カタログ(1923年から現在)の解説
年代によって地震カタログに違い(検知能力など)があることに注意

(関連記事)
気象庁震源リスト01 ( 平成28年(2016年)熊本地震 )
気象庁震源リスト02 ( 平成28年(2016年)熊本地震 )
データベース03
気象庁地震カタログ01
気象庁地震カタログ(アニメーション:鳥取県西部地震)

今回は、ggmapパッケージを使い、mag>=1の地震をプロット

熊本地震 2016年

新潟県中越地震 2004年

岩手・宮城内陸地震 2008年

鳥取県西部地震 2000年

兵庫県南部地震 1995年

動画

熊本地震 2016年

新潟県中越地震 2004年

岩手・宮城内陸地震 2008年

鳥取県西部地震 2000年

兵庫県南部地震 1995年

コード

熊本地震 2016年

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
92
93
94
95
96
97
library(ggmap)
library(mapdata)
#
eqdata<-read.table(text="",col.names=c("time", "longitude", "latitude", "depth", "mag"))
ymd<-seq(as.Date("2016-04-14"),as.Date("2016-05-02"), 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))
#
# time longitude latitude depth mag
#5312 2016- 4-16 01:25: 5.4 130.7617 32.75333 12 7.3
#
par(family = "TakaoExMincho")
#png("eq20160414_0502_01.png",width=1000,height=800)
#最大マグニチュードの地震の震源を地図の中心にする場合(1つしか該当する地震がないとき)
gmap <- get_map(c(lon = subset(eqdata,mag==max(eqdata$mag))$longitude,subset(eqdata,mag==max(eqdata$mag))$latitude),zoom = 9, maptype = "terrain")
#地図の中心を指定する場合
#gmap <- get_map(c(130.7617,32.75333),zoom = 9, maptype = "terrain")
attr(gmap,"b")
# ll.lat ll.lon ur.lat ur.lon
#1 32.00995 129.8841 33.48828 131.6419
#
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("eq20160414_0502_01.png",width=1000,height=800)
p
#dev.off()
mapdata パッケージを使う(図は省略)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
par(family = "TakaoExMincho")
#png("eq20160414_0502_02.png",width=1000,height=800)
map('japan',xlim=c(attr(gmap,"b")$ll.lon,attr(gmap,"b")$ur.lon),ylim=c(attr(gmap,"b")$ll.lat,attr(gmap,"b")$ur.lat),fill=T,col="gray90",mar = c(5,4,4,15))
map('japan',col="gray20",boundary =T,add=T)
points(mag1und$longitude,mag1und$latitude,cex=0.2,bg=adjustcolor(subeq$col,1),pch=21,col=adjustcolor(subeq$col,1))
points(subeq$longitude,subeq$latitude,cex=(subeq$mag-0.2)/2,bg=adjustcolor(subeq$col,0.8),pch=21,col="black")
points(c(130.1894,129.8372,132.3111),c(31.83361,33.51556,33.49083),cex=2,col="black",bg=c(adjustcolor("gray30",0.8),rep(rgb(1,1,1,0.8),2)),pch=24)
par(xpd=T)
#
cexsize=(c(1,3,5,7)-0.2)/2
legend(par("usr")[2]*1.001,par("usr")[3]*0.05+par("usr")[4]*0.95,title="Magnitude",
legend = c("M<1","M=1","M=3","M=5","M=7"),
col=1,pch=21,pt.cex=c(0.2,cexsize),
cex =1,bg ="gray90", x.intersp = 2, y.intersp =1.8,bty = "n")
#
legend(par("usr")[2],par("usr")[3]*0.6+par("usr")[4]*0.4,title="Depth",
legend = c("D<10km","10km<=D<20km","20km<=D<40km","40km<=D<80km","80km<=D<150km","150km<=D"),
cex=1,pch=19,col=c("red","orange","gold4","green","blue","purple"),
pt.cex =1.5,bg ="gray90", x.intersp = 1, y.intersp =1.2,bty = "n")
par(xpd=F)
title(paste0(ymd[1],"~",ymd[length(ymd)]," 地震"))
map.axes(cex.axis=0.8,las=1)
#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
43
44
45
#表示範囲を広くする ( zoom= 9 -> zoom= 8)
#最大マグニチュードの地震の震源を地図の中心にする場合(1つしか該当する地震がないとき)
gmap <- get_map(c(lon = subset(eqdata,mag==max(eqdata$mag))$longitude,subset(eqdata,mag==max(eqdata$mag))$latitude),zoom =8, maptype = "terrain")
#地図の中心を指定する場合
#gmap <- get_map(c(130.7617,32.75333),zoom =8, maptype = "terrain")
attr(gmap,"b")
# ll.lat ll.lon ur.lat ur.lon
#1 31.26048 129.0066 34.21703 132.5222
#
#devtools::install_github("dgrtwo/gganimate")
library(gganimate)
library(xts)
#
# 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)
# 1日ごとにプロットする準備
eq$period<-substring(eq$time,1,10)
#プロットする期間を抽出する場合
eq.xts<-xts(eq[,-1], as.POSIXct(eq$time))
#
subeq<-data.frame(coredata(eq.xts["2016-04-14::2016-05-02"]),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,]
#mag>=1の地震を抽出
subeq<-subset(subeq,mag>=1)
#
### マグニチュード1以上の地震をプロット
#
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,"kumamoto20160414_0502_02.gif", interval = 1.5)
mapdataパッケージを使った場合(図は省略)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
kyusyu <- map("japan",xlim=c(lon1[1],lon1[2]),ylim=c(lat1[1],lat1[2]), plot = FALSE,fill=T)
#
p<-ggplot(kyusyu) +
geom_polygon(aes(x = long, y = lat , group = group),colour = "gray30", size = 0.5,alpha = 0.7, fill = "lightgreen")+
#指定した範囲きっかりに描画
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,"kumamoto20160414_0502.gif", interval = 1.5)
#サイズ:675.4 kB (675,373 bytes)

新潟県中越地震 、 岩手・宮城内陸地震、鳥取県西部地震、兵庫県南部地震

震源データベースを作成していることが前提。関連記事を参照。
前半部を書き換えたら、(データをダウンロード -> 加工する)DBを作成せずに実行できる。

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
92
93
94
95
96
97
98
99
100
library(mapdata)
library(ggmap)
library(xts)
library(RSQLite)
#
driver=dbDriver("SQLite")
dbname="japan1983_2014.db"
con=dbConnect(driver,dbname)
#
##新潟県中越地震 2004年10月23日
# 2004-10-23 から 2004-11-11
#ymd<-"2004-10-23"
#period<-"2004-10-23::2004-11-11"
#eqdata0 <- dbGetQuery(con, "SELECT * FROM japan1983_2014 WHERE time >= '2004-10-23' AND time <= '2004-11-12' ;")
## 岩手・宮城内陸地震 2008-06-14
#ymd<-"2008-06-14"
#period<-"2008-06-14::2008-07-03"
#eqdata0 <- dbGetQuery(con, "SELECT * FROM japan1983_2014 WHERE time >= '2008-06-14' AND time <= '2008-07-04' ;")
## 鳥取県西部地震 2000-10-06
#ymd<-"2000-10-06"
#period<-"2000-10-06::2000-10-25"
#eqdata0 <- dbGetQuery(con, "SELECT * FROM japan1983_2014 WHERE time >= '2000-10-06' AND time <= '2000-10-26' ;")
## 兵庫県南部地震 1995-01-17
ymd<-"1995-01-17"
period<-"1995-01-17::1995-02-05"
eqdata0 <- dbGetQuery(con, "SELECT * FROM japan1983_2014 WHERE time >= '1995-01-17' AND time <= '1995-02-06' ;")
#
#eqdata0 <- dbGetQuery(con, "SELECT * FROM japan1983_2014 WHERE longitude >= 137.87 AND longitude <= 139.87
#AND latitude >= 36.3 AND latitude <= 38.3 AND time >= '2004-10-23' AND time <= '2004-11-12';")
#
#データベース接続を終了
#dbDisconnect(con)
#
#確認
head(eqdata0) ; tail(eqdata0)
#マグニチュード最大の地震
( loc<-subset(eqdata0,mag==max(eqdata0$mag)) )
#特定の日に起こったマグニチュード6.5以上の地震
#( loc<-subset(eqdata0,mag>=6.5 & grepl(ymd, eqdata0$time)) )
#
eqdata<-eqdata0[,-6]
#
#震源の深さ
# 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)
#
par(family = "TakaoExMincho")
#png("eq20160414_0502_01.png",width=1000,height=800)
#
gmap01 <- get_map(c(loc$longitude,loc$latitude),zoom = 9, maptype = "terrain")
#地図の中心を指定する場合
#gmap01 <- get_map(c(138.8672 , 37.2925),zoom = 9, maptype = "terrain")
attr(gmap01,"b")
#
p<-ggmap(gmap01)+
#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(period," 地震 (mag>=1)"))
#
#png(paste0("eq",ymd,".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
#表示範囲を広くする ( zoom= 9 -> zoom= 8)
#
gmap02 <- get_map(c(loc$longitude,loc$latitude),zoom =8, maptype = "terrain")
#地図の中心を指定する場合
#gmap02 <- get_map(c(138.8672 , 37.2925),zoom = 8, maptype = "terrain")
#
attr(gmap02,"b")
#
#devtools::install_github("dgrtwo/gganimate")
library(gganimate)
#
# 1日ごと
lon1=c(attr(gmap02,"b")$ll.lon,attr(gmap02,"b")$ur.lon)
lat1=c(attr(gmap02,"b")$ll.lat,attr(gmap02,"b")$ur.lat)
# 1日ごとにプロットする準備
eq$period<-substring(eq$time,1,10)
#プロットする期間を抽出する場合
eq.xts<-xts(eq[,-1], as.POSIXct(eq$time))
#
subeq<-data.frame(coredata(eq.xts[period]),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,]
#mag>=1の地震を抽出
subeq<-subset(subeq,mag>=1)
#
p<-ggmap(gmap02)+
#指定した範囲きっかりに描画
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,paste0("eq",ymd,".gif"), interval = 1.5)