考慮すべき点がいくつかあります。
1 - 理想的な世界で
ポリゴン内の注釈の目的のために最適な場所は、すべての多角形は円形に類似しており、その中心には、テキストラベル(例えば、テキサス州)を配置するために最高の場所です。実際には、マップ領域はすべての種類の形状になります。&は、1つの部分でさえありません(ミシガンなど)。数学的平均/中間点は、ポリゴンの端またはポリゴンの外側にあってもよい(例えば、フロリダ)。
Rは、これらの合併症を理解しようとすることでそれほど大きくはないでしょう。代わりにGISソフトウェアを使用したいと思います。
ただし、ユースケースがUSの場合、state.vbm.center
データセットには、既定の座標がかなり用意されています。そのヘルプファイルの状態:
state.vbm.center注釈のための国家センター 目的の座標です。
のは、これらの点がどこにあるかを見てみましょう:
あまりにもみすぼらしいではありません
#data
mapbase <- map_data("state.vbm")
data(state.vbm.center)
cnames <- state.vbm.center %>% as.data.frame() %>%
mutate(region = unique(mapbase$region))
#actual plotting
ggplot()+
geom_polygon(data=mapbase,
aes(long, lat, group = region, fill = region),
alpha = 0.3) +
coord_fixed() + theme_void() +
geom_point(data = cnames,
aes(x, y)) +
scale_fill_discrete(guide = F)
を。あなたがラベル付けする必要があるのは州名であれば、これで十分です:
cnames$abb <- state.abb
ggplot()+
geom_polygon(data=mapbase,
aes(long, lat, group = region, fill = region),
alpha = 0.3) +
coord_fixed() + theme_void() +
geom_text(data=cnames,
aes(x, y , label = abb),
color= "black", size=3, fontface = 2,
hjust = 0.5, vjust = 0.5) + #central alignment
scale_fill_discrete(guide = F)
2 - 狭いスペース
に長いラベルをフィッティングそれは非常によく、マップポリゴン内のフィッティング短いラベルです、出産率、犯罪率、失業率、教育水準、所得範囲、人口密度、前回の選挙で投票した人の割合など、より多くの情報を追加したい場合は、より小さい/より多くの宇宙の宇宙を使い果たし始めるでしょう六角形のポリゴン。
大きいポリゴン内の情報を保持するこの時点で、デュアルアプローチを採用することができます。&小さなポリゴンを部分凡例のように片側に別々に配置します。
# incorporate area information & identify small area states
cnames$area <- state.area
ggplot(cnames %>%
mutate(region = factor(region, levels = region[order(area)])),
aes(x = region, y = area)) + geom_col() +
theme_classic() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust = 1))
# the first 7 states (up to Maryland) are noticeably smaller than the rest
が小さい状態のため、マップ上のいくつかの素晴らしい空の領域を選択:米国の州では、州の面積は私たちにそれを計算する手間が省け、標準datasets
パッケージの一部です。 Iは0から60までの範囲の経度= 140、&緯度で1列に垂直にそれらを整列することを決定した:
library(tidyr)
legend.states <- cnames$region[which(cnames$area <= 10577)]
legend.states <- as.data.frame(legend.states)
legend.states$long1 <- 140
legend.states$lat1 <- seq(0, 60, length.out = nrow(legend.states))
legend.states <- legend.states %>%
mutate(long2 = long1 + 5, lat2 = lat1) %>%
mutate(long3 = long2, lat3 = lat2 - 5) %>%
mutate(long4 = long1, lat4 = lat3) %>%
mutate(long5 = long1, lat5 = lat1) %>%
gather(k, v, -legend.states) %>%
mutate(order = as.integer(substring(k, nchar(k))),
k = gsub("[0-9]", "", k)) %>%
spread(k, v) %>%
rename(region = legend.states) %>%
mutate(group = mapbase$group[match(region, mapbase$region)]) %>%
select(long, lat, group, order, region) %>%
mutate(subregion = NA)
# add legend polygons to the original polygon dataset
mapbase2 <- rbind(mapbase, legend.states)
注釈は、それらが凡例ボックスの位置に整列されるように、これらの小さな状態、座標変更:
cnames2 <- left_join(cnames,
legend.states %>% filter(order %in% c(1, 4)) %>%
group_by(region) %>%
summarise(long = mean(long) + 7,
lat = mean(lat))) %>%
mutate(x = coalesce(long, x),
y = coalesce(lat, y),
hjust = ifelse(is.na(lat), 0.5, 0))
# left alignment (hjust=0) for small state text, central alignment (hjust=0.5) otherwise.
一緒にすべてを置く:
ggplot()+
geom_polygon(data=mapbase2,
aes(long, lat, group = region, fill = region),
alpha = 0.3) +
coord_fixed() + theme_void() +
geom_text(data=cnames2,
aes(x, y , label = abb, hjust = hjust),
size=3, fontface = 2,
vjust = 0.5) +
scale_fill_discrete(guide = F)
を
(注:長いテキストの場合は、おそらくx軸の制限を増やしたり、改行を挿入する必要があります)