在美国地图上绘制数值
Plotting Numerical Values on US Maps
我的数据如下,我在代码中称之为shortie:
State Min Max Average
1 AL 7.0 10.8 8.842857
2 AK 6.9 10.2 8.095238
3 AZ 5.4 10.0 6.623810
4 AR 9.5 15.4 12.157143
5 CA 5.8 7.9 6.309524
6 CO 6.5 9.8 7.557143
7 CT 5.0 7.9 5.700000
8 DE 5.2 8.4 6.090476
9 FL 7.0 10.9 8.423810
10 GA 6.0 10.3 7.094737
11 HI 15.3 22.6 18.652381
12 ID 7.8 13.9 9.957143
13 IL 5.4 8.8 6.300000
14 IN 6.3 9.6 7.423810
15 IA 6.1 9.0 6.971429
16 KS 5.9 9.2 6.880952
17 KY 6.9 13.5 8.609524
18 LA 5.6 9.6 7.500000
19 ME 7.1 9.7 8.004762
20 MD 5.6 9.7 6.757143
21 MA 5.5 7.9 5.961905
22 MI 5.4 8.2 6.171429
23 MN 5.3 7.7 6.066667
24 MS 4.8 9.4 6.376190
25 MO 6.2 9.6 7.114286
26 MT 7.1 8.6 7.576190
27 NE 6.3 8.0 6.942857
28 NV 28.4 99.0 52.614286
29 NH 6.5 9.5 7.576190
30 NJ 4.8 7.6 5.676190
31 NM 4.0 8.8 7.042857
32 NY 6.5 8.6 7.095238
33 NC 6.5 8.5 7.233333
34 ND 5.8 7.5 6.623810
35 OH 5.7 9.0 6.547619
36 OK 6.5 10.6 7.323529
37 OR 6.3 8.9 7.176190
38 PA 5.3 7.1 5.771429
39 RI 5.8 8.1 6.885714
40 SC 6.6 15.9 8.638095
41 SD 6.7 11.1 8.128571
42 TN 8.2 15.5 10.838095
43 TX 6.9 10.5 7.928571
44 UT 7.3 11.2 9.290476
45 VT 7.9 10.9 9.071429
46 VA 6.7 11.4 7.900000
47 WA 6.0 9.5 6.695238
48 WV 6.1 8.7 7.133333
49 WI 5.2 7.9 5.995238
50 WY 7.1 10.7 8.723810
我尝试了多种方法在美国地图上绘制此数据,我想要单独的图,只有最大值、最小值或平均值。
plot_usmap(regions="states", values="minimum")
plot_usmap(shortie, regions="states", values="minimum")
plot_usmap(shortie, regions="states", values="Min")
我要么得到空白地图,要么得到空白屏幕。我尝试将 "minimum" 定义为 shortie[2:2],因为有时我会收到错误消息,即在数据中找不到 Min 作为列。
此代码 运行s 但如您所见,它很长,出于某种原因它没有给佛罗里达赋予价值,如果我包括阿拉斯加也没有 运行和夏威夷。下面的代码没有阿拉斯加和夏威夷。此外,我想知道除了梯度之外,还有哪些其他替代方法可以在状态上直观地表示数字的 min/max/avg,可能通过 ggplot。
map.text("state", regions=c("alabama",
"arizona",
"arkansas",
"california",
"colorado",
"connecticut",
"delaware",
"district of columbia",
"florida",
"georgia",
"idaho",
"illinois",
"indiana",
"iowa",
"kansas",
"kentucky",
"louisiana",
"maine",
"maryland",
"massachusetts:main",
"michigan:north",
"minnesota",
"mississippi",
"missouri",
"montana",
"nebraska",
"nevada",
"new hampshire",
"new jersey",
"new mexico",
"new york:main",
"north carolina:main",
"north dakota",
"ohio",
"oklahoma",
"oregon",
"pennsylvania",
"rhode island",
"south carolina",
"south dakota",
"tennessee",
"texas",
"utah",
"vermont",
"virginia:main",
"washington:main",
"west virginia",
"wisconsin",
"wyoming"), labels=as.character(c(7,
5.4,
9.5,
5.8,
6.5,
5,
5.2,
4,
7,
6,
7.8,
5.4,
6.3,
6.1,
5.9,
6.9,
5.6,
7.1,
5.6,
5.5,
5.4,
5.3,
4.8,
6.2,
7.1,
6.3,
28.4,
6.5,
4.8,
4,
6.5,
6.5,
5.8,
5.7,
6.5,
6.3,
5.3,
5.8,
6.6,
6.7,
8.2,
6.9,
7.3,
7.9,
6.7,
6,
6.1,
5.2,
7.1)))
根据您的数据框,您可以执行以下操作:
1) 使用包maps
,您可以得到一张包含美国各州坐标的地图,如下所示。在此包中,您可以添加一列用于州名缩写。
library(maps)
states <- map_data("state")
DF <- states
DF$Abrev. <- unlist(sapply(DF$region, function(x) match(toupper(x), toupper(state.name))))
DF$Abrev. <- state.abb[DF$Abrev.]
2) 您可以使用缩写状态名称(此处使用 dplyr
包中的 left_join
)将您的值与此数据框 "DF" 合并,并将您的数据框重塑为更长的格式以创建每个变量的分类值(最大值、最小值、平均值)(此处使用 tidyr
包中的 pivot_longer
):
library(dplyr)
library(tidyr)
DF <- left_join(DF, df, by = c("Abrev." = "State"))
DF <- DF %>% pivot_longer(., cols = c(Min, Max, Average), names_to = "variable", values_to = "value")
# A tibble: 6 x 9
long lat group order region subregion Abrev. variable value
<dbl> <dbl> <dbl> <int> <chr> <chr> <chr> <chr> <dbl>
1 -87.5 30.4 1 1 alabama NA AL Min 7
2 -87.5 30.4 1 1 alabama NA AL Max 10.8
3 -87.5 30.4 1 1 alabama NA AL Average 8.84
4 -87.5 30.4 1 2 alabama NA AL Min 7
5 -87.5 30.4 1 2 alabama NA AL Max 10.8
6 -87.5 30.4 1 2 alabama NA AL Average 8.84
...
3) 最后,您可以使用 ggplot2
中的 geom_map
绘制它,并使用 facet_wrap
为每个变量 Max、Min、Average 创建一张美国地图,方法是:
library(ggplot2)
ggplot(DF, aes(map_id = region))+
geom_map(aes(fill = value), map = states)+
expand_limits(x = states$long, y = states$lat)+
facet_wrap(.~variable)+
它能回答您的问题吗?
如果您想使用 plot_usmap
,您需要确保向该函数提供 2 列数据:
A data frame containing values to plot on the map. This parameter
should be a data frame consisting of two columns, a fips code (2
characters for state, 5 characters for county) and the value that
should be associated with that region. The columns of data must be
fips or state and the value of the 'values' parameter.
所以如果你想绘制 minimum
你可以继续 shortie[,2:3]
:
state Min
1 AL 7.0
2 AK 6.9
3 AZ 5.4
4 AR 9.5
5 CA 5.8
...
请注意,state
列名称应小写以符合 plot_usmap
的预期。
然后下面的应该工作(设置values = "Min"
):
library(usmap)
library(ggplot2)
plot_usmap(data = shortie[,2:3],
regions="states",
values="Min") +
theme(legend.position = "right")
如果要绘制 Max
,请使用 shortie[,c(2,4)]
和 values = "Max"
。
如果要绘制 Average
,请使用 shortie[,c(2,5)]
和 values = "Average"
.
我的数据如下,我在代码中称之为shortie:
State Min Max Average
1 AL 7.0 10.8 8.842857
2 AK 6.9 10.2 8.095238
3 AZ 5.4 10.0 6.623810
4 AR 9.5 15.4 12.157143
5 CA 5.8 7.9 6.309524
6 CO 6.5 9.8 7.557143
7 CT 5.0 7.9 5.700000
8 DE 5.2 8.4 6.090476
9 FL 7.0 10.9 8.423810
10 GA 6.0 10.3 7.094737
11 HI 15.3 22.6 18.652381
12 ID 7.8 13.9 9.957143
13 IL 5.4 8.8 6.300000
14 IN 6.3 9.6 7.423810
15 IA 6.1 9.0 6.971429
16 KS 5.9 9.2 6.880952
17 KY 6.9 13.5 8.609524
18 LA 5.6 9.6 7.500000
19 ME 7.1 9.7 8.004762
20 MD 5.6 9.7 6.757143
21 MA 5.5 7.9 5.961905
22 MI 5.4 8.2 6.171429
23 MN 5.3 7.7 6.066667
24 MS 4.8 9.4 6.376190
25 MO 6.2 9.6 7.114286
26 MT 7.1 8.6 7.576190
27 NE 6.3 8.0 6.942857
28 NV 28.4 99.0 52.614286
29 NH 6.5 9.5 7.576190
30 NJ 4.8 7.6 5.676190
31 NM 4.0 8.8 7.042857
32 NY 6.5 8.6 7.095238
33 NC 6.5 8.5 7.233333
34 ND 5.8 7.5 6.623810
35 OH 5.7 9.0 6.547619
36 OK 6.5 10.6 7.323529
37 OR 6.3 8.9 7.176190
38 PA 5.3 7.1 5.771429
39 RI 5.8 8.1 6.885714
40 SC 6.6 15.9 8.638095
41 SD 6.7 11.1 8.128571
42 TN 8.2 15.5 10.838095
43 TX 6.9 10.5 7.928571
44 UT 7.3 11.2 9.290476
45 VT 7.9 10.9 9.071429
46 VA 6.7 11.4 7.900000
47 WA 6.0 9.5 6.695238
48 WV 6.1 8.7 7.133333
49 WI 5.2 7.9 5.995238
50 WY 7.1 10.7 8.723810
我尝试了多种方法在美国地图上绘制此数据,我想要单独的图,只有最大值、最小值或平均值。
plot_usmap(regions="states", values="minimum")
plot_usmap(shortie, regions="states", values="minimum")
plot_usmap(shortie, regions="states", values="Min")
我要么得到空白地图,要么得到空白屏幕。我尝试将 "minimum" 定义为 shortie[2:2],因为有时我会收到错误消息,即在数据中找不到 Min 作为列。
此代码 运行s 但如您所见,它很长,出于某种原因它没有给佛罗里达赋予价值,如果我包括阿拉斯加也没有 运行和夏威夷。下面的代码没有阿拉斯加和夏威夷。此外,我想知道除了梯度之外,还有哪些其他替代方法可以在状态上直观地表示数字的 min/max/avg,可能通过 ggplot。
map.text("state", regions=c("alabama",
"arizona",
"arkansas",
"california",
"colorado",
"connecticut",
"delaware",
"district of columbia",
"florida",
"georgia",
"idaho",
"illinois",
"indiana",
"iowa",
"kansas",
"kentucky",
"louisiana",
"maine",
"maryland",
"massachusetts:main",
"michigan:north",
"minnesota",
"mississippi",
"missouri",
"montana",
"nebraska",
"nevada",
"new hampshire",
"new jersey",
"new mexico",
"new york:main",
"north carolina:main",
"north dakota",
"ohio",
"oklahoma",
"oregon",
"pennsylvania",
"rhode island",
"south carolina",
"south dakota",
"tennessee",
"texas",
"utah",
"vermont",
"virginia:main",
"washington:main",
"west virginia",
"wisconsin",
"wyoming"), labels=as.character(c(7,
5.4,
9.5,
5.8,
6.5,
5,
5.2,
4,
7,
6,
7.8,
5.4,
6.3,
6.1,
5.9,
6.9,
5.6,
7.1,
5.6,
5.5,
5.4,
5.3,
4.8,
6.2,
7.1,
6.3,
28.4,
6.5,
4.8,
4,
6.5,
6.5,
5.8,
5.7,
6.5,
6.3,
5.3,
5.8,
6.6,
6.7,
8.2,
6.9,
7.3,
7.9,
6.7,
6,
6.1,
5.2,
7.1)))
根据您的数据框,您可以执行以下操作:
1) 使用包maps
,您可以得到一张包含美国各州坐标的地图,如下所示。在此包中,您可以添加一列用于州名缩写。
library(maps)
states <- map_data("state")
DF <- states
DF$Abrev. <- unlist(sapply(DF$region, function(x) match(toupper(x), toupper(state.name))))
DF$Abrev. <- state.abb[DF$Abrev.]
2) 您可以使用缩写状态名称(此处使用 dplyr
包中的 left_join
)将您的值与此数据框 "DF" 合并,并将您的数据框重塑为更长的格式以创建每个变量的分类值(最大值、最小值、平均值)(此处使用 tidyr
包中的 pivot_longer
):
library(dplyr)
library(tidyr)
DF <- left_join(DF, df, by = c("Abrev." = "State"))
DF <- DF %>% pivot_longer(., cols = c(Min, Max, Average), names_to = "variable", values_to = "value")
# A tibble: 6 x 9
long lat group order region subregion Abrev. variable value
<dbl> <dbl> <dbl> <int> <chr> <chr> <chr> <chr> <dbl>
1 -87.5 30.4 1 1 alabama NA AL Min 7
2 -87.5 30.4 1 1 alabama NA AL Max 10.8
3 -87.5 30.4 1 1 alabama NA AL Average 8.84
4 -87.5 30.4 1 2 alabama NA AL Min 7
5 -87.5 30.4 1 2 alabama NA AL Max 10.8
6 -87.5 30.4 1 2 alabama NA AL Average 8.84
...
3) 最后,您可以使用 ggplot2
中的 geom_map
绘制它,并使用 facet_wrap
为每个变量 Max、Min、Average 创建一张美国地图,方法是:
library(ggplot2)
ggplot(DF, aes(map_id = region))+
geom_map(aes(fill = value), map = states)+
expand_limits(x = states$long, y = states$lat)+
facet_wrap(.~variable)+
它能回答您的问题吗?
如果您想使用 plot_usmap
,您需要确保向该函数提供 2 列数据:
A data frame containing values to plot on the map. This parameter should be a data frame consisting of two columns, a fips code (2 characters for state, 5 characters for county) and the value that should be associated with that region. The columns of data must be fips or state and the value of the 'values' parameter.
所以如果你想绘制 minimum
你可以继续 shortie[,2:3]
:
state Min
1 AL 7.0
2 AK 6.9
3 AZ 5.4
4 AR 9.5
5 CA 5.8
...
请注意,state
列名称应小写以符合 plot_usmap
的预期。
然后下面的应该工作(设置values = "Min"
):
library(usmap)
library(ggplot2)
plot_usmap(data = shortie[,2:3],
regions="states",
values="Min") +
theme(legend.position = "right")
如果要绘制 Max
,请使用 shortie[,c(2,4)]
和 values = "Max"
。
如果要绘制 Average
,请使用 shortie[,c(2,5)]
和 values = "Average"
.