提问人:BEVAN 提问时间:11/10/2023 最后编辑:BEVAN 更新时间:11/19/2023 访问量:58
在 tmap 中制作剪影图标
Make silhouette icons in tmap
问:
我想将动物的剪影作为 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")
答:
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)
评论
1赞
BEVAN
11/21/2023
这就像一个魅力。当我引入大小变量时,它们甚至可以适当地缩放。
下一个:对钟形曲线进行逆向工程
评论