本文へスキップ
からだにいいもの

Rのトピックスを中心に『まだ、まだ、知らない、役に立つ情報?』を発信します。

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

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

参考に気象庁から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"))

出力例

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

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

このコードの続きをAIに聞く

スポンサーリンク
Prices and shipping availability may change. Please refer to the product page at time of purchase.
Content displayed on this site is provided by Amazon and may be updated or removed.
Amazon Associate, karada-good earns income through qualifying sales.