在 R 中使用 cut_number() 绘制彩色美国州地图
Drawing colored US State map with cut_number() in R
我有一个名为 "drawdata" 的数据框:
GeoName Ranking
1 Alabama 15
2 Alaska 2
3 Arizona 28
4 Arkansas 12
5 California 19
6 Colorado 7
7 Connecticut 42
8 Delaware 37
9 District of Columbia 9
10 Florida 38
11 Georgia 11
12 Hawaii 48
13 Idaho 10
14 Illinois 16
15 Indiana 26
16 Iowa 34
17 Kansas 27
18 Kentucky 20
19 Louisiana 4
20 Maine 51
21 Maryland 30
22 Massachusetts 39
23 Michigan 14
24 Minnesota 23
25 Mississippi 41
26 Missouri 32
27 Montana 25
28 Nebraska 21
29 Nevada 45
30 New Hampshire 47
31 New Jersey 33
32 New Mexico 5
33 New York 44
34 North Carolina 13
35 North Dakota 31
36 Ohio 35
37 Oklahoma 6
38 Oregon 18
39 Pennsylvania 40
40 Rhode Island 49
41 South Carolina 29
42 South Dakota 46
43 Tennessee 43
44 Texas 3
45 Utah 17
46 Vermont 50
47 Virginia 8
48 Washington 24
49 West Virginia 22
50 Wisconsin 36
51 Wyoming 1
我想为每个排名绘制不同颜色的美国州地图。我的代码是:
names(drawdata) = c('region','value')
drawdata[,1] = tolower(drawdata[,1])
states = data.frame(state.center, state.abb)
states_map = map_data("state")
df = merge(drawdata, states_map, by = "region")
df$num = 49
p1 = ggplot(data = df, aes(x = long, y = lat, group = group))
p1 = p1 + geom_polygon(aes(fill = cut_number(value, num[1])))
p1 = p1 + geom_path(colour = 'gray', linestyle = 2)
p1 = p1 + scale_fill_brewer('', palette = 'PuRd')
p1 = p1 + coord_map()
p1 = p1 + scale_x_continuous(breaks=NULL) + scale_y_continuous(breaks=NULL)
p1 = p1 + theme(legend.position="none")
p1 = p1 + geom_text(data = states, aes(x = x, y = y, label = state.abb, group = NULL), size = 2)
p1
如果 'num' 或要填充的颜色数量很少,这将非常有效。但是,当我设置 'num=49' 时,它会产生错误:
Error in cut.default(x, breaks(x, "n", n), include.lowest = TRUE, ...) :
'breaks' are not unique
当我更改代码时
p1 = p1 + geom_polygon(aes(fill = cut_number(value, num[1])))
到
p1 = p1 + geom_polygon(aes(fill = cut_number(unique(value), num[1])))
然后它给了我一个不同的错误:
Error: Aesthetics must either be length one, or the same length as the dataProblems:cut_number(unique(value), num[1])
我想要一张地图,其中每 49 个州都有不同的颜色,每个州都反映了它们的 'Ranking'。非常感谢任何帮助!
如果您想为每个状态使用不同的颜色,使用渐变,您可以使用 scale_fill_gradient
。这是一个版本,在渐变的末端使用绿色和红色,这样每个状态都在那个比例上。
ggplot(data = df, aes(x = long, y = lat, group = group)) +
geom_polygon(aes(fill = value)) +
geom_path(colour = 'gray', linestyle = 2) +
scale_fill_gradient(low = "green", high = "red") +
coord_map() +
scale_x_continuous(breaks=NULL) + scale_y_continuous(breaks=NULL) +
theme(legend.position="none") +
geom_text(data = states, aes(x = x, y = y, label = state.abb, group = NULL), size = 2)
Brewer 调色板故意设置较小的最大值(通常 < 12),因为人类几乎不可能将细微差异映射到您拥有的离散值。你 可以 通过 "faking" 和 scale_fill_gradient2
实现你正在寻找的东西(注意:我故意留下图例,你也应该这样做):
library(ggplot2)
names(drawdata) <- c('region','value')
drawdata[,1] <- tolower(drawdata[,1])
states <- data.frame(state.center, state.abb)
states <- states[!(states$state.abb %in% c("AK", "HI")),] # they aren't part of states_map
states_map <- map_data("state")
p1 <- ggplot()
# borders
p1 <- p1 + geom_map(data=states_map, map=states_map,
aes(x=long, y=lat, map_id=region),
color="white", size=0.15)
# fills
p1 <- p1 + geom_map(data=drawdata, map=states_map,
aes(fill=value, map_id=region),
color="white", size=0.15)
# labels
p1 <- p1 + geom_text(data=states,
aes(x=x, y=y, label=state.abb, group=NULL), size=2)
# decent projection
p1 <- p1 + coord_map("albers", lat0=39, lat1=45)
p1 <- p1 + scale_fill_gradient2(low="#f7f4f9", mid="#df65b0", high="#67001f")
# better theme
p1 <- p1 + labs(x=NULL, y=NULL)
p1 <- p1 + theme_bw()
p1 <- p1 + theme(panel.grid=element_blank())
p1 <- p1 + theme(panel.border=element_blank())
p1 <- p1 + theme(axis.ticks=element_blank())
p1 <- p1 + theme(axis.text=element_blank())
p1
您可以使用 scale_fill_distiller
获得更好的结果,它在幕后做了很多事情,让您可以使用带有连续数据的 Color Brewer 调色板(我认为您没有连续数据):
p1 <- p1 + scale_fill_distiller(palette="PuRd")
我强烈建议继续像您最初那样使用 cut
并且最多有 9 个中断以适应您尝试使用的 Color Brewer 调色板。实际上,人们仍然需要 table 才能真正理解排名(永远不要假设美国人知道州的形状、位置甚至他们的两个字母缩写),所以我也几乎只是建议如果没有代替它,至少使用这个 choropleth 的实际 table 全名。
另请注意,您尝试构建地图的方式故意排除了阿拉斯加、夏威夷和哥伦比亚特区。您需要使用真实的 shapefile 和类似我介绍的东西 here 才能让它们很好地显示出来。
我有一个名为 "drawdata" 的数据框:
GeoName Ranking
1 Alabama 15
2 Alaska 2
3 Arizona 28
4 Arkansas 12
5 California 19
6 Colorado 7
7 Connecticut 42
8 Delaware 37
9 District of Columbia 9
10 Florida 38
11 Georgia 11
12 Hawaii 48
13 Idaho 10
14 Illinois 16
15 Indiana 26
16 Iowa 34
17 Kansas 27
18 Kentucky 20
19 Louisiana 4
20 Maine 51
21 Maryland 30
22 Massachusetts 39
23 Michigan 14
24 Minnesota 23
25 Mississippi 41
26 Missouri 32
27 Montana 25
28 Nebraska 21
29 Nevada 45
30 New Hampshire 47
31 New Jersey 33
32 New Mexico 5
33 New York 44
34 North Carolina 13
35 North Dakota 31
36 Ohio 35
37 Oklahoma 6
38 Oregon 18
39 Pennsylvania 40
40 Rhode Island 49
41 South Carolina 29
42 South Dakota 46
43 Tennessee 43
44 Texas 3
45 Utah 17
46 Vermont 50
47 Virginia 8
48 Washington 24
49 West Virginia 22
50 Wisconsin 36
51 Wyoming 1
我想为每个排名绘制不同颜色的美国州地图。我的代码是:
names(drawdata) = c('region','value')
drawdata[,1] = tolower(drawdata[,1])
states = data.frame(state.center, state.abb)
states_map = map_data("state")
df = merge(drawdata, states_map, by = "region")
df$num = 49
p1 = ggplot(data = df, aes(x = long, y = lat, group = group))
p1 = p1 + geom_polygon(aes(fill = cut_number(value, num[1])))
p1 = p1 + geom_path(colour = 'gray', linestyle = 2)
p1 = p1 + scale_fill_brewer('', palette = 'PuRd')
p1 = p1 + coord_map()
p1 = p1 + scale_x_continuous(breaks=NULL) + scale_y_continuous(breaks=NULL)
p1 = p1 + theme(legend.position="none")
p1 = p1 + geom_text(data = states, aes(x = x, y = y, label = state.abb, group = NULL), size = 2)
p1
如果 'num' 或要填充的颜色数量很少,这将非常有效。但是,当我设置 'num=49' 时,它会产生错误:
Error in cut.default(x, breaks(x, "n", n), include.lowest = TRUE, ...) :
'breaks' are not unique
当我更改代码时
p1 = p1 + geom_polygon(aes(fill = cut_number(value, num[1])))
到
p1 = p1 + geom_polygon(aes(fill = cut_number(unique(value), num[1])))
然后它给了我一个不同的错误:
Error: Aesthetics must either be length one, or the same length as the dataProblems:cut_number(unique(value), num[1])
我想要一张地图,其中每 49 个州都有不同的颜色,每个州都反映了它们的 'Ranking'。非常感谢任何帮助!
如果您想为每个状态使用不同的颜色,使用渐变,您可以使用 scale_fill_gradient
。这是一个版本,在渐变的末端使用绿色和红色,这样每个状态都在那个比例上。
ggplot(data = df, aes(x = long, y = lat, group = group)) +
geom_polygon(aes(fill = value)) +
geom_path(colour = 'gray', linestyle = 2) +
scale_fill_gradient(low = "green", high = "red") +
coord_map() +
scale_x_continuous(breaks=NULL) + scale_y_continuous(breaks=NULL) +
theme(legend.position="none") +
geom_text(data = states, aes(x = x, y = y, label = state.abb, group = NULL), size = 2)
Brewer 调色板故意设置较小的最大值(通常 < 12),因为人类几乎不可能将细微差异映射到您拥有的离散值。你 可以 通过 "faking" 和 scale_fill_gradient2
实现你正在寻找的东西(注意:我故意留下图例,你也应该这样做):
library(ggplot2)
names(drawdata) <- c('region','value')
drawdata[,1] <- tolower(drawdata[,1])
states <- data.frame(state.center, state.abb)
states <- states[!(states$state.abb %in% c("AK", "HI")),] # they aren't part of states_map
states_map <- map_data("state")
p1 <- ggplot()
# borders
p1 <- p1 + geom_map(data=states_map, map=states_map,
aes(x=long, y=lat, map_id=region),
color="white", size=0.15)
# fills
p1 <- p1 + geom_map(data=drawdata, map=states_map,
aes(fill=value, map_id=region),
color="white", size=0.15)
# labels
p1 <- p1 + geom_text(data=states,
aes(x=x, y=y, label=state.abb, group=NULL), size=2)
# decent projection
p1 <- p1 + coord_map("albers", lat0=39, lat1=45)
p1 <- p1 + scale_fill_gradient2(low="#f7f4f9", mid="#df65b0", high="#67001f")
# better theme
p1 <- p1 + labs(x=NULL, y=NULL)
p1 <- p1 + theme_bw()
p1 <- p1 + theme(panel.grid=element_blank())
p1 <- p1 + theme(panel.border=element_blank())
p1 <- p1 + theme(axis.ticks=element_blank())
p1 <- p1 + theme(axis.text=element_blank())
p1
您可以使用 scale_fill_distiller
获得更好的结果,它在幕后做了很多事情,让您可以使用带有连续数据的 Color Brewer 调色板(我认为您没有连续数据):
p1 <- p1 + scale_fill_distiller(palette="PuRd")
我强烈建议继续像您最初那样使用 cut
并且最多有 9 个中断以适应您尝试使用的 Color Brewer 调色板。实际上,人们仍然需要 table 才能真正理解排名(永远不要假设美国人知道州的形状、位置甚至他们的两个字母缩写),所以我也几乎只是建议如果没有代替它,至少使用这个 choropleth 的实际 table 全名。
另请注意,您尝试构建地图的方式故意排除了阿拉斯加、夏威夷和哥伦比亚特区。您需要使用真实的 shapefile 和类似我介绍的东西 here 才能让它们很好地显示出来。