太平洋での航海のデータをrでプロットしたいと思ったのだが、いわゆる経度0を中心とする地図では太平洋が分断されてしまって見辛い。
太平洋を中心に持ってくるような地図が書きたいと思ったが案外めんどくさく悩んだのでメモ。
調べてみるとみんな大好きstack overflowに回答が。
https://stackoverflow.com/questions/34011100/plot-pacific-ocean-and-continents-with-ggplot2borders
library(ggplot2)
library(mapdata)
mp1 <- fortify(map(fill=TRUE, plot=FALSE))
mp2 <- mp1
mp2$long <- mp2$long + 360
mp2$group <- mp2$group + max(mp2$group) + 1
mp <- rbind(mp1, mp2)
ggplot(aes(x = long, y = lat, group = group), data = mp) +
geom_path() +
scale_x_continuous(limits = c(110, 300)) +
scale_y_continuous(limits = c(-50, 70))
map
を二つ作って無理矢理つなげている。
fortify
は初めて知ったが、 rbind
で結合するために map
オブジェクトを DataFrame
に変換するために使っているようだ。
mp
の中身を head()
で見るとこんな形になっている。
long | lat | group | order | region | subregion |
---|---|---|---|---|---|
-69.89912 | 12.45200 | 1 | 1 | Aruba | NA |
-69.89571 | 12.42300 | 1 | 2 | Aruba | NA |
-69.94219 | 12.43853 | 1 | 3 | Aruba | NA |
-70.00415 | 12.50049 | 1 | 4 | Aruba | NA |
とりあえず何も考えず手持ちの緯度経度のテーブルからプロットしてみる。
library(ggplot2)
library(mapdata)
library(readr)
library(dplyr)
#サンプリング場所のデータ読み込み
merged_Metadata <- read_tsv('merged_data.tsv')
#group として 全て 1 のカラム を追加
ones <- numeric(dim(merged_Metadata)[1])
ones <- ones + 1
withOne <- cbind(merged_Metadata,new)
mp1 <- fortify(map(fill=TRUE, plot=FALSE))
mp2 <- mp1
mp2$long <- mp2$long + 360
mp2$group <- mp2$group + max(mp2$group) + 1
mp <- rbind(mp1, mp2)
ggplot(aes(x = long, y = lat, group = group), data = mp) +
geom_path(color="gray") +
scale_x_continuous(limits = c(110, 300)) +
geom_point(data = withOne, aes(x = LONGITUDE, y = LATITUDE, group = ones), color = "red", size = 0.01)
なるほど、経度に関しては-の部分を+360しないと表示されないのね。
library(ggplot2)
library(mapdata)
library(readr)
library(dplyr)
#サンプリング場所のデータ読み込み
merged_Metadata <- read_tsv('merged_data.tsv')
#group として 全て 1 のカラム を追加
ones <- numeric(dim(merged_Metadata)[1])
ones <- ones + 1
withOne <- cbind(merged_Metadata,new)
LONGITUDE <- withOne[, "LONGITUDE"]
modLONGITUDE <- data.frame(modLONGITUDE = ifelse(LONGITUDE < 0, LONGITUDE + 360, LONGITUDE))
withModLongitude <- cbind(withOne, modLONGITUDE)
mp1 <- fortify(map(fill=TRUE, plot=FALSE))
mp2 <- mp1
mp2$long <- mp2$long + 360
mp2$group <- mp2$group + max(mp2$group) + 1
mp <- rbind(mp1, mp2)
ggplot(aes(x = long, y = lat, group = group), data = mp) +
geom_path(color="gray") +
scale_x_continuous(limits = c(110, 300)) +
geom_point(data = withModLongitude, aes(x = modLONGITUDE, y = LATITUDE, group = ones), color = "red", size = 0.01)
rworldmap
とか他の世界地図描画できるパッケージも調べたけど、基本的に対応してないので似たようなトリッキーな方法でやることになりそう