传单 R 中具有不同形状和颜色的自定义标记 [英] Custom markers with different shapes and colors in leaflet R

查看:15
本文介绍了传单 R 中具有不同形状和颜色的自定义标记的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有一些示例可以在传单中创建自定义标记,

EDIT2
一个不太麻烦的解决方案可以将第二个解决方案与 addCircleMarkers 结合起来:这些不是彩色图标,而是不同颜色的图标.

my_icons2 <- iconList(圆圈 <- makeIcon(iconUrl = "https://www.freeiconspng.com/uploads/black-circle-icon-23.png",图标宽度 = 18,图标高度 = 18),正方形 <- makeIcon(iconUrl = "https://www.freeiconspng.com/uploads/black-square-frame-23.png",图标宽度 = 18,图标高度 = 18),三角形 <- makeIcon(iconUrl = "https://www.freeiconspng.com/uploads/triangle-png-28.png",图标宽度 = 18,图标高度 = 18))# 使用原始 data_all 数据框# 使用 addCirleMarkers 和 addMArkers 的传单数据_全部 %>%传单() %>%addTiles() %>%# 根据颜色"列的特定圆圈颜色addCircleMarkers(lng = ~ Longitude, lat = ~ Latitude, color = ~ color, fillColor = ~ color, opacity = 0.8, radius = 15, fillOpacity = 0.8) %>%# 根据组"列的特定图标形状addMarkers(lng = ~ Longitude, lat = ~ Latitude, icon = ~ my_icons2[Group],popup = ~ paste0("Group = ", Group, "<br>Color = ", color))

你应该得到这样的东西:不是彩色图标,而是一些足够容易理解的东西.

希望这会有所帮助.

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)

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

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 :

EDIT2
A less cumbersome solution could to combine the second solution with addCircleMarkers : these are not colored icons, bu icons over different colors.

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.

Hope this helps.

这篇关于传单 R 中具有不同形状和颜色的自定义标记的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆