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

时间:2019-03-04 07:22:13

标签: r leaflet marker

有一些在传单but most of them are only for one variable中创建自定义标记的示例。但是,有很多数据具有多种因素,因此最好以不同的形状和颜色显示。

这是虚拟数据,如何标注不同形状和颜色的标记?

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)

1 个答案:

答案 0 :(得分:1)

仅需注意一点:根据help page,“灰色”不是受支持的颜色,而“灰色”是...,所以我更改了它。

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

我用这个page寻求帮助;您可以使用awesomeIcons尝试以下方法,并在数据集中定义图标和颜色(使用Bootstrap Glyphicons library

# 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])

编辑
如果需要特定的图标,最好的选择是创建自己的图标列表,并将其与数据关联(afaik,您不能直接为addMarkers参数添加颜色)。

以下工作,但是在庞大的数据集上可能效果不佳(请参见代码中的不同注释)。

# 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))

结果:
colored_icons

EDIT2
不太麻烦的解决方案可以将第二个解决方案与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))

您应该得到这样的东西:不是彩色图标,而是足够容易理解的东西。 icons_over_colored_circles

希望这会有所帮助。