2
0

More than 5 years have passed since last update.

ggplot2で太平洋が中心の世界地図を書く

Posted at

太平洋での航海のデータを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)



download-2.png

なるほど、経度に関しては-の部分を+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)


download-3.png

rworldmap とか他の世界地図描画できるパッケージも調べたけど、基本的に対応してないので似たようなトリッキーな方法でやることになりそう

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0