1

我的地图制作代码根据人口普查数据生成地图,并将重要点绘制为 tm_dots() 图层。我想做的是区分点的类型(例如,如果位置是“非正式”或“商业”)。

tm_shape(bristol) + tm_fill("population", palette = "YlOrRd", 
auto.palette.mapping = TRUE, 
  title = "Bristol Population", 
  breaks = c(0,5,10,15,20,25), colorNA = "darkgrey") + tm_borders("grey25",alpha = 0.7, lwd = 0.1) +
  tm_dots("n", size=0.1,col="green", shapeNA = NA, title = "Spaces") + 
  tm_legend(text.size=1,title.size=1.2,position=c("left","top")) + 
  tm_layout(legend.outside = TRUE, legend.outside.position = "bottom", title.snap.to.legend = TRUE)

我正在寻找的本质上是:

tm_dots("n", size=0.1,col=Classification, shapeNA = NA, title = "Spaces")

添加几个 tm_dots() 层不是一种选择。我也无法重命名点图例,对此也有任何建议。

电流输出

谢谢你的帮助!

解决方案

为了将来参考,我添加officesbristolvia left_join,从而将Classification变量添加到SpatialPolygonsDataFrame. showNA = NA尽管有参数,但我在显示 NA 值时遇到了问题,但colorNA = NULL工作正常。最后一行: tm_dots(size=0.1,col="Classification", palette = "Set1", colorNA = NULL)

4

2 回答 2

2

bristol多边形形状(SpatialPolygonDataFrame或)也是如此sf,并且您想在某些多边形中绘制点?

通常,您将有一个变量Offices,具有两个级别"Informal""Commercial"。那么它只是tm_dots(size = 0.1, col = "Offices")。如果您想在一个多边形中放置两个点,因为有非正式和商业办公室,那么您可以使用您自己的方法(并使用xmod和/或ymod一组以防止重叠),或者创建一个包含所有办公室的SpatialPointsDataFramesf对象,以及Offices如上所述,具有两个级别的变量。

于 2018-01-14T17:52:24.547 回答
0

我想通了,你需要另一个 tm_shape() 才能工作。仍然没有让 title() 正确显示,而是一次一步。

tm_shape(bristol) + tm_fill("population", palette = "YlOrRd", auto.palette.mapping = TRUE, 
  title = "Bristol Population", 
  breaks = c(0,5,10,15,20,25), colorNA = "darkgrey") + tm_borders("grey25",alpha = 0.7, lwd = 0.1) +
  tm_dots("Informal_Offices", size=0.1,col="green", shapeNA = NA, title = "Informal Offices") + 
  tm_shape(bristol) + tm_dots("Commercial_Offices", size=0.1,col="white",shapeNA=NA, title="Commercial Offices") + 
  tm_legend(text.size=1,title.size=1.2,position=c("left","top")) + 
  tm_layout(legend.outside = TRUE, legend.outside.position = "bottom", title.snap.to.legend = TRUE)

结果

于 2018-01-12T13:01:09.830 回答