如何在R中使用tmap手动设置点的颜色

7
我正在尝试创建一张地图,显示根据某些定义的类别分类的井的位置。我已将每个井的水位相对于其完整记录进行了分类,将水位分为“最高水位”、“高于正常水位”、“正常”、“低于正常水位”、“最低水位”等术语。使用tmap,我想使用以下颜色来显示每种情况:“最高水位”=深蓝色,“高于正常水位”=浅蓝色,“正常”=绿色,“低于正常水位”=黄色,“最低水位”=红色。
到目前为止,我已经为制图创建了一个sf文件。
Library(tidyverse)
library(sf)
library(spData)
Library(tmap)
Library(tmaptools)

我的数据

test <- structure(list(well = c(3698L, 3697L, 4702L, 15001L, 1501L, 3737L, 
1674L, 5988L, 1475L, 15017L), con = c("N", "B", "H", "B", "L", 
"B", "N", "A", "N", "B"), x = c(2834091L, 2838342L, 2802911L, 
2845228L, 2834408L, 2834452L, 2838641L, 2834103L, 2803192L, 2929417L
), y = c(6166870L, 6165512L, 6125649L, 6174527L, 6161309L, 6168216L, 
6170055L, 6164397L, 6140763L, 6227467L)), row.names = c(NA, -10L
), class = c("tbl_df", "tbl", "data.frame"))

创建用于映射的sf文件

test_sf <-test %>% 
  st_as_sf(coords = c("x","y"),crs = 27200,agr="constant")

获取背景地图。
HB_map <- nz %>% 
  filter(Name=="Hawke's Bay") %>% 
  read_osm(type = "stamen-terrain")

在地图上绘制数据

qtm(HB_map)+ #this is part of tmap and used to draw a thematic map plot
  tm_shape(nz %>% filter(Name=="Hawke's Bay"))+ #define data source
  tm_borders(col = "grey40", lwd = 2, lty = "solid", alpha = NA)+
  tm_shape(test_sf)+  
tm_dots("con",palette=c(H='blue',A='cyan',N='green',B='yellow',L='red'),stretch.palette = FALSE,size = 0.4,shape =21)

这张地图显示的颜色是正确的,但它们与正确的分类不一致。我可以改变颜色的顺序,但是这张地图并不总包含每个分类,因此颜色再次被错误分配(如果这样说没问题的话)。

1个回答

7
你可以将con列转换为因子。级别的默认顺序是按字母顺序排列的,这就是你可以分配颜色的方法。如果级别为空,它仍将包含在图例中。
test_sf$con <- as.factor(test_sf$con)

tm_shape(nz %>% filter(Name=="Hawke's Bay"))+ #define data source
  tm_borders(col = "grey40", lwd = 2, lty = "solid", alpha = NA)+
  tm_shape(test_sf[test_sf$con != "H",])+  
  tm_dots(col = "con", palette=c(A='cyan', B='yellow', H='blue',L='red',N='green'), stretch.palette = FALSE,size = 0.4,shape =21)

这里输入图像描述

(read_osm() 对我不起作用..)


非常感谢,这个解决方法非常完美。我更新了代码,加入了tmaptools,因为我一开始漏掉了它 - 这应该可以使read_osm正常工作。 - Simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接