Буклет в R: Как создать несколько иконок - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть фрейм данных, который содержит список всех спортивных объектов в моем штате.

Вот список имен столбцов в моем фрейме данных (довольно понятный):

[1] "City"       "latitude"   "longitude"  "Rank"       "Population" "County"    
[7] "Desc"  

Я создал все значки ниже:

library(leaflet)
NHL <- makeIcon(
    iconUrl = "https://www-league.nhlstatic.com/images/logos/league-dark/133-flat.svg",
    iconWidth = 31*215/230,
    iconHeight = 31, 
    iconAnchorY = 16,
    iconAnchorX = 31*215/230/2)
MLB <- makeIcon(
    iconUrl = "https://www.mlbstatic.com/team-logos/league-on-dark/1.svg",
    iconWidth = 31*215/230,
    iconHeight = 31, 
    iconAnchorY = 16,
    iconAnchorX = 31*215/230/2)
MLS <-makeIcon(
    iconUrl = "https://league-mp7static.mlsdigital.net/styles/non-retina_desktop_logo/s3/logo25-77x77_0.png?LzMdhn2DU4GXKEjKfJ2QYWMaQKQIk7VQ&itok=ZtYZ58tI",
    iconWidth = 31*215/230,
    iconHeight = 31, 
    iconAnchorY = 16,
    iconAnchorX = 31*215/230/2)
NBA <-makeIcon(
    iconUrl = "https://seeklogo.net/wp-content/uploads/2014/09/NBA-logo.png",
    iconWidth = 31*215/230,
    iconHeight = 31, 
    iconAnchorY = 16,
    iconAnchorX = 31*215/230/2)
NFL <-makeIcon(
    iconUrl = "https://static.nfl.com/static/content/public/static/wildcat/assets/img/application-shell/shield/default.svg",
    iconWidth = 31*215/230,
    iconHeight = 31, 
    iconAnchorY = 16,
    iconAnchorX = 31*215/230/2)

I Я пытаюсь создать рекламный листок, который освещает каждое место спортивной команды в моем штате, показывая соответствующий значок. В приведенном ниже коде будет отображаться только один значок (в зависимости от того, что будет первым в списке значков)

df %>%
    leaflet() %>%
    addTiles() %>%
    addMarkers(lat = df$Latitude, lng = df$Longitude, icon = c(MLB, NHL, NFL, MLS, NBA))

Я также создал еще один фрейм данных (df2; ниже), который содержит каждое место (название стадиона) и соответствующая лига (NFL / NHL / et c), и я пытался передать это «icon = df2 $ League», но он не распознает его как объект. Есть идеи?

> colnames(df2)
[1] "Club"      "Sport"     "League"    "Symbol"    "Venue"     "City"      "Latitude" 
[8] "Longitude"

1 Ответ

1 голос
/ 30 апреля 2020

Вы не предоставили воспроизводимых данных, поэтому я составил несколько примеров данных, предполагая, что у вашего df есть столбец с именем лиги, который мы можем использовать для соответствия имени иконки:

library(leaflet)
library(sf)

# generate example data
set.seed(2020)
venues <- c('NHL', 'MLB', 'MLS', 'NBA', 'NFL')
nc <- st_read(system.file("shape/nc.shp", package="sf"))

df <- st_sample(nc, 5) %>%
  st_coordinates() %>%
  as.data.frame 
df$league <- venues

df

#>           X        Y league
#> 1 -78.58785 35.94350    NHL
#> 2 -80.82830 35.88732    MLB
#> 3 -78.83967 36.11236    MLS
#> 4 -80.09532 35.01562    NBA
#> 5 -83.72636 35.33204    NFL

Все, что нам нужно сделать, - это создать именованное iconList, где имя значка совпадает с именем в столбце «league» нашего информационного кадра. С помощью ~iconSet[league] мы можем убедиться, что для каждой точки в df используется правильный значок.

# create iconSet
iconSet <- iconList(NHL= NHL,
                    MLB =MLB, 
                    MLS = MLS,
                    NBA = NBA,
                    NFL = NFL)

# map
leaflet(df) %>%
  addTiles() %>%
  addMarkers(lng=~X, lat=~Y, icon = ~iconSet[league]) 

Leaflet iconList example

...