ggplot2 - 如何用颜色填充嵌套的多边形?
ggplot2 - how to fill nested polygons with colour?
我在一个独特的 SpatialPolygonsDataFrame
中有超过 100 个嵌套多边形。我希望用 ggplot2
和 绘制它们,它们都需要在地图中可见 ,即覆盖更大的多边形必须在背景中。
我发现我可以通过在 geom_polygon
函数中使用 alpha = 0
来实现这一点,但是 我如何为每个多边形分配填充颜色?
这里是我的代码示例,只有 2 个多边形:
library(ggplot2)
读取合并了两个 shapefile 的 csv 文件,然后从 maptools
.
转换为 data.frame 和 fortify
#read csv file shape_1_2.csv
shape_1_2 = read.csv('shape_1_2.csv', stringsAsFactors = FALSE)
#plot
ggplot() +
geom_polygon(data = shape_1_2, aes(x = long, y = lat, group = group),
colour = 'black', size = 1, linetype = 'solid', alpha = 0)
及相关地图:
如何给这两个多边形填充颜色?
我尝试在 aes
和 geom_polygon
中添加 fill='black'
但它不起作用。
谢谢
更新
很抱歉,我意识到我的示例数据不包含嵌套多边形。
所以根据 https://gis.stackexchange.com/questions/280671/r-create-multipolygon-from-overlapping-polygons-using-sf-package 从以下 data.frame 开始:
shape_df = data.frame(
lon = c(0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 2, 2, 0.8, 1, 1, 2, 2, 1, 1),
lat = c(0, 0, 1, 1.5, 0, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 0, 0, 1, 1, 0),
var = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3 ,3 ,3 ,3 ,3, 4 ,4 ,4, 4, 4)
)
我的绘图代码(alpha=0
):
ggplot() +
geom_polygon(data = shape_df, aes(x = lon, y = lat, group = var),
colour = 'black', size = 1, linetype = 'solid', alpha = 0)
附相关地图:
如何用一种或最多 4 种颜色填充地图中存在的不同区域,以便较大的多边形保留在较小的多边形背景中?
将名为 "aux" 的变量添加到您可以在 ggplot2"fill = aux" 中使用的每个形状
你可以尝试做:
library(maptools)
library(ggplot2)
shape_1 <- readShapePoly('poly_1.shp') %>%
fortify() %>%
mutate(aux = c("1"))
shape_2 <- readShapePoly('poly_2.shp') %>%
fortify() %>%
mutate(aux = c("2"))
shape_1_2 = rbind(shape_1, shape_2)
ggplot() +
geom_polygon(data = shape_1_2, aes(x = long, y = lat, group = group),
colour = 'black', size = 0.1, linetype = 'solid', alpha = 0, fill = aux)
如果您添加 fill
但有 alpha=0
,您将看不到任何颜色,因为它们是 100% 透明的。
我不确定你到底想达到什么目的,因为我可以看到 3 个多边形,你可以用不同的颜色着色,而不仅仅是 2 个。
如果你尝试这个 ggplot-call,它将 id 作为填充变量(作为因子):
ggplot() +
geom_polygon(data = shape_1_2, aes(x = long, y = lat, group = group, fill=factor(id)),
colour = 'black', size = 1, linetype = 'solid', alpha = 1)
或者这个,它采用 group 作为填充变量(作为因子)并允许您定义自己的颜色。
ggplot(shape_1_2) +
aes(x = long, y = lat, group = group, fill=factor(group)) +
geom_polygon() +
scale_fill_manual(values = c("green", "red", "blue")) +
geom_path(color="black")
您还可以使用 scale_fill_brewer
函数,它可以让您选择一个预定义的调色板(显示可能的调色板:display.brewer.all()
)
ggplot(shape_1_2) +
aes(x = long, y = lat, group = group, fill=factor(group)) +
geom_polygon() +
scale_fill_brewer(palette = "RdYlGn") +
geom_path(color="black") +
ggtitle("fill=factor(group)")
如果使用 sf
执行此操作,则可以使用 st_area
获取每个多边形的面积(面积对于未投影的玩具数据没有多大意义,但会有意义与实际形状),然后根据面积对多边形进行排序。这样,ggplot
将按 ID 顺序创建多边形。 要使用 geom_sf
,您需要 github dev version of ggplot2
, though it's being added to the next CRAN release, slated for next month (July 2018)。
首先根据数据创建一个简单的特征集合。在这种情况下,我不得不使用 summarise(do_union = F)
以正确的顺序将每个点系列变成一个多边形 (),然后计算每个点的面积。
library(tidyverse)
library(sf)
#> Linking to GEOS 3.6.1, GDAL 2.1.3, proj.4 4.9.3
shape_df <- data.frame(
lon = c(0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 2, 2, 0.8, 1, 1, 2, 2, 1, 1),
lat = c(0, 0, 1, 1.5, 0, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 0, 0, 1, 1, 0),
var = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3 ,3 ,3 ,3 ,3, 4 ,4 ,4, 4, 4)
)
shape_areas <- shape_df %>%
st_as_sf(coords = c("lon", "lat")) %>%
group_by(var) %>%
summarise(do_union = F) %>%
st_cast("POLYGON") %>%
st_cast("MULTIPOLYGON") %>%
mutate(area = st_area(geometry)) %>%
mutate(var = as.factor(var))
shape_areas
#> Simple feature collection with 4 features and 3 fields
#> geometry type: MULTIPOLYGON
#> dimension: XY
#> bbox: xmin: 0 ymin: 0 xmax: 2 ymax: 2
#> epsg (SRID): NA
#> proj4string: NA
#> var do_union area geometry
#> 1 1 FALSE 1.25 MULTIPOLYGON (((0 0, 1 0, 1...
#> 2 2 FALSE 1.00 MULTIPOLYGON (((0 1, 1 1, 1...
#> 3 3 FALSE 1.10 MULTIPOLYGON (((1 1, 2 1, 2...
#> 4 4 FALSE 1.00 MULTIPOLYGON (((1 0, 2 0, 2...
此时绘制,面积与绘制顺序无关;它只是按 var
,数字排序:
shape_areas %>%
ggplot() +
geom_sf(aes(fill = var), alpha = 0.9)
但是如果我使用 forcats::fct_reorder
通过减少面积重新排序 var
作为一个因素,多边形将按顺序绘制,最大的多边形在底部,较小的多边形在顶部分层。 编辑: 正如@SeGa 在下面指出的那样,这最初是将较大的形状放在顶部。使用 -area
或 desc(area)
降序排列。
shape_areas %>%
mutate(var = var %>% fct_reorder(-area)) %>%
ggplot() +
geom_sf(aes(fill = var), alpha = 0.9)
由 reprex package (v0.2.0) 创建于 2018-06-30。
我在一个独特的 SpatialPolygonsDataFrame
中有超过 100 个嵌套多边形。我希望用 ggplot2
和 绘制它们,它们都需要在地图中可见 ,即覆盖更大的多边形必须在背景中。
我发现我可以通过在 geom_polygon
函数中使用 alpha = 0
来实现这一点,但是 我如何为每个多边形分配填充颜色?
这里是我的代码示例,只有 2 个多边形:
library(ggplot2)
读取合并了两个 shapefile 的 csv 文件,然后从 maptools
.
fortify
#read csv file shape_1_2.csv
shape_1_2 = read.csv('shape_1_2.csv', stringsAsFactors = FALSE)
#plot
ggplot() +
geom_polygon(data = shape_1_2, aes(x = long, y = lat, group = group),
colour = 'black', size = 1, linetype = 'solid', alpha = 0)
及相关地图:
如何给这两个多边形填充颜色?
我尝试在 aes
和 geom_polygon
中添加 fill='black'
但它不起作用。
谢谢
更新
很抱歉,我意识到我的示例数据不包含嵌套多边形。
所以根据 https://gis.stackexchange.com/questions/280671/r-create-multipolygon-from-overlapping-polygons-using-sf-package 从以下 data.frame 开始:
shape_df = data.frame(
lon = c(0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 2, 2, 0.8, 1, 1, 2, 2, 1, 1),
lat = c(0, 0, 1, 1.5, 0, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 0, 0, 1, 1, 0),
var = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3 ,3 ,3 ,3 ,3, 4 ,4 ,4, 4, 4)
)
我的绘图代码(alpha=0
):
ggplot() +
geom_polygon(data = shape_df, aes(x = lon, y = lat, group = var),
colour = 'black', size = 1, linetype = 'solid', alpha = 0)
附相关地图:
如何用一种或最多 4 种颜色填充地图中存在的不同区域,以便较大的多边形保留在较小的多边形背景中?
将名为 "aux" 的变量添加到您可以在 ggplot2"fill = aux" 中使用的每个形状
你可以尝试做:
library(maptools)
library(ggplot2)
shape_1 <- readShapePoly('poly_1.shp') %>%
fortify() %>%
mutate(aux = c("1"))
shape_2 <- readShapePoly('poly_2.shp') %>%
fortify() %>%
mutate(aux = c("2"))
shape_1_2 = rbind(shape_1, shape_2)
ggplot() +
geom_polygon(data = shape_1_2, aes(x = long, y = lat, group = group),
colour = 'black', size = 0.1, linetype = 'solid', alpha = 0, fill = aux)
如果您添加 fill
但有 alpha=0
,您将看不到任何颜色,因为它们是 100% 透明的。
我不确定你到底想达到什么目的,因为我可以看到 3 个多边形,你可以用不同的颜色着色,而不仅仅是 2 个。
如果你尝试这个 ggplot-call,它将 id 作为填充变量(作为因子):
ggplot() +
geom_polygon(data = shape_1_2, aes(x = long, y = lat, group = group, fill=factor(id)),
colour = 'black', size = 1, linetype = 'solid', alpha = 1)
或者这个,它采用 group 作为填充变量(作为因子)并允许您定义自己的颜色。
ggplot(shape_1_2) +
aes(x = long, y = lat, group = group, fill=factor(group)) +
geom_polygon() +
scale_fill_manual(values = c("green", "red", "blue")) +
geom_path(color="black")
您还可以使用 scale_fill_brewer
函数,它可以让您选择一个预定义的调色板(显示可能的调色板:display.brewer.all()
)
ggplot(shape_1_2) +
aes(x = long, y = lat, group = group, fill=factor(group)) +
geom_polygon() +
scale_fill_brewer(palette = "RdYlGn") +
geom_path(color="black") +
ggtitle("fill=factor(group)")
如果使用 sf
执行此操作,则可以使用 st_area
获取每个多边形的面积(面积对于未投影的玩具数据没有多大意义,但会有意义与实际形状),然后根据面积对多边形进行排序。这样,ggplot
将按 ID 顺序创建多边形。 要使用 geom_sf
,您需要 github dev version of ggplot2
, though it's being added to the next CRAN release, slated for next month (July 2018)。
首先根据数据创建一个简单的特征集合。在这种情况下,我不得不使用 summarise(do_union = F)
以正确的顺序将每个点系列变成一个多边形 (
library(tidyverse)
library(sf)
#> Linking to GEOS 3.6.1, GDAL 2.1.3, proj.4 4.9.3
shape_df <- data.frame(
lon = c(0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 2, 2, 0.8, 1, 1, 2, 2, 1, 1),
lat = c(0, 0, 1, 1.5, 0, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 0, 0, 1, 1, 0),
var = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3 ,3 ,3 ,3 ,3, 4 ,4 ,4, 4, 4)
)
shape_areas <- shape_df %>%
st_as_sf(coords = c("lon", "lat")) %>%
group_by(var) %>%
summarise(do_union = F) %>%
st_cast("POLYGON") %>%
st_cast("MULTIPOLYGON") %>%
mutate(area = st_area(geometry)) %>%
mutate(var = as.factor(var))
shape_areas
#> Simple feature collection with 4 features and 3 fields
#> geometry type: MULTIPOLYGON
#> dimension: XY
#> bbox: xmin: 0 ymin: 0 xmax: 2 ymax: 2
#> epsg (SRID): NA
#> proj4string: NA
#> var do_union area geometry
#> 1 1 FALSE 1.25 MULTIPOLYGON (((0 0, 1 0, 1...
#> 2 2 FALSE 1.00 MULTIPOLYGON (((0 1, 1 1, 1...
#> 3 3 FALSE 1.10 MULTIPOLYGON (((1 1, 2 1, 2...
#> 4 4 FALSE 1.00 MULTIPOLYGON (((1 0, 2 0, 2...
此时绘制,面积与绘制顺序无关;它只是按 var
,数字排序:
shape_areas %>%
ggplot() +
geom_sf(aes(fill = var), alpha = 0.9)
但是如果我使用 forcats::fct_reorder
通过减少面积重新排序 var
作为一个因素,多边形将按顺序绘制,最大的多边形在底部,较小的多边形在顶部分层。 编辑: 正如@SeGa 在下面指出的那样,这最初是将较大的形状放在顶部。使用 -area
或 desc(area)
降序排列。
shape_areas %>%
mutate(var = var %>% fct_reorder(-area)) %>%
ggplot() +
geom_sf(aes(fill = var), alpha = 0.9)
由 reprex package (v0.2.0) 创建于 2018-06-30。