2017-07-25 10 views
5

マップ・プロットを作成しています。ここで、すべての状態に小さなテキスト・ラベルを貼りたいのです。私の現在の問題は、それが見栄えしないようにテキストは、状態の範囲外に行くことです: enter image description hereテキストタイトルがポリゴンオブジェクト内にあることを確認するにはどうすればよいですか?

私は上の平均値、中央値、重心とを使用してみました。私が欲しいもの

はここのように、完全にポリゴン内側または外側になるように、すべてのテキストです:enter image description herehttp://www.businessinsider.com/map-what-100-is-actually-worth-in-your-state-2015-7?IR=Tから画像)

私は私の写真を生成するために、次のコードを使用します。

library(maps) 
library(dplyr) 
library(ggplot2) 

#data 
mapbase <- map_data("state.vbm")  
data(state.vbm.center) 
df <- state.vbm.center %>% as.data.frame() %>% 
    mutate(region = unique(mapbase$region)) %>% full_join(mapbase) 


#actual plotting 
cnames <- aggregate(cbind(long, lat) ~ region, data=df, FUN=median) 
gmap<- 
    ggplot()+ 
    geom_polygon(data=df2, 
       aes(long, lat, group = region, fill = somevalue,alpha=0.3)) + 
    coord_fixed() + 
    theme_void() + 
    geom_text(data=cnames, aes(fontface=2 ,cnames$long, cnames$lat , label = "text" 
), color= "black" ,size=3,check_overlap = T, position=position_jitter(width=3, height=3) ) + 

    scale_fill_gradient(low="red",high="blue") 

おかげさまで、ありがとうございました!

答えて

3

考慮すべき点がいくつかあります。

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) 

center location

を。あなたがラベル付けする必要があるのは州名であれば、これで十分です:

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) 

abbreviated names

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 

sorted by area size

が小さい状態のため、マップ上のいくつかの素晴らしい空の領域を選択:米国の州では、州の面積は私たちにそれを計算する手間が省け、標準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) 

legend box

(注:長いテキストの場合は、おそらくx軸の制限を増やしたり、改行を挿入する必要があります)

関連する問題