Как использовать изображение в качестве символа легенды? - PullRequest
1 голос
/ 20 апреля 2020

Я строю график рассеяния в ggplot с иконками, и я застрял с созданием легенды, используя значки.

В документации ggimage есть функция draw_key_image, но я не совсем понимаю, как использовать его или необходимые аргументы.

Документация гласит: «данные = фрейм данных из одной строки, содержащий масштабированную эстетику, отображаемую в этом ключе», но это мне совсем не помогает!

https://www.rdocumentation.org/packages/ggimage/versions/0.2.7/topics/draw_key

##Hopefully reproducible code with example data

##Icons downloaded from https://labs.mapbox.com/maki-icons/
library(ggplot2)
library(ggimage)
library(rsvg)

Activity<-"Walk"
x = -2
y = 2.5
icon<-".\\mapbox-maki-a6d16d4\\icons\\shoe-15.svg"
test_data<-data.frame( Activity, x, y, icon)

p_test<-ggplot(data = test_data,
          aes(x = x, 
              y = y))+
  geom_image(aes(image=icon), size=.03)
  p_test

Может, кто-нибудь поможет мне добавить легенду со значком и надписью "Прогулка"?

Большое спасибо, Джо

1 Ответ

0 голосов
/ 21 апреля 2020

Эта функция draw_key должна работать «под капотом». См. Документацию

У каждого геома есть связанная функция, которая нажимает клавишу aws, когда геом необходимо отобразить в легенде. Эти функции называются draw_key _ * (), где * обозначает имя соответствующего глифа ключа. Глифы ключей можно настроить для отдельных геомов, предоставив геому аргумент key_glyph (см. Layer () или примеры ниже.) это отношение.

https://github.com/GuangchuangYu/ggimage/issues/18 показывает, что в настоящее время поддерживаются только три типа символов легенды, и вы активируете их с изменением параметров (см. Код ниже). Можно также изменить основную функцию draw_key и вместо загрузки изображения R вы можете загрузить свое изображение. Это должен быть PNG, поэтому сначала вам нужно преобразовать его в PNG.

Вы можете найти исходный код, который я изменил здесь

Недостатком является то, что в настоящее время он принимает только одно изображение. Чтобы нанести несколько изображений на эстет c вашего геома, вы можете найти вдохновение в создании гроссмейстером Баптистом «минималистского» геома. { ссылка }

library(ggplot2)
library(ggimage)

Activity<-c("Walk1", "Walk2")
x = 1:2
y = 2:3

icon<-"https://raw.githubusercontent.com/mapbox/maki/a6d16d49a967b73d9379890a7b26712b12b8daef/icons/shoe-15.svg"
bitmap <- rsvg::rsvg(icon, height = 50)

png::writePNG(bitmap, "shoe.png", dpi = 144)

test_data<-data.frame( Activity, x, y, icon)

options(ggimage.keytype = "image")

ggplot(data = test_data, aes(x = x, y = y)) +
  geom_image(aes(image=icon, color = Activity), size=.03)

Значок изменился на R lo go:

Теперь давайте изменим функция draw_key_image. Вы также должны вызывать его с аргументом key_glyph в geom_image.


draw_key_image <- function (data, params, size) {
  kt <- getOption("ggimage.keytype")
if (kt == "image") {
    img <- magick::image_read("shoe.png")
    grobs <- lapply(seq_along(data$colour), function(i) {
      img <- ggimage:::color_image(img, data$colour[i], data$alpha[i])
      grid::rasterGrob(0.5, 0.5, image = img, width = 1, height = 1)
    })
    class(grobs) <- "gList"
    keyGrob <- ggplot2:::ggname("image_key", grid::gTree(children = grobs))
  }
  return(keyGrob)
}

ggplot(data = test_data, aes(x = x, y = y)) +
  geom_image(aes(image=icon, color = Activity), size=.03, 
             key_glyph = draw_key_image) # you need to add this argument

Создано в 2020-04-20 пакетом Представить (v0.3.0)

полезные темы: конвертировать SVG в PNG

...