如何使用 usmap 标记数字而不是名称?

问题描述 投票:0回答:2

我知道 usmap 在

label
中有一个选项
plot_usmap()
。我想标记一些数字,而不是状态名称。我想 usmap 中应该有与州质心坐标相关的数据,但我不知道如何找到它。如果我能得到 坐标,然后我可以用
geom_text()
标记数字。

这是我的数据。

 State                Abbrev Code  n_votes Attitude              fips 
 1 Alabama              Ala.   AL          9 Solid Republican      01   
 2 Alaska               Alaska AK          3 Toss-up               02   
 3 Arizona              Ariz.  AZ         11 Toss-up               04   
 4 Arkansas             Ark.   AR          6 Solid Republican      05   
 5 California           Calif. CA         55 Solid Democrat        06   
 6 Colorado             Colo.  CO          9 Leaning to Democrat   08   
 7 Connecticut          Conn.  CT          7 Solid Democrat        09   
 8 Delaware             Del.   DE          3 Solid Democrat        10   
 9 District of Columbia D.C.   DC          3 Solid Democrat        11   
10 Florida              Fla.   FL         29 Leaning to Democrat   12   
11 Georgia              Ga.    GA         16 Toss-up               13   
12 Hawaii               Hawaii HI          4 Solid Democrat        15   
13 Idaho                Idaho  ID          4 Solid Republican      16   
14 Illinois             Ill.   IL         20 Solid Democrat        17   
15 Indiana              Ind.   IN         11 Leaning to Republican 18   
16 Iowa                 Iowa   IA          6 Leaning to Republican 19   
17 Kansas               Kans.  KS          6 Leaning to Republican 20   
18 Kentucky             Ky.    KY          8 Solid Republican      21   
19 Louisiana            La.    LA          8 Solid Republican      22   
20 Maine                Maine  ME          2 Solid Democrat        23   
21 Maryland             Md.    MD         10 Solid Democrat        24   
22 Massachusetts        Mass.  MA         11 Solid Democrat        25   
23 Michigan             Mich.  MI         16 Leaning to Democrat   26   
24 Minnesota            Minn.  MN         10 Toss-up               27   
25 Mississippi          Miss.  MS          6 Solid Republican      28   
26 Missouri             Mo.    MO         10 Leaning to Republican 29   
27 Montana              Mont.  MT          3 Solid Republican      30   
28 Nebraska             Nebr.  NE          2 Solid Republican      31   
29 Nevada               Nev.   NV          6 Leaning to Democrat   32   
30 New Hampshire        N.H.   NH          4 Leaning to Democrat   33   
31 New Jersey           N.J.   NJ         14 Solid Democrat        34   
32 New Mexico           N.M.   NM          5 Solid Democrat        35   
33 New York             N.Y.   NY         29 Solid Democrat        36   
34 North Carolina       N.C.   NC         15 Toss-up               37   
35 North Dakota         N.D.   ND          3 Solid Republican      38   
36 Ohio                 Ohio   OH         18 Toss-up               39   
37 Oklahoma             Okla.  OK          7 Solid Republican      40   
38 Oregon               Ore.   OR          7 Solid Democrat        41   
39 Pennsylvania         Pa.    PA         20 Leaning to Democrat   42   
40 Rhode Island         R.I.   RI          4 Solid Democrat        44   
41 South Carolina       S.C.   SC          9 Toss-up               45   
42 South Dakota         S.D.   SD          3 Solid Republican      46   
43 Tennessee            Tenn.  TN         11 Solid Republican      47   
44 Texas                Tex.   TX         38 Toss-up               48   
45 Utah                 Utah   UT          6 Leaning to Republican 49   
46 Vermont              Vt.    VT          3 Solid Democrat        50   
47 Virginia             Va.    VA         13 Leaning to Democrat   51   
48 Washington           Wash.  WA         12 Solid Democrat        53   
49 West Virginia        W.Va.  WV          5 Solid Republican      54   
50 Wisconsin            Wis.   WI         10 Leaning to Democrat   55   
51 Wyoming              Wyo.   WY          3 Solid Republican      56 

我想标记

n_votes
,它应该是类似的东西。我该怎么做?

谢谢,

r ggplot2 usmap
2个回答
5
投票

更新

usmap
已在版本
0.7.0
中进行了现代化改造,现在将地图数据作为简单功能返回,即
geom_text
将不再起作用。相反,我们必须切换到
geom_sf_text

library(usmap)
library(ggplot2)

# Get centroids
centroid_labels <- usmapdata::centroid_labels("states")

# Join data to centroids
data_labels <- merge(centroid_labels, statepop, by = "fips")

plot_usmap(data = statepop, values = "pop_2015", color = "white", labels = FALSE) +
  guides(fill = "none") +
  geom_sf_text(data = data_labels, ggplot2::aes(
    label = scales::number(pop_2015, scale = 1e-3, accuracy = 1)
  ), color = "white")

原答案

这可以像这样实现:

  1. 获取状态质心的坐标,该坐标作为数据包含在包

    usmapdata
    中。

  2. 使用坐标将数据集连接到 df

  3. 使用 geom_text 用您的数据标记地图

由于读取和整理您提供的数据需要一些时间(下次:在控制台中输入

dput(NAME_OF_DATASET)
并将以
structure(...
开头的输出复制并粘贴到您的帖子中)我只需使用提供的
statepop
数据通过包
usmap
作为示例数据:

library(usmap)
library(ggplot2)

# Get centroids
centroid_labels <- usmapdata::centroid_labels("states")

# Join data to centroids
data_labels <- merge(centroid_labels, statepop, by = "fips")

plot_usmap(data = statepop, values = "pop_2015", color = "white", labels = FALSE) +
  guides(fill = "none") +
  geom_text(data = data_labels, ggplot2::aes(
    x = x, y = y,
    label = scales::number(pop_2015, scale = 1e-3, accuracy = 1)
  ), color = "white")


4
投票

这是一个完整的替代示例,它允许您通过将美国地图转换为

ggplot
对象来使用
sf
。这让您可以自由地选择使用
ggplot
:

获得的绘图参数
library(usmap)
library(sf)
library(ggplot2)

d   <- us_map("states")

USS <- lapply(split(d, d$full), function(x) {
    if(length(table(x$piece)) == 1)
    {
      st_polygon(list(cbind(x$x, x$y)))
    }
    else
    {
      st_multipolygon(list(lapply(split(x, x$piece), function(y) cbind(y$x, y$y))))
    }
  })

USA  <- st_sfc(USS, crs = usmap_crs()@projargs)
USA  <- st_sf(data.frame(df, geometry = USA))
USA$centroids <- st_centroid(USA$geometry)

虽然这段代码可能看起来有点复杂,但它可以轻松绘制:

ggplot(USA) + 
  geom_sf(aes(fill = Attitude)) + 
  geom_sf_text(aes(label = n_votes, geometry = centroids), colour = "white") +
  scale_fill_manual(values = c("#67b5e3",  "#ffada2","#1155b6",
                               "#ed4747", "#cccccc"), guide = guide_none()) +
  theme_void()

数据

df <-  df <- structure(list(State = structure(1:51, .Label = c("Alabama", 
"Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", 
"Delaware", "District of Columbia", "Florida", "Georgia", "Hawaii", 
"Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky", 
"Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", 
"Minnesota", "Mississippi", "Missouri", "Montana", "Nebraska", 
"Nevada", "New Hampshire", "New Jersey", "New Mexico", "New York", 
"North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", 
"Pennsylvania", "Rhode Island", "South Carolina", "South Dakota", 
"Tennessee", "Texas", "Utah", "Vermont", "Virginia", "Washington", 
"West Virginia", "Wisconsin", "Wyoming"), class = "factor"), 
    Abbrev = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 9L, 8L, 
    10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 22L, 
    21L, 23L, 24L, 25L, 26L, 27L, 34L, 35L, 30L, 31L, 32L, 33L, 
    28L, 29L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 
    47L, 46L, 49L, 48L, 50L, 51L), .Label = c("Ala.", "Alaska", 
    "Ariz.", "Ark.", "Calif.", "Colo.", "Conn.", "D.C.", "Del.", 
    "Fla.", "Ga.", "Hawaii", "Idaho", "Ill.", "Ind.", "Iowa", 
    "Kans.", "Ky.", "La.", "Maine", "Mass.", "Md.", "Mich.", 
    "Minn.", "Miss.", "Mo.", "Mont.", "N.C.", "N.D.", "N.H.", 
    "N.J.", "N.M.", "N.Y.", "Nebr.", "Nev.", "Ohio", "Okla.", 
    "Ore.", "Pa.", "R.I.", "S.C.", "S.D.", "Tenn.", "Tex.", "Utah", 
    "Va.", "Vt.", "W.Va.", "Wash.", "Wis.", "Wyo."), class = "factor"), 
    Code = structure(c(2L, 1L, 4L, 3L, 5L, 6L, 7L, 9L, 8L, 10L, 
    11L, 12L, 14L, 15L, 16L, 13L, 17L, 18L, 19L, 22L, 21L, 20L, 
    23L, 24L, 26L, 25L, 27L, 30L, 34L, 31L, 32L, 33L, 35L, 28L, 
    29L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 47L, 
    46L, 48L, 50L, 49L, 51L), .Label = c("AK", "AL", "AR", "AZ", 
    "CA", "CO", "CT", "DC", "DE", "FL", "GA", "HI", "IA", "ID", 
    "IL", "IN", "KS", "KY", "LA", "MA", "MD", "ME", "MI", "MN", 
    "MO", "MS", "MT", "NC", "ND", "NE", "NH", "NJ", "NM", "NV", 
    "NY", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", 
    "UT", "VA", "VT", "WA", "WI", "WV", "WY"), class = "factor"), 
    n_votes = c(9, 3, 11, 6, 55, 9, 7, 3, 3, 29, 16, 4, 4, 20, 
    11, 6, 6, 8, 8, 2, 10, 11, 16, 10, 6, 10, 3, 2, 6, 4, 14, 
    5, 29, 15, 3, 18, 7, 7, 20, 4, 9, 3, 11, 38, 6, 3, 13, 12, 
    5, 10, 3), Attitude = structure(c(4L, 5L, 5L, 4L, 3L, 1L, 
    3L, 3L, 3L, 1L, 5L, 3L, 4L, 3L, 2L, 2L, 2L, 4L, 4L, 3L, 3L, 
    3L, 1L, 5L, 4L, 2L, 4L, 4L, 1L, 1L, 3L, 3L, 3L, 5L, 4L, 5L, 
    4L, 3L, 1L, 3L, 5L, 4L, 4L, 5L, 2L, 3L, 1L, 3L, 4L, 1L, 4L
    ), .Label = c("Leaning to Democrat", "Leaning to Republican", 
    "Solid Democrat", "Solid Republican", "Toss-up"), class = "factor"), 
    fips = structure(1:51, .Label = c("01", "02", "04", "05", 
    "06", "08", "09", "10", "11", "12", "13", "15", "16", "17", 
    "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", 
    "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", 
    "38", "39", "40", "41", "42", "44", "45", "46", "47", "48", 
    "49", "50", "51", "53", "54", "55", "56"), class = "factor")), 
    class = "data.frame", row.names = c(NA, -51L))
© www.soinside.com 2019 - 2024. All rights reserved.