R Language
地理的地図の紹介
サーチ…
前書き
地理データのI / Oも参照
パッケージマップからのmap()による基本的なマップ作成
パッケージmaps
の関数map()
は、Rを使用してマップを作成するための簡単な出発点を提供します。
基本的な世界地図は次のように描くことができます:
require(maps)
map()
アウトラインの色は、カラーパラメータcol
カラーの文字名または16進値のいずれかに設定することで変更できます。
require(maps)
map(col = "cornflowerblue")
色と陸地を埋めるためにcol
我々が設定することができますfill = TRUE
:
require(maps)
map(fill = TRUE, col = c("cornflowerblue"))
fill = TRUE
も設定されている場合、任意の長さのベクトルをcol
ことができます:
require(maps)
map(fill = TRUE, col = c("cornflowerblue", "limegreen", "hotpink"))
上記の例では、 col
からのcol
は、領域を表すマップのポリゴンに任意に割り当てられ、ポリゴンよりも色が少ない場合は色がリサイクルされます。
カラーコードを使用して、凡例に任意に記述できる統計変数を表すこともできます。そのようにして作成された地図は、「choropleth」として知られています。
次のchoroplethの例では、 database
が"county"
と"state"
のmap()
最初の引数を、 unemp
とcounty.fips
データセットのデータを使用してカラーコードの失業に設定しています。
require(maps)
if(require(mapproj)) { # mapproj is used for projection="polyconic"
# color US county map by 2009 unemployment rate
# match counties to map using FIPS county codes
# Based on J's solution to the "Choropleth Challenge"
# Code improvements by Hack-R (hack-r.github.io)
# load data
# unemp includes data for some counties not on the "lower 48 states" county
# map, such as those in Alaska, Hawaii, Puerto Rico, and some tiny Virginia
# cities
data(unemp)
data(county.fips)
# define color buckets
colors = c("paleturquoise", "skyblue", "cornflowerblue", "blueviolet", "hotpink", "darkgrey")
unemp$colorBuckets <- as.numeric(cut(unemp$unemp, c(0, 2, 4, 6, 8, 10, 100)))
leg.txt <- c("<2%", "2-4%", "4-6%", "6-8%", "8-10%", ">10%")
# align data with map definitions by (partial) matching state,county
# names, which include multiple polygons for some counties
cnty.fips <- county.fips$fips[match(map("county", plot=FALSE)$names,
county.fips$polyname)]
colorsmatched <- unemp$colorBuckets[match(cnty.fips, unemp$fips)]
# draw map
par(mar=c(1, 1, 2, 1) + 0.1)
map("county", col = colors[colorsmatched], fill = TRUE, resolution = 0,
lty = 0, projection = "polyconic")
map("state", col = "white", fill = FALSE, add = TRUE, lty = 1, lwd = 0.1,
projection="polyconic")
title("unemployment by county, 2009")
legend("topright", leg.txt, horiz = TRUE, fill = colors, cex=0.6)
}
Google Vizを使った50州地図と高度なコレラ
一般的な質問は、50のすべてのアメリカの州(アラスカとハワイが並置されている本土)を記述している場合のように、物理的に別々の地理的領域を同じ地図上に並置する方法です。
魅力的な50州地図を作成することは、Googleマップを活用すると簡単です。 GoogleのAPIへのインタフェースは、パッケージが含まgoogleVis
、 ggmap
、およびRgoogleMaps
。
require(googleVis)
G4 <- gvisGeoChart(CityPopularity, locationvar='City', colorvar='Popularity',
options=list(region='US', height=350,
displayMode='markers',
colorAxis="{values:[200,400,600,800],
colors:[\'red', \'pink\', \'orange',\'green']}")
)
plot(G4)
関数gvisGeoChart()
は、パッケージmaps
map()
などの古いマッピングメソッドと比較して、コレオレンスを作成するためにはるかに少ないコーディングを必要としmaps
。 colorvar
パラメータを使用すると、 locationvar
パラメータで指定されたレベルで統計変数を簡単にcolorvar
ことができます。 options
としてリストに渡されるさまざまなオプションは、サイズ( height
)、形状( markers
)、色分け( colorAxis
およびcolors
)などのマップの詳細のカスタマイズを可能にします。
インタラクティブプロットマップ
plotly
パッケージは、地図などのインタラクティブプロット、多くの種類のことができます。 plotly
地図を作成する方法はいくつかあります。どちらのマップデータを自分で供給(経由plot_ly()
またはggplotly()
の「ネイティブ」マッピング機能を使用する(経由plot_geo()
またはplot_mapbox()
両方の、あるいは組み合わせ。自分でマップを提供する例は次のようになります。
library(plotly)
map_data("county") %>%
group_by(group) %>%
plot_ly(x = ~long, y = ~lat) %>%
add_polygons() %>%
layout(
xaxis = list(title = "", showgrid = FALSE, showticklabels = FALSE),
yaxis = list(title = "", showgrid = FALSE, showticklabels = FALSE)
)
両方のアプローチの組み合わせのために、スワップplot_ly()
のためplot_geo()
またはplot_mapbox()
上記の例で。より多くの例については、 プロットの本を参照してください。
次の例は、 layout.geo属性を利用してマップの美しさとズームレベルを設定する「厳密にネイティブ」なアプローチです。また、 maps
のデータベースworld.cities
を使用してブラジルの都市をフィルタリングし、それらを「ネイティブ」マップの上にプロットします。
主な変数: poph
は都市とその人口(マウスのホバー上に表示される)を持つテキストです。 q
は、人口の分位数からの順序付けられた因子です。 ge
はマップのレイアウトに関する情報があります。詳細については、 パッケージのドキュメントを参照してください。
library(maps)
dfb <- world.cities[world.cities$country.etc=="Brazil",]
library(plotly)
dfb$poph <- paste(dfb$name, "Pop", round(dfb$pop/1e6,2), " millions")
dfb$q <- with(dfb, cut(pop, quantile(pop), include.lowest = T))
levels(dfb$q) <- paste(c("1st", "2nd", "3rd", "4th"), "Quantile")
dfb$q <- as.ordered(dfb$q)
ge <- list(
scope = 'south america',
showland = TRUE,
landcolor = toRGB("gray85"),
subunitwidth = 1,
countrywidth = 1,
subunitcolor = toRGB("white"),
countrycolor = toRGB("white")
)
plot_geo(dfb, lon = ~long, lat = ~lat, text = ~poph,
marker = ~list(size = sqrt(pop/10000) + 1, line = list(width = 0)),
color = ~q, locationmode = 'country names') %>%
layout(geo = ge, title = 'Populations<br>(Click legend to toggle)')
リーフレットを使った動的HTMLマップの作成
リーフレットは、ウェブ用のダイナミックマップを作成するためのオープンソースのJavaScriptライブラリです。 RStudioは、 htmlwidgets
で構築されたleaflet
パッケージから利用可能なリーフレット用のRバインディングをhtmlwidgets
。リーフレットマップは、 RMarkdownとShinyエコシステムとうまく統合されています。
マップは、 leaflet()
関数を使用してマップを初期化し、マップレイヤを追加(または削除)する関数を使用してパイプされます。ポップアップを持つマーカーからポリゴンまで、多くの種類のレイヤーが利用できます。渡されたdata.frame中の変数leaflet()
関数スタイルを介してアクセスされている~
引用。
state.name
およびstate.center
データセットをマップするには:
library(leaflet)
data.frame(state.name, state.center) %>%
leaflet() %>%
addProviderTiles('Stamen.Watercolor') %>%
addMarkers(lng = ~x, lat = ~y,
popup = ~state.name,
clusterOptions = markerClusterOptions())
(スクリーンショット:動的バージョンはクリックしてください) Shinyアプリケーションの動的リーフレットマップ
リーフレットパッケージは、シャイニーと整数になるように設計されています
UIでは、あなたは、呼び出しleafletOutput()
し、サーバーにあなたが呼び出すrenderLeaflet()
library(shiny)
library(leaflet)
ui <- fluidPage(
leafletOutput("my_leaf")
)
server <- function(input, output, session){
output$my_leaf <- renderLeaflet({
leaflet() %>%
addProviderTiles('Hydda.Full') %>%
setView(lat = -37.8, lng = 144.8, zoom = 10)
})
}
shinyApp(ui, server)
ただし、 renderLeaflet
式に影響する反応入力は、反応要素が更新されるたびにマップ全体が再描画されます。
したがって、既に実行されているマップを変更するには、 leafletProxy()
関数を使用する必要があります。
通常、 leaflet
を使用してマップの静的な側面を作成し、 leafletProxy
を使用して動的要素を管理します。たとえば、次のようになります。
library(shiny)
library(leaflet)
ui <- fluidPage(
sliderInput(inputId = "slider",
label = "values",
min = 0,
max = 100,
value = 0,
step = 1),
leafletOutput("my_leaf")
)
server <- function(input, output, session){
set.seed(123456)
df <- data.frame(latitude = sample(seq(-38.5, -37.5, by = 0.01), 100),
longitude = sample(seq(144.0, 145.0, by = 0.01), 100),
value = seq(1,100))
## create static element
output$my_leaf <- renderLeaflet({
leaflet() %>%
addProviderTiles('Hydda.Full') %>%
setView(lat = -37.8, lng = 144.8, zoom = 8)
})
## filter data
df_filtered <- reactive({
df[df$value >= input$slider, ]
})
## respond to the filtered data
observe({
leafletProxy(mapId = "my_leaf", data = df_filtered()) %>%
clearMarkers() %>% ## clear previous markers
addMarkers()
})
}
shinyApp(ui, server)