简体   繁体   English

小册子R中具有不同形状和颜色的自定义标记

[英]Custom markers with different shapes and colors in leaflet R

There are some examples to create custom markers in leaflet, but most of them are only for one variable . 有一些在传单中创建自定义标记的示例, 但大多数示例仅用于一个变量 However, there are lots of data with several factors, which is better to visualize with different shapes and colors. 但是,有很多数据具有多种因素,因此最好以不同的形状和颜色显示。

Here is the dummy data, how to polt markers with different shapes and colors? 这是虚拟数据,如何插入不同形状和颜色的标记?

lat1= 36+runif(n=5,min=-1,max=1)
lon1 =-115+runif(n=5,min=-1,max=1)

lat2= 35+runif(n=5,min=-0.5,max=0.5)
lon2 =-110+runif(n=5,min=-0.5,max=0.5)

lat3= 34+runif(n=5,min=-0.5,max=0.5)
lon3 =-112+runif(n=5,min=-0.5,max=0.5)

data_all=rbind(data.frame(Longitude=lon1,Latitude=lat1,Group=1),
           data.frame(Longitude=lon2,Latitude=lat2,Group=2),
           data.frame(Longitude=lon3,Latitude=lat3,Group=3))
data_all$color <- rep(c("red", "green", "gray"), 5)

Just a small note : according to the help page , "grey" is not a supported color, whereas "gray" is... so I changed it. 请注意:根据帮助页面 ,“灰色”不是受支持的颜色,而“灰色”是...,因此我进行了更改。

data_all$color <- rep(c("red", "green", "gray"), 5)

I used this page for help ; 我用这个页面来帮助; you can try the following method, using awesomeIcons , with icons and colors defined in the dataset (using the Bootstrap Glyphicons library ) 您可以使用awesomeIcons尝试以下方法,并在数据集中定义图标和颜色(使用Bootstrap Glyphicons库

# add icon label column
data_all <- data_all %>%
  mutate(icon = case_when(
    Group == 1 ~ "home",
    Group == 2 ~ "cog",
    Group == 3 ~ "camera"))

# create awesome icons
my_icons <- awesomeIcons(icon = data_all$icon,
                         markerColor = data_all$color,
                         library = "glyphicon")

# leaflet using AwesomeMarkers
data_all %>% 
  leaflet() %>% 
  addTiles() %>% 
  addAwesomeMarkers(lng = ~ Longitude, lat = ~ Latitude, icon = ~ my_icons[Group])

EDIT 编辑
if you want specific icons, my best option is to create your own list of icons, and associate it to your data (afaik, you can't direclty add color to the addMarkers arguments). 如果您想要特定的图标,最好的选择是创建自己的图标列表,并将其与数据关联(afaik,您不能直接在addMarkers参数中添加颜色)。

The following works, but it probably wouldn't perform well on a huge dataset (see the different comments in the code). 以下工作有效,但在庞大的数据集上可能效果不佳(请参见代码中的其他注释)。

# add "group_color" column as a factor variable : this will be associated to the icons' list
data_all2 <- data_all %>%
  mutate(Group = case_when(
    Group == 1 ~ "triangle",
    Group == 2 ~ "circle",
    Group == 3 ~ "square"),
    group_color = as.factor(paste(Group, color, sep = "_")))

# # Make a list of icons. We'll index into it based on name.
# /!\ order of icons MUST BE THE SAME as the order of the factor "group_color"
my_icons2 <- iconList(
  circle_gray <- makeIcon(iconUrl = "https://www.freeiconspng.com/uploads/black-circle-icon-23.png",
                          iconWidth = 18, iconHeight = 18),
  circle_green <- makeIcon(iconUrl = "https://www.freeiconspng.com/uploads/green-circle-icon-28.png",
                           iconWidth = 18, iconHeight = 18),
  circle_red <- makeIcon(iconUrl = "https://www.freeiconspng.com/uploads/red-circle-icon-1.png",
                         iconWidth = 18, iconHeight = 18),
  square_gray <- makeIcon(iconUrl = "https://www.freeiconspng.com/uploads/black-square-frame-23.png",
                          iconWidth = 18, iconHeight = 18),
  square_green <- makeIcon(iconUrl = "https://www.freeiconspng.com/uploads/green-square-1.png",
                             iconWidth = 18, iconHeight = 18),
  square_red <- makeIcon(iconUrl = "https://www.freeiconspng.com/uploads/red-square-png-14.png",
                         iconWidth = 18, iconHeight = 18),
  triangle_gray <- makeIcon(iconUrl = "https://www.freeiconspng.com/uploads/triangle-png-28.png",
                            iconWidth = 18, iconHeight = 18),
  triangle_green <- makeIcon(iconUrl = "https://www.freeiconspng.com/uploads/green-normal-triangle-png-8.png",
                             iconWidth = 18, iconHeight = 18),
  triangle_red <- makeIcon(iconUrl = "https://www.freeiconspng.com/uploads/red-triangle-png-20.png",
                           iconWidth = 18, iconHeight = 18)
)

# leaflet using addMArkers
data_all2 %>% 
  leaflet() %>% 
  addTiles() %>% 
  # for some reason, we have to use the 'as.numeric' version of the factor, I don't really know why
  addMarkers(lng = ~ Longitude, lat = ~ Latitude, icon = ~ my_icons2[as.numeric(group_color)], 
             popup = ~ paste0("Group = ", Group, "<br>Color = ", color))

Result : 结果:
colored_icons

EDIT2 EDIT2
A less cumbersome solution could to combine the second solution with addCircleMarkers : these are not colored icons, bu icons over different colors. 一个不太麻烦的解决方案可以将第二个解决方案与addCircleMarkers结合使用:这些不是彩色图标,而是不同颜色的图标。

my_icons2 <- iconList(
  circle <- makeIcon(iconUrl = "https://www.freeiconspng.com/uploads/black-circle-icon-23.png",
                          iconWidth = 18, iconHeight = 18),
  square <- makeIcon(iconUrl = "https://www.freeiconspng.com/uploads/black-square-frame-23.png",
                          iconWidth = 18, iconHeight = 18),
  triangle <- makeIcon(iconUrl = "https://www.freeiconspng.com/uploads/triangle-png-28.png",
                            iconWidth = 18, iconHeight = 18)
)

# using original data_all dataframe
# leaflet using addCirleMarkers and addMArkers
data_all %>% 
  leaflet() %>% 
  addTiles() %>% 
  # specific circle color according to the 'color' column
  addCircleMarkers(lng = ~ Longitude, lat = ~ Latitude, color = ~ color, fillColor = ~ color, opacity = 0.8, radius = 15, fillOpacity = 0.8) %>% 
  # specific icon shape according to the 'Group' column
  addMarkers(lng = ~ Longitude, lat = ~ Latitude, icon = ~ my_icons2[Group], 
             popup = ~ paste0("Group = ", Group, "<br>Color = ", color))

You should get something like this : not colored icons, but something understandable enough. 您应该得到这样的东西:不是彩色图标,而是足够容易理解的东西。 icons_over_colored_circles

Hope this helps. 希望这可以帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM