Rで解析:ggplot2でデータ付き地図を作成「geofacet」パッケージ

Rの解析に役に立つ記事
スポンサーリンク

オリジナルの地図データにグラフをプロット可能なパッケージの紹介です。地図データさえ用意できれば非常に有効なパッケージだと思います。参考までに日本地図データの作成例とプロット例を紹介します。

参考に気象庁から20220503の毎時の最高気温を取得して、各都道府県にヒートマップをプロットするコマンドも紹介します。

パッケージバージョンは0.2.0。実行コマンドはwindows 11のR version 4.1.3で確認しています。

スポンサーリンク

日本地図データ例

お好みに合わせて、各都道府県の位置を調整してください。

#日本地図データの作成
JapanGrid <- data.frame(
  row = c(1, 3, 4, 5, 6, 7, 8, 4, 5, 6,
          7, 8, 9, 7, 8, 9, 7, 8, 9, 6,
          7, 8, 9, 8, 9, 8, 9, 10, 8, 9,
          8, 9, 8, 9, 11, 12, 11, 12, 9, 9,
          10, 11, 9, 10, 11, 9, 12),
  col = c(16, 16, 16, 16, 16, 16, 16, 15,
          15, 15, 15, 15, 15, 14, 14, 14,
          13, 13, 13, 12, 12, 12, 12, 11,
          11, 10, 10, 10, 9, 9, 8, 8, 7, 7,
          8, 8, 7, 7, 6, 4, 4, 4, 3, 3, 3, 2, 1),
  code = c("北海道", "青森県", "岩手県", "宮城県", "福島県",
           "茨城県", "千葉県", "秋田県", "山形県", "新潟県",
           "栃木県", "埼玉県", "東京都", "群馬県", "山梨県",
           "神奈川県", "富山県", "長野県", "静岡県", "石川県",
           "福井県", "岐阜県", "愛知県", "滋賀県", "三重県",
           "京都府", "奈良県", "和歌山県", "兵庫県", "大阪府",
           "鳥取県", "岡山県", "島根県", "広島県", "香川県", "徳島県",
           "愛媛県", "高知県", "山口県", "福岡県", "大分県", "宮崎県",
           "佐賀県", "熊本県", "鹿児島県", "長崎県", "沖縄県"),
  name = c("北海道", "青森県", "岩手県", "宮城県", "福島県",
           "茨城県", "千葉県", "秋田県", "山形県", "新潟県",
           "栃木県", "埼玉県", "東京都", "群馬県", "山梨県",
           "神奈川県", "富山県", "長野県", "静岡県", "石川県",
           "福井県", "岐阜県", "愛知県", "滋賀県", "三重県",
           "京都府", "奈良県", "和歌山県", "兵庫県", "大阪府",
           "鳥取県", "岡山県", "島根県", "広島県", "香川県", "徳島県",
           "愛媛県", "高知県", "山口県", "福岡県", "大分県", "宮崎県",
           "佐賀県", "熊本県", "鹿児島県", "長崎県", "沖縄県"))

#作業フォルダに日本地図データを保存
write.csv(JapanGrid, "JapanGrid.csv", row.names = FALSE)
########

パッケージのインストール

下記コマンドを実行してください。

#パッケージのインストール
install.packages("geofacet")

実行コマンド

詳細はコマンド、パッケージのヘルプを確認してください。体裁はggplot2のコマンドで調整可能です。

#パッケージの読み込み
library("geofacet")
library("ggplot2")
library("tcltk")

#先に作成した地図データを読み込む
JapanGrid <- read.csv(paste0(as.character(tkgetOpenFile(title = "ファイルを選択",
                                                           filetypes = '{"ファイル" {".*"}}',
                                                           initialfile = c("*.*")))))
########

###データ例を作成#####
TestJPN <- data.frame(Year = factor(rep(2015:2017, times = nrow(JapanGrid))),
                      Temp = sample(10:20, size = nrow(JapanGrid)*3, replace = TRUE),
                      Name = rep(JapanGrid[, 4], each = 3))
########

#地図データを表示:grid_previewコマンド
grid_preview(JapanGrid)

#地図データを利用してデータをプロット:facet_geoコマンド
#データの分割方法:facetsオプション;facet_wrapコマンドと同じ
#地図データを指定:gridオプション
ggplot(TestJPN, aes(x = Year, y = Temp, group = Name, col = Name)) +
  geom_line(show.legend = FALSE, size = 1.5) +
  facet_geo(facets = ~ Name, grid = JapanGrid) +
  scale_x_discrete(labels = function(x) paste0("'", substr(x, 3, 4))) +
  scale_y_continuous(labels = function(x) format(x, 2)) +
  labs(title = "2015-2017 各都道府県 仮想年平均気温") +
  theme(title = element_text(colour = "#ffffe0"),
        axis.title = element_text(colour = "#ffffe0"),
        axis.text = element_text(colour = "#ffffe0"),
        strip.text.x = element_text(size = 8),
        strip.background = element_rect(colour = "black", fill = "white"),
        axis.text.y = element_text(size = 5),
        panel.grid = element_blank(), 
        panel.background = element_rect(fill = "lightgray"),
        plot.background = element_rect(fill = "#0a0a0a"))

#参考:棒グラフで表示
ggplot(TestJPN, aes(x = Year, y = Temp, group = Name, fill = Name)) +
  geom_col(show.legend = FALSE) +
  facet_geo(facets = ~ Name, grid = JapanGrid) +
  scale_x_discrete(labels = function(x) paste0("'", substr(x, 3, 4))) +
  scale_y_continuous(labels = function(x) format(x, 2)) +
  labs(title = "2015-2017 各都道府県 仮想年平均気温 棒グラフ") +
  theme(title = element_text(colour = "#ffffe0"),
        axis.title = element_text(colour = "#ffffe0"),
        axis.text = element_text(colour = "#ffffe0"),
        strip.text.x = element_text(size = 8),
        strip.background = element_rect(colour = "black", fill = "white"),
        axis.text.y = element_text(size = 5),
        panel.grid = element_blank(), 
        panel.background = element_rect(fill = "lightgray"),
        plot.background = element_rect(fill = "#0a0a0a"))

出力例

各グラフはクリックで大きく見ることができます。

・grid_previewコマンド

・地図データを利用してデータをプロット:facet_geoコマンド

・参考:棒グラフで表示

最高気温を気象庁から取得してプロット

気象庁から20220503の毎時の最高気温を取得した例です。データを変えると最高気温以外もプロット可能です。

データを取得

###データ例を作成#####
#「tidyverse」パッケージを読み込み
if(!require("tidyverse", quietly = TRUE)){
  install.packages("tidyverse");require("tidyverse")
}
#都道府県を準備
JpanName <- c("北海道", "青森県", "岩手県", "宮城県", "福島県", "茨城県", "千葉県",
              "秋田県", "山形県", "新潟県", "栃木県", "埼玉県", "東京都", "群馬県",
              "山梨県", "神奈川県", "富山県", "長野県", "静岡県", "石川県", "福井県",
              "岐阜県", "愛知県", "滋賀県", "三重県", "京都府", "奈良県", "和歌山県",
              "兵庫県", "大阪府", "鳥取県", "岡山県", "島根県", "広島県", "香川県",
              "徳島県", "愛媛県", "高知県", "山口県", "福岡県", "大分県", "宮崎県",
              "佐賀県", "熊本県", "鹿児島県", "長崎県", "沖縄県")

#時間文字列を作成
Hour <- paste0(formatC(0:23, width = 2, flag = "0"), "00")

#データ保管用変数
NewMaxTemp <- data.frame()

for(i in seq(Hour)){
  ###気象庁から20220503の毎時の最高気温を取得#####
  #参考:https://www.data.jma.go.jp/obd/stats/data/mdrr/docs/csv_dl_readme.html
  MaxTemp <- read.csv(paste0("https://www.data.jma.go.jp/obd/stats/data/mdrr/tem_rct/alltable/mxtemsadext00_20220503", Hour[i], ".csv"),
                      header = T, fileEncoding = "cp932")
  #最高気温処理
  GetMaxTemp <- NULL
  for(n in 1:47){
    #都道府県を抽出
    GetNameData <- MaxTemp[which(MaxTemp[, 2] %in% grep(JpanName[n], MaxTemp[, 2], value = TRUE)),]
    #最高気温を降順で並び替え
    GetNameData <- GetNameData[order(GetNameData[, 10], decreasing = TRUE),]
    #最高気温を取得
    GetMaxTemp <- c(GetMaxTemp, GetNameData[1, 10])
  }
  
  HourTemp <- cbind(Hour[i], JpanName, GetMaxTemp)
  NewMaxTemp <- rbind(NewMaxTemp, HourTemp)
  
}

#列名を付与
colnames(NewMaxTemp) <- c("Hour", "Name", "MaxTemp")

#最高気温を数値化
NewMaxTemp[, 3] <- type.convert(NewMaxTemp[, 3], as.is = TRUE)

#Hourをfactor化
NewMaxTemp %>%
  mutate(Hour = factor(Hour)) -> NewMaxTemp
########

プロット

#パッケージの読み込み
library("geofacet")

#先に作成した地図データを読み込む
JapanGrid <- read.csv(paste0(as.character(tkgetOpenFile(title = "ファイルを選択",
                                                        filetypes = '{"ファイル" {".*"}}',
                                                        initialfile = c("*.*")))))

#プロット
ggplot(NewMaxTemp, aes(x = Hour, y = 1, group = Name, fill = MaxTemp)) +
  geom_tile(show.legend = FALSE, size = 1.5) + 
  facet_geo(facets = ~ Name, grid = JapanGrid) +
  scale_fill_gradient(low = "#6f74a4", high = "red") +
  labs(title = "20220503の毎時の最高気温") +
  theme(title = element_text(colour = "#ffffe0"),
        axis.title = element_text(colour = "#ffffe0"),
        axis.text = element_text(colour = "#ffffe0"),
        strip.text.x = element_text(size = 8),
        strip.background = element_rect(colour = "black", fill = "white"),
        axis.text.y = element_blank(),
        axis.text.x = element_blank(),
        axis.title.x = element_blank(),
        axis.title.y = element_blank(),
        panel.grid = element_blank(), 
        panel.background = element_rect(fill = "lightgray"),
        plot.background = element_rect(fill = "#0a0a0a"))

出力例

グラフはクリックで大きく見ることができます。


少しでも、あなたの解析が楽になりますように!!

タイトルとURLをコピーしました