在 tmap 中制作剪影图标

Make silhouette icons in tmap

提问人:BEVAN 提问时间:11/10/2023 最后编辑:BEVAN 更新时间:11/19/2023 访问量:58

问:

赏金将于明天到期。这个问题的答案有资格获得 +50 声望赏金。BEVAN希望引起人们对这个问题的更多关注

我想将动物的剪影作为 tmap 中的图标,但是当我按照tmap_icons的要求将 svg 保存为 png 时,我要么得到白色背景,要么出现错误。这有效,但包括背景:

library(tmap)
library(sf)
library(magick)
library(tidyverse)


nc <-st_read(system.file("shape/nc.shp", package="sf"))%>% 
  mutate(ICON="SQUIRREL") 



    SQUIRREL <- image_read_svg("https://images.phylopic.org/images/2916f8fe-290a-423b-b6f7-fb975c30d518/vector.svg")

image_write(SQUIRREL,"SQUIRREL.png", flatten = T, density = 90 )



SQUIRREL_ICON<- tmap_icons("SQUIRREL.png")


tm_shape(nc)+
  tm_polygons()+
  tm_symbols(shapes = SQUIRREL_ICON, shape="ICON")

我使用magick软件包进行图像处理以删除或使背景透明的任何尝试都会导致“数组错误(if (d[3L] == 3L) rgb(t(x[, , 1L]), t(x[, , 2L]), t(x[, : 栅格数组必须正好有 3 或 4 个平面“,或者仍绘制背景

例子:

SQUIRREL_OUTLINE1 <- SQUIRREL %>%
  image_background(color=rgb(0, 0, 0, 0), flatten = T)


image_write(SQUIRREL_OUTLINE1,"SQUIRREL_OUTLINE1.png", flatten = T, density = 90)

SQUIRREL_ICON_OUTLINE1<- tmap_icons("SQUIRREL_OUTLINE1.png")


tm_shape(nc)+
  tm_polygons()+
  tm_symbols(shapes = SQUIRREL_ICON_OUTLINE1, shape="ICON")




SQUIRREL_OUTLINE2 <- SQUIRREL %>%
  image_trim()


image_write(SQUIRREL_OUTLINE2,"SQUIRREL_OUTLINE2.png", flatten = T, density = 90)

SQUIRREL_ICON_OUTLINE2<- tmap_icons("SQUIRREL_OUTLINE2.png")


tm_shape(nc)+
  tm_polygons()+
  tm_symbols(shapes = SQUIRREL_ICON_OUTLINE2, shape="ICON")

我可以测试图像处理是否可以工作,但似乎只是 alpha 值为 0,

SQUIRREL_OUTLINE_RED <- SQUIRREL %>%
  
  image_background(color="red", flatten = T)

image_write(SQUIRREL_OUTLINE_RED,"SQUIRREL_OUTLINE_RED.png", flatten = T, density = 90)

SQUIRREL_ICON_OUTLINE_RED<- tmap_icons("SQUIRREL_OUTLINE_RED.png")



tm_shape(nc)+
  tm_polygons()+
  tm_symbols(shapes = SQUIRREL_ICON_OUTLINE_RED, shape="ICON")



SQUIRREL_OUTLINE_RED_RGB05 <- SQUIRREL %>%
  
  image_background(color=rgb(1, 0, 0, 0.5), flatten = T)

image_write(SQUIRREL_OUTLINE_RED_RGB05,"SQUIRREL_OUTLINE_RED_RGB05.png", flatten = T, density = 90)

SQUIRREL_ICON_OUTLINE_RED_RGB05<- tmap_icons("SQUIRREL_OUTLINE_RED_RGB05.png")



tm_shape(nc)+
  tm_polygons()+
  tm_symbols(shapes = SQUIRREL_ICON_OUTLINE_RED_RGB05, shape="ICON")


SQUIRREL_OUTLINE_RED_RGB00 <- SQUIRREL %>%
  
  image_background(color=rgb(1, 0, 0, 0), flatten = T)

image_write(SQUIRREL_OUTLINE_RED_RGB00,"SQUIRREL_OUTLINE_RED_RGB00.png", flatten = T, density = 90)

SQUIRREL_ICON_OUTLINE_RED_RGB00<- tmap_icons("SQUIRREL_OUTLINE_RED_RGB00.png")



tm_shape(nc)+
  tm_polygons()+
  tm_symbols(shapes = SQUIRREL_ICON_OUTLINE_RED_RGB00, shape="ICON")
R imagemagick tmap

评论


答:

4赞 Andrew Gustar 11/19/2023 #1

你可以强制你的 png 文件有一个这样的 alpha 通道......

image_write(SQUIRREL, "SQUIRREL.png", 
            format = "png32",             #32-bit (4-channel) png
            flatten = FALSE,              #do not flatten 
            density = 90 )

SQUIRREL_ICON <- tmap_icons("SQUIRREL.png")

您还需要在 tmap 中抑制图标周围的方形边框。这对我有用......

tm_shape(nc) +
  tm_polygons() +
  tm_symbols(shapes = SQUIRREL_ICON, shape="ICON", border.lwd = 0)

enter image description here

评论

1赞 BEVAN 11/21/2023
这就像一个魅力。当我引入大小变量时,它们甚至可以适当地缩放。